sto facendo problema Project Euler 21 per compiti a casa e ho questa lista di comprensione:Perché le letture haskell degli elenchi non sono eseguite in parallelo?
amicableNumberSums = [ x+y | x<-[1..10000], y <-[1..10000], (amicable x y)]
Questo richiede un tempo molto lungo per l'esecuzione (comprensibile in quanto mette alla prova 10000^2 coppie di numeri) e guardando la mia cpu l'utilizzo mostra che viene utilizzato solo 1 core.
Poiché non ci sono effetti collaterali nella comprensione della lista, non vi è alcun pericolo in più coppie di numeri testati contemporaneamente. C'è un modo per far sì che Haskell lo faccia automaticamente o se no come potrebbe essere modificato il mio codice per farlo?
(Edit) Errore durante l'esecuzione di stampa (amicableNumberSums using
parList):
Couldn't match type `a0 -> Eval a0' with `[Int]'
Expected type: Strategy [Int]
Actual type: Strategy a0 -> Strategy [a0]
In the second argument of `using', namely `parList'
In the first argument of `print', namely
`(amicableNumberSums `using` parList)'
In the expression: print (amicableNumberSums `using` parList)
(Edit) Performance dei due metodi suggeriti:
Ørjan Johansen's method: 218.79s elapsed parallel (4 cores + 4 hyperthreading)
279.37s elapsed sequential (single core)
bheklilr's method: 247.82s elapsed parallel (4 cores + 4 hyperthreading)
274.10s elapsed sequential (single core)
Original method: 278.69s elapsed
Questo non è così grande velocità come Speravo ma ora ho la risposta corretta al problema e fino a quando non ho imparato un po 'di più Haskell questo è sufficiente.
Non ci sono effetti collaterali, ma la comprensione della lista richiede che i risultati siano in un ordine specifico, quindi parallelizzare il calcolo non è come banalmente semplice come puoi immaginare. – amalloy