non capisco perché questo programma utilizzando repa:Cosa c'è di sbagliato nell'uso di Identity monad con mmultP quando si usa repa?
import Data.Array.Repa
import Data.Array.Repa.Algorithms.Matrix
import Data.Functor.Identity
go = runIdentity $ do
let mat = fromListUnboxed (ix2 2 2) [1..4]
let ins = fromListUnboxed (ix2 2 1) [1, 1]
mmultP mat ins
mi sta dando il seguente avviso:
Data.Array.Repa: Performing nested parallel computation sequentially.
You've probably called the 'compute' or 'copy' function while another
instance was already running. This can happen if the second version
was suspended due to lazy evaluation. Use 'deepSeqArray' to ensure
that each array is fully evaluated before you 'compute' the next one.
Non ho calcoli nidificati, non ho chiamato compute
o copy
, e tutto che ho usato per fare il calcolo è all'interno della stessa monade. Ha qualcosa a che fare con la valutazione pigra? In tal caso, come faccio a eseguire il calcolo parallelo mentre utilizzo la monade Identity (per mantenere puro il calcolo generale)?
Per riferimento, la sostituzione di runIdentity
con runST
lo fa funzionare, anche se in entrambi i casi la funzionalità del monad specifica non viene utilizzata affatto.
Guardando all'interno del codice sorgente, vedo che 'mmultP' chiama' computeP', che chiama 'unsafePerformIO'. Non ne ho molta esperienza, ma potrebbe esserci un'incompatibilità tra 'unsafePerformIO' e la monade 'Identity' (forse il comportamento di' Identity' con la pigrizia)? – madjar
@madjar Non ne ho idea. Non vedo come. – rityzmon