Mein Ziel ist es, eine Berechnung mit parMap
aus der parallel package zu parallelisieren, aber ich möchte auch ein bisschen Zufälligkeit meiner Sampling-Funktion hinzufügen.Parallele Berechnungen mit schneller Zufälligkeit und Reinheit?
Ohne die Zufälligkeit meine Berechnung ist einfach einige Zahlen knirschen und so ist es rein und ich könnte parMap
verwenden. Um gute Ergebnisse zu erzielen, muss ich bei jedem Schritt mehrere Proben nehmen und die Ergebnisse mitteln. Die Stichprobe muss randomisiert werden.
Eine Lösung könnte sein, die random package zu verwenden, randoms
anrufen und dann diese Liste während der Berechnung zu konsumieren (indem Sie die reine faule Liste an die Berechnung übergeben, würde ich sie rein halten). Leider ist das ein sehr langsamer Zufallszahlengenerator und ich brauche viele Zufallszahlen, also würde ich lieber mwc-random oder mersenne-random verwenden (obwohl ich denke, mersenne-random wird immer noch beibehalten).
Ist es sicher, etwas wie unsafePerformIO
mit mwc-random zu verwenden, um eine Funktion wie randoms
zu schreiben? Etwas wie folgt aus:
randomsMWC :: Variate a => GenST s -> [a]
randomsMWC g = unsafePerformIO $ unsafeSTToIO $ randomsMWC' g
where
randomsMWC' g = do
a <- uniform g
as <- unsafeInterleaveST $ randomsMWC' g
return (a : as)
Muss ich stattdessen für eine parallel number generator erreichen? Oder muss ich in den sauren Apfel beißen und zugeben, dass mein Algorithmus einfach nicht rein ist, ohne das langsame Zufallspaket zu verwenden?
Vorschläge? Vielen Dank!
mersenne-random-pure64 beide schnell und ermöglicht es, mehrere Generatoren - Sie können also einen pro Thread haben. –
@DonStewart Mehrere Generatoren sind für parallele Haskell völlig nutzlos.Es gibt keine Möglichkeit, thread-spezifische Ressourcen aus parallelem Code zu verwenden, und das sollte nicht - es würde Nicht-Determinismus einführen. Das ist wirklich ein schwieriges Problem. – Carl
Carl - nicht so. Sie können Zufallsgene datenparallel duplizieren, um Konflikte auf einer gemeinsam genutzten Ressource zu vermeiden. Denken Sie zum Beispiel an eine baumstrukturierte Reduktion. –