2013-04-12 17 views
11

Sto cercando un modo per eseguire due calcoli in parallelo nella ST-Monad. Sto costruendo un array piuttosto grande (usando STUArray) e mi piacerebbe farlo in parallelo.Una mappa monad parallela in Haskell? Qualcosa come parMapM?

Finora ho trovato this e this Q & Una qui su StackOverflow, tuttavia il primo non si applica nel mio caso, come si tratta di codice puro solo e la seconda riguarda la monade IO - ma sono in una discussione di stato.

Ho anche trovato il pacchetto monad-parallel, ma mi richiede di avere un'istanza di 'MonadParallel' per ST. Anche il pacchetto monad-par supporta solo calcoli puri o la monade IO.

C'è un modo per eseguire un calcolo monadico parallelo all'interno di ST?

+1

Costruire una grande matrice in parallelo suona come qualcosa di meglio fatto in puro codice piuttosto che ST. Non credo che potresti dare qualche informazione in più su cosa vuoi mettere in ogni cella e perché vuoi usare ST? Potrebbero esserci dei problemi, ad esempio se si eseguono azioni separate nella monade ST per ogni cella, allora questo non può davvero essere reso parallelo facilmente come (a differenza di IO) ST in realtà non fornisce le primitive per la comunicazione tra i thread. – DarkOtter

risposta

7

Prima di tutto, solo due parole fuori dalla tua domanda: parallele e array - Devo raccomandarti di dare un'occhiata a repa. Dovresti anche dare un'occhiata allo Data Parallel Haskell, in quanto promette di essere il prossimo enorme traguardo sulla strada di Haskell e ci sono some great people involved con questo progetto.

Per quanto riguarda la tua domanda specifica, ci sono le librerie in grado di fare esattamente quello che chiedi, solo con un IO Monade, il già nominato monad-parallel e async with mapConcurrently. Hai preso in considerazione l'utilizzo di stToIO per l'escape in IO?

C'è anche una biblioteca lifted-async, che espande la versione standard per lavorare con MonadBaseControl, che ha un'istanza di ST, quindi probabilmente è possibile utilizzare la sua versione di mapConcurrently o almeno usarlo come fonte di ispirazione per implementare il proprio.

3

Non sono sicuro che sia possibile parallelizzare in modo sicuro una monade ST o se anche ciò avrebbe senso, poiché di solito un calcolo in una monade di stato dipende dallo stato, che è il risultato di calcoli precedenti.

Ciò che si potrebbe fare, tuttavia, sarebbe di creare l'array da un elenco e la creazione di elenchi viene fatta facilmente in parallelo, ad es. da qualcosa come parMap dal pacchetto parallel.

Fornirci ulteriori dettagli su come creare i dati dell'array potrebbe aiutare a fornire una risposta migliore.

+0

Si può certamente parallelizzare, basta affidarsi al programmatore per gestire il non-determinismo stesso –