Riepilogo:
Non penso che molte persone possano rispondere alla tua domanda perché ci sono alcuni ostacoli piuttosto grandi che ci sono. Consiglierei di studiare la Programmazione Funzionale in generale e Scala in particolare per comprendere a fondo i tipi di scoperte che sono strongmente correlate a ciò che sembra desiderare.
Dettagli:
Per riassumere brevemente la tua domanda, penso che potresti chiederti:
Please tell me about a personal experience I have had where I worked
on a problem using traditional single-threaded assumptions where I
know that I would experience an improvement with a "magically parallelizing" compiler.
Penso che la sfida sia costituita dalle ipotesi (molte) necessarie per passare da una base di codice a thread singolo presunta esistente alla comprensione di tutte le diverse, complesse e difficili complessità che sono presenti per prendere lo stesso programma e parallelizzarlo accuratamente tramite un compilatore . Questo è un salto non banale, che quasi nessuno può realisticamente realizzare senza aver fatto entrambi i tipi di implementazione.
Detto questo, penso che ci siano alcune pratiche di ingegneria del software che potrebbero aiutarti ad avvicinarti a ciò che potresti cercare. E quello che sento che cercherete è di dedicare il minor tempo possibile a ridisegnare il codice presunto a thread singolo in qualcosa che possa essere facilmente parallelizzato. E questo richiede che tu diventi consapevole di diversi domini di lavoro che lo supporteranno.
- Devi scegliere un linguaggio che supporti naturalmente la nozione di codice parallelo.
- Il linguaggio deve disporre anche di librerie per le quali la semplice conversione del codice a thread singolo per poter essere multi-thread è una semplice ridenominazione di classe / metodo / funzione.
- È necessario assicurarsi che la lingua DEFAULT supporti l'immutabilità e quindi esercitare con fermezza l'immutabilità all'interno di tutti i progetti software presunti a thread singolo.
Se segui tutte e tre queste pratiche, scoprirai la complessità dello spostamento tra codice assunto a thread singolo e parallelamente sarà ridotto drasticamente. In assenza di una qualsiasi delle tre pratiche sopra riportate, troverete gli ostacoli a passare da un singolo thread a un multi-thread per essere così complessi da non valere gli ordini di grandezza dello sforzo extra richiesto. Ed è anche meno probabile che un compilatore possa essere scritto per fare salti detti.
E sto parlando per esperienza personale. Ho iniziato un progetto Java nel 2000 sulla base dello stesso ragionamento che hai usato sopra. Era un sistema di calcolo distribuito ANN / GA (Artificial Neural Network / Genetic Algorithm) per tentare di creare un AI (gioco). Essere una vera sfida, ho iniziato con Checkers per assicurarmi che il mio sistema funzionasse. Per ogni ora di utile lavoro "single-threaded" che ho fatto, ho trascorso altre 99 ore (senza esagerare) su tangenti tecniche non correlate all'obiettivo principale. Alla fine ho ottenuto il mio intero sistema lavorando su 10 nodi. Tuttavia, dopo aver trascorso quasi 2000 ore di lavoro su di esso, ero completamente bruciato nel tentativo di realizzare l'implementazione Go.
Da allora sono tornato a sedermi e sono rimasto molto interessato a come potrei essere in grado di rifare le 2000 ore di lavoro e ridurlo a qualcosa nell'ordine di 20-50 ore. Alla fine ho deciso di inventare la mia lingua e le mie librerie per vedere se potevo risolverlo più velocemente in quel modo. Parli di un enorme tangente tecnico, eh? :)
Subito dopo aver iniziato a generare il mio elenco di requisiti desiderabili nel 2010 / Dic, un mio amico mi ha chiesto perché stavo facendo tutto quel lavoro. E poi ha suggerito di dare un'occhiata a Clojure e Scala. Ho letto velocemente Clojure e non mi è piaciuto quanto rumoroso / boilerplate-ish provenga da Java. Poi leggo su Scala. E non potevo credere che avesse oltre il 60% dei tipi di funzionalità che volevo io stesso. Ho quindi acquistato il nuovo "Programmazione in Scala, 2a edizione" e completamente letto la versione e-reader prima di preso la copia fisica.
Ho passato tutto il tempo tra allora e ora a lavorare duramente per arricchire Scala, Programmazione Funzionale e pensare esclusivamente in termini di immutabilità. È stato piuttosto impegnativo per i miei decenni di esperienza OO. Tuttavia, penso di aver finalmente girato l'angolo su un paio delle principali sfide ... finalmente!
Userò Scala (e Akka, Play e Scala-IDE) e ricreerò completamente il mio sistema AI in modo da poter continuare il mio obiettivo Go? Ci sto giocando adesso. Ho ancora così tanto da imparare e molta più sicurezza da ottenere prima di poter codificare il più velocemente in Scala e le sue librerie come posso con le sue librerie in Java.
Ad ogni modo, sembrava che tu volessi una storia personale da cui trarre le tue conclusioni sulla possibile redditività di un compilatore "a codice singolo ipotizzato basato su un parallelismo automatico". Speriamo che questo ci abbia aiutato.