Sto cercando di capire il motivo per cui abbiamo bisogno di tutte le parti del codice campione standard:Perché abbiamo bisogno di "seq" o "pseq" con "par" in Haskell?
a `par` b `pseq` a+b
Perché non sarà il seguente essere sufficiente?
a `par` b `par` a+b
L'espressione di cui sopra sembra molto descrittivo: Prova di valutare sia a
e b
in parallelo, e restituire il risultato a+b
. La ragione è solo quella dell'efficienza: la seconda versione si innescherebbe due volte anziché una volta?
E la seguente, versione più succinta?
a `par` a+b
Perché avremmo bisogno di assicurarsi b
viene valutata prima a+b
come nel codice originale, di serie?
Questo è corretto e spiega anche perché 'seq' non è sufficiente per questo problema. 'seq' non fornisce garanzie sull'ordinazione della valutazione. In 'seq b (a + b)', il thread principale può valutare 'a' prima di' b' fintanto che 'b' è in WHNF quando' (a + b) 'viene valutato. –
Non vedo come questo argomento descriva il problema con 'par a (par b (a + b))' - sicuro, o 'a' o' b' sarà immediatamente valutato, e la scintilla corrispondente si spegnerà, ma l'altra scintilla dovrebbe essere molto viva, producendo parallelismo. Ovviamente, creare una scintilla quindi non potrebbe essere il modo più efficace per farlo, ma funziona e lascia la domanda dell'ordine di valutazione al compilatore. – gereeter
Nel caso di 'par a (a + b)', è ancora possibile ottenere una parallelizzazione "fortunata", se il runtime sceglie invece 'b' prima. Quindi la scintilla 'a' non verrà fiaccata. Questo è menzionato nel PDF: community.haskell.org/~simonmar/papers/threadscope.pdf (pagina 2) – CMCDragonkai