46 votes

Quel modèle de programmation parallèle recommandez-vous aujourd'hui pour tirer parti des processeurs multicœurs de demain?

Si vous avez écrit une nouvelle application à partir de zéro aujourd'hui, et je voulais que ça à l'échelle de tous les coeurs que vous pouvez jeter à elle demain, ce modèle de programmation parallèle/système/langue/bibliothèque choisiriez-vous? Pourquoi?

Je suis particulièrement intéressé par les réponses le long de ces axes:

  1. La productivité du programmeur / facilité d'utilisation (peut mortels réussi à l'utiliser?)
  2. Domaine d'application cible (quels problèmes est-il (pas) bon?)
  3. La simultanéité de style (prend-il en charge les tâches, les pipelines, le parallélisme de données, de messages...?)
  4. La maintenabilité / l'épreuve de l'avenir (personne encore l'utiliser dans 20 ans?)
  5. Performance (comment ça balance sur ce genre de matériel?)

Je suis volontairement vague sur la nature de la demande en prévision de l'obtention de bonnes réponses générales utiles pour une variété d'applications.

27voto

emk Points 27772

Multi-programmation de base peut exiger plus d'un paradigme. Certains concurrents sont:

  1. MapReduce. Cela fonctionne bien où un problème peut être facilement décomposé en parallèle morceaux.
  2. Imbriquée Parallélisme De Données. Ceci est similaire à MapReduce, mais prend en charge les récursive de la décomposition d'un problème, même lorsque le récursive les morceaux sont de taille irrégulière. Recherchez NPD pour être une grande victoire purement fonctionnelle des langues en cours d'exécution sur massivement parallèles, mais limitée sur le matériel (comme les processeurs graphiques (Gpu).
  3. Logiciel De La Mémoire Transactionnelle. Si vous avez besoin d'traditionnel fils, STM rend supportable. Vous payez 50% de gain de performance dans les sections critiques, mais vous pouvez l'échelle de complexe de verrouillage des régimes à 100s de processeurs sans douleur. Ce ne sera pas, cependant, le travail sur les systèmes distribués.
  4. En parallèle de l'objet de discussions avec la messagerie. - Ce vraiment intelligent de modèle est utilisé par Erlang. Chaque "objet" devient un thread léger, et les objets communiquent par messages asynchrones et le pattern matching. C'est fondamentalement vrai parallèle OO. Cela a bien réussi dans plusieurs applications du monde réel, et il fonctionne très bien pour peu fiable des systèmes distribués.

Certains de ces paradigmes de vous donner un maximum de performance, mais ne fonctionne que si le problème se décompose proprement. D'autres sacrifice de performances, mais de permettre une plus grande variété d'algorithmes. Je soupçonne que certains combinaison de ceux-ci sera finalement devenu un outil standard.

14voto

Jörg W Mittag Points 153275

Deux solutions que j'aime vraiment sont join calcul (JoCaml, Polyphonique, C#, Cw) et le modèle de l'acteur (Erlang, Scala, E, Io).

Je ne suis pas particulièrement impressionné par le Logiciel de la Mémoire Transactionnelle. Il se sent juste comme elle est uniquement là pour permettre les discussions à s'accrocher à la vie un peu plus longtemps, même s'ils sont morts il y a des décennies. Cependant, il a trois avantages majeurs:

  1. Les gens à comprendre les transactions dans les bases de données
  2. Il est déjà question de transactionnelles RAM matériel
  3. Autant que nous le souhaitons tous là, les threads sont probablement va être la dominante de la simultanéité de modèle pour les deux prochaines décennies, triste que cela puisse être. STM pourrait réduire considérablement la douleur.

11voto

Daniel Papasian Points 10206

Le mapreduce/hadoop paradigme est utile et pertinente. Surtout pour les gens qui sont habitués à des langages comme perl, l'idée de la cartographie sur un tableau et fait un peu d'action sur chaque élément devrait venir assez fluide et naturelle, et mapreduce/hadoop juste s'en prend à l'étape suivante, et dit qu'il n'y a pas de raison que chaque élément de la matrice doivent être traitées sur la même machine.

Dans un sens, c'est plus de bataille testés, parce que Google est à l'aide de mapreduce, et beaucoup de gens ont été en utilisant hadoop, et a montré qu'il fonctionne bien pour la mise à l'échelle des applications sur plusieurs machines sur le réseau. Et si vous pouvez l'échelle de plusieurs machines à travers le réseau, vous pouvez l'échelle de plusieurs cœurs dans une seule machine.

10voto

aku Points 54867

Pour .NET application-je choisir ".NET Extensions Parallèles (PLINQ)" il est extrêmement facile à utiliser, et me permet de paralléliser le code existant dans les minutes.

  1. Il est simple à apprendre
  2. Utilisé pour effectuer des opérations complexes sur des grands tableaux d'objets, donc je ne peux pas commenter sur d'autres applications
  3. Prend en charge les tâches et les piplines
  4. Doit être pris en charge pour les prochaines années, mais qui le sait vraiment?
  5. Version CTP a quelques problèmes de performance, mais déjà très prometteur.

Mono seront probablement obtenir un soutien pour PLINQ, de sorte qu'il pourrait être une solution multi-plateforme.

6voto

Thomas Points 63635

Pour les calculs lourds et analogues, des langages purement fonctionnels comme Haskell sont facilement parallélisables sans aucun effort du programmeur. En dehors d'apprendre Haskell, c'est.

Cependant, je ne pense pas que ce soit la voie du futur (proche), tout simplement parce que trop de programmeurs sont trop habitués au paradigme de la programmation impérative.

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