2010-06-10 9 views
58

Ich habe gehört, dass in Haskell, Erstellen einer Multithread-Anwendung ist so einfach wie eine Standard-Haskell-Anwendung und kompilieren sie mit dem -threaded Flag. Andere Fälle haben jedoch die Verwendung eines Befehls par innerhalb des tatsächlichen Quellcodes beschrieben.Wie schwierig ist Haskell Multithreading?

Wie ist der Zustand von Haskell Multithreading? Wie einfach ist es, in Programme einzuführen? Gibt es ein gutes Multithreading-Tutorial, das diese verschiedenen Befehle und ihre Verwendung behandelt?

+0

Ich glaube * Parallele und gleichzeitige Programmierung in Haskell * von Simon Marlow wird allgemein als die beste Einführung in dieses Thema angesehen. –

Antwort

61

Was ist der Stand der Haskell Multithreading?

Ausgereift. Die Implementierung ist ungefähr 15 Jahre alt, mit Transaktionsspeicher für 5 Jahre. GHC ist ein weit verbreiteter Compiler mit großer Open-Source-Unterstützung und kommerzieller Unterstützung.

Wie einfach ist es, in Programme einzuführen?

Dies hängt vom Algorithmus ab. Manchmal kann es eine einzeilige Verwendung von par sein, um Parallelität zu erhalten. Manchmal müssen neue Algorithmen entwickelt werden. Im Allgemeinen wird es einfacher sein, in Haskell eine sichere Parallelität und Gleichzeitigkeit einzuführen als in typischen Sprachen, und die Leistung ist gut.

Gibt es ein gutes Multithreading-Tutorial, das diese verschiedenen Befehle und ihre Verwendung behandelt?

In Haskell gibt es 3 parallele und parallele Programmiermodelle.

  • implizite Parallelität über par
  • explizite Parallelität und Parallelität über forkIO/MVar und Transaktionssoftware Speicher
  • Datenparallelität über die DPH-Bibliotheken

Dies sind die wichtigsten Dinge. In allen Fällen kompilieren Sie mit threaded, um die Multicore-Laufzeit zu verwenden, aber wie einfach es ist, ein bestimmtes Problem zu parallelisieren, hängt von dem verwendeten Algorithmus und dem parallelen Programmiermodell ab, das Sie aus dieser Liste übernehmen.

Hier ist an introduction to the main parallel programming models in Haskell, und wie man Beschleunigungen erreicht.

Ich denke, Chapter 24 of Real World Haskell ist ein gutes Tutorial.

16

Es gibt auch einen Nebenbedingungsterm.

, ohne Änderungen im Code Ihre Haskell rts werden versuchen, sie für einigen internen Prozess zu verwenden, aber in Ihrer Anwendung zu verwenden, sollten Sie einen Hinweis geben, die von par b (f a b) getan, die Haskell zwingt nicht so faul zu sein auf caculation von b sogar wenn f es nicht für das Ergebnis benötigt.

Einer der Gründe, dies nicht für jede Funktion zu tun, die alle ihre Argumente benötigt (wie a+b) ist, dass die Synchronisation (Terminierung Berechnungen und Warten auf Ergebnisse) gibt einige Overhead und Sie wahrscheinlich nicht extra ausgeben wollen Ticks für (2*3)+(3*4), nur weil Sie Multiplikationen parallel berechnen können. Und Sie werden wahrscheinlich einige Cache-Hits oder etwas Ähnliches oder Optimierungen verlieren, wenn Sie dies auf einem einzelnen Prozessor tun (d. H. Sie müssen das Ergebnis ohnehin von einem Prozessor zum anderen weitergeben).

Natürlich Code, der par verwendet, ist hässlich und wenn Sie Liste oder einige andere Datenstrukturen mit leichten Unterelementen falten, werden Sie wahrscheinlich einige Brocken dieser hellen Elemente berechnen wollen, um sicherzustellen, dass overhead/calc sein wird wirklich klein. Um das zu beheben, können Sie parallel betrachten.

Es gibt auch Data Parallel Haskell (DPH).

Wenn Ihr Programm mehr über IO Monade ist, als Sie definitiv viele Änderungen benötigen. Siehe forkIO, Software Transactional Memory (STM) und viele andere aus Concurrency category