2013-04-12 4 views
11

Ich suche nach einer Möglichkeit, zwei Berechnungen parallel in der ST-Monad auszuführen. Ich baue ein ziemlich großes Array (mit STUArray) und ich würde es gerne parallel machen.Eine parallele Monad Karte in Haskell? So etwas wie parMapM?

Bisher habe ich gefunden this und this Q & A hier auf Stackoverflow, aber die erste in meinem Fall nicht anwendbar, da es mit reinem Code befasst sich nur und die zweite befasst sich mit der IO Monade - aber ich bin in ein Status-Thread

Ich habe auch das monad-parallel Paket gefunden, aber es erfordert, dass ich eine Instanz von 'MonadParallel' für ST habe. Auch das monad-par Paket unterstützt nur reine Berechnungen oder die IO-Monade.

Gibt es eine Möglichkeit, eine parallele monadische Berechnung in ST durchzuführen?

+1

Der Aufbau eines großen Arrays parallel klingt wie etwas, das am besten in reinem Code statt ST getan wird. Ich nehme nicht an, dass Sie ein wenig mehr Informationen darüber geben könnten, was Sie in jede Zelle setzen möchten und warum Sie ST verwenden möchten. Es könnte Probleme geben, zum Beispiel, wenn Sie separate Aktionen in der ST-Monade für jede Zelle ausführen, dann kann dies wirklich nicht wirklich einfach parallel gemacht werden, da ST (anders als IO) keine Primitiven für die Kommunikation zwischen Threads bereitstellt. – DarkOtter

Antwort

7

Zuerst von nur zwei Wörter aus Ihrer Frage: parallel und Array - ich muss Ihnen empfehlen, einen Blick auf repa zu werfen. Auch sollten Sie sich Data Parallel Haskell ansehen, da es verspricht, ein nächster großer Meilenstein auf der Haskell's Road zu sein und es gibt some great people involved mit diesem Projekt.

Bezüglich Ihrer Frage, gibt es Bibliotheken der Lage, genau zu tun, was man sich wünschen, nur mit einem IO Monade, die bereits monad-parallel und async with mapConcurrently benannt. Haben Sie darüber nachgedacht, in IO zu wechseln?

Es gibt auch eine lifted-async Bibliothek, die die Standardversion mit MonadBaseControl arbeiten erweitert, die eine Instanz von ST hat, so kann man wohl seine Version von mapConcurrently oder zumindest verwenden Sie es als Inspiration nutzen, um Ihre eigenen zu implementieren.

3

Ich bin mir nicht sicher, ob Sie eine ST-Monade sicher parallelisieren können oder ob das sogar sinnvoll wäre, da eine Berechnung in einer Zustands-Monade normalerweise vom Zustand abhängt, der das Ergebnis vorheriger Berechnungen ist.

Was Sie jedoch tun könnten, wäre, das Array aus einer Liste zu erstellen, und Listenerstellung wird leicht parallel gemacht, z. von etwas wie parMap aus dem parallel Paket.

Wenn Sie uns weitere Informationen zum Erstellen der Array-Daten geben, erhalten Sie möglicherweise eine bessere Antwort.

+0

Sie können es natürlich parallelisieren, Sie verlassen sich einfach auf den Programmierer, um den Nicht-Determinismus selbst zu handhaben –