62 votes

Le multithreading en Haskell est-il difficile ?

J'ai entendu dire qu'en Haskell, la création d'une application multithread est aussi simple que de prendre une application Haskell standard et de la compiler avec la commande -threaded drapeau. D'autres cas, cependant, ont décrit l'utilisation d'un par dans le code source actuel.

Où en est le multithreading en Haskell ? Est-il facile de l'introduire dans les programmes ? Existe-t-il un bon tutoriel sur le multithreading qui passe en revue les différentes commandes et leurs utilisations ?

66voto

Don Stewart Points 94361

Quelle est la situation du multithreading en Haskell ?

Mature. L'implémentation a environ 15 ans, avec la mémoire transactionnelle depuis 5 ans. GHC est un compilateur largement utilisé, avec un large support open source et un soutien commercial.

Est-il facile de l'introduire dans les programmes ?

Cela dépend de l'algorithme. Parfois, il peut s'agir d'une utilisation en une ligne de par pour gagner en parallélisme. Parfois, de nouveaux algorithmes doivent être développés. En général, il est plus facile d'introduire un parallélisme et une concurrence sûrs en Haskell, que dans les langages habituels, et les performances sont bonnes.

Existe-t-il un bon tutoriel sur le multithreading qui passe en revue ces différentes commandes et leurs utilisations ?

Il existe 3 grands modèles de programmation parallèle et concurrente en Haskell.

  • parallélisme implicite via par
  • concurrence et parallélisme explicites via forkIO / MVars et mémoire transactionnelle logicielle
  • parallélisme des données via les bibliothèques DPH

Ce sont les éléments principaux. Dans tous les cas, vous compilez avec -threaded pour utiliser le runtime multicore, mais la facilité avec laquelle vous pouvez 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 dans cette liste.

Voici une introduction aux principaux modèles de programmation parallèle en Haskell, et comment obtenir des gains de vitesse.

Je pense Chapitre 24 de Real World Haskell est un bon tutoriel.

18voto

ony Points 3863

Il existe également un terme de concurrence.

Sans aucun changement dans le code, votre rts haskell essaiera de les utiliser pour un processus interne, mais pour les utiliser dans votre application, vous devez donner un indice qui est fait par par b (f a b) ce qui oblige Haskell à ne pas être aussi paresseux sur la caculation de b même si f ne l'exigera pas pour le résultat.

Une des raisons de ne pas le faire pour toutes les fonctions qui requièrent tous leurs arguments (comme la fonction a+b ), c'est que la synchronisation (ordonnancement des calculs et attente des résultats) entraîne une certaine surcharge et que vous ne souhaitez probablement pas dépenser des battements supplémentaires pour (2*3)+(3*4) juste parce que vous pouvez calculer des multiplications en parallèle. Et vous perdrez probablement quelques cache-hits ou quelque chose comme ça ou des optimisations qui sont faites lorsque vous faites cela sur un seul processeur (c'est-à-dire que vous aurez besoin de passer le résultat d'un processeur à l'autre de toute façon).

Bien sûr, le code qui utilise par est laid et lorsque vous pliez une liste ou d'autres structures de données avec des sous-éléments légers, vous voudrez probablement calculer certains morceaux de ces éléments légers pour vous assurer que l'overhead/calc sera vraiment petit. Pour résoudre ce problème, vous pouvez regarder parallèle .

Il existe également le Data Parallel Haskell (DPH).

Si votre programme est davantage axé sur les monades IO, vous devrez certainement procéder à de nombreux changements. Voir forkIO , Mémoire transactionnelle logicielle (STM) et beaucoup d'autres de Catégorie de concordance

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X