My question is 1) is this true
No, questo è completo e senza senso.
La parallelizzazione automatica del codice che non è stata scritta in modo esplicito per essere parallela è stata (uno dei) sacri graal degli ottimizzatori per decenni, ma non funziona ancora per i casi più banali. Anche solo capire se un pezzo di codice ha effetti collaterali affatto , in modo da sapere se parallelizzare è addirittura legale, nel caso generale equivale a risolvere il problema di interruzione.
In lingue come Haskell, dove tutto è banalmente privo di effetti collaterali per definizione , esiste il problema opposto. C'è un così tanto parallelismo potenziale, che abbiamo bisogno di restringere e, ancora, non abbiamo capito come farlo.
Ora, la parallelizzazione automatica del codice che conosce viene automaticamente parallelizzata, che è uno scenario completamente diverso.
Nel linguaggio di programmazione strongzza, esiste un costrutto che sembra come un ciclo for
, ma in realtà è un generatore parallelo. Le specifiche del linguaggio dicono che i cicli for
vengono eseguiti in parallelo, quindi i programmatori Fortress prendono specificamente in considerazione questo quando scrivono i loro for
loops.
Nella libreria standard di Scala, ci sono molte raccolte parallele. Queste sono raccolte che hanno il loro foreach
, map
, flatMap
, withFilter
, span
, ecc. Metodi implementati per usare il parallelismo. Di nuovo, se usi una raccolta parallela, conosci che il tuo map
verrà eseguito in parallelo.
Il tuo esempio sarà simile a questo:
(1 to 100000000).par foreach doComplexCalculationWithNoSideEffects
[Nota: ho commesso l'errore di testare questo fatto. La buona notizia è: funziona come previsto. Le cattive notizie sono: avrei dovuto rendere la gamma più piccola per i test, è ancora in esecuzione 10 minuti dopo :-D]
Nota la chiamata al metodo par
sull'oggetto Range
, che restituisce un scala.collection.parallel.immutable.ParRange
.
Nella Libreria parallela delle attività .NET, esiste un metodo chiamato Parallel.For
che potresti usare (non testato):
Parallel.For(1, 100000000, doComplexCalculationWithNoSideEffects);
In Java, sarebbe simile a questa (non testata):
LongStream.range(1, 100000000).parallel().forEach(YourClass::doComplexCalculationWithNoSideEffects);
Molti altri linguaggi hanno anche librerie simili disponibili per il calcolo parallelo.