J'ai entendu dire que dans Haskell, la création d'une application multithread est aussi simple que de prendre une application Haskell standard et de la compiler avec le -threaded
drapeau. Cependant, d'autres cas ont décrit l'utilisation d'une commande par
dans le code source réel.
Quel est l'état du multi-threading Haskell? Est-il facile à introduire dans les programmes? Existe-t-il un bon tutoriel multi-threading qui passe en revue ces différentes commandes et leurs utilisations?
Quel est l'état du multi-threading Haskell?
Mature. L'implémentation a environ 15 ans, avec une mémoire transactionnelle de 5 ans. GHC est un compilateur largement utilisé, avec un large support open source et un support commercial.
Est-il facile à introduire dans les programmes?
Cela dépend de l'algorithme. Parfois, il peut s'agir d'une utilisation d'une ligne de par
pour obtenir le parallélisme. Parfois, de nouveaux algorithmes doivent être développés. En général, il sera plus facile d'introduire un parallélisme et une concurrence sécurisés dans Haskell, que dans les langages typiques, et les performances sont bonnes.
Existe-t-il un bon tutoriel multi-threading qui passe en revue ces différentes commandes et leurs utilisations?
Il existe 3 principaux modèles de programmation parallèle et simultanée dans Haskell.
par
Ce sont les choses principales. Dans tous les cas, vous compilez avec -threaded pour utiliser le runtime multicœur, mais la facilité avec laquelle il est possible de paralléliser un problème particulier dépend de l'algorithme que vous utilisez et du modèle de programmation parallèle que vous adoptez à partir de cette liste.
Voici ne introduction aux principaux modèles de programmation parallèle dans Haskell, et comment réaliser des accélérations.
Je pense que Chapitre 24 de Real World Haskell est un bon tutoriel.
Il existe également un terme de concurrence.
Sans aucun changement de code, vos rts haskell essaieront de les utiliser pour certains processus internes, mais pour les utiliser dans votre application, vous devriez donner un indice qui est fait par par b (f a b)
ce qui force Haskell à ne pas être si paresseux lors de la caculation de b
même si f
ne l'exige pas pour le résultat.
L'une des raisons de ne pas le faire pour chaque fonction qui requiert tous ses arguments (comme a+b
) est que la synchronisation (ordonnancement des calculs et attente des résultats) entraîne des frais généraux et vous ne voudrez probablement pas dépenser plus pour (2*3)+(3*4)
simplement parce que vous pouvez calculer des multiplications en parallèle. Et vous perdrez probablement des hits de cache ou quelque chose comme ça ou des optimisations qui sont faites lorsque vous faites cela sur un seul processeur (c'est-à-dire que vous devrez de toute façon transmettre le résultat d'un processeur à un autre).
Bien sûr, le code qui utilise par
est moche et lorsque vous pliez la liste ou d'autres structures de données avec des sous-éléments légers, vous voudrez probablement calculer quelques morceaux de ces éléments légers pour vous assurer que les frais généraux/calcul seront être vraiment petit. Pour résoudre ce problème, vous pouvez regarder parallèle .
Il existe également Data Parallel Haskell (DPH).
Si votre programme est plus sur IO monad que vous avez certainement besoin de nombreuses modifications. Voir forkIO
, Software Transactional Memory (STM) et bien d'autres de catégorie d'accès concurrentiel