2010-05-21 4 views
10

Je suis nouveau sur la plate-forme .Net. Je l'ai fait une recherche et a trouvé qu'il ya plusieurs façons de le faire dans le calcul parallèle .Net:Technologies parallèles disponibles en .Net

  1. tâche parallèle dans la bibliothèque parallèle de tâches, qui est .Net 3.5.

  2. PLINQ, .Net 4.0

  3. Programmation Asynchounous, .Net 2.0, (async est principalement utilisé pour effectuer des tâches lourdes E/S, F # a une syntaxe concise supportant ce sujet). Je liste ceci parce que dans Mono, il ne semble y avoir aucun TPL ou PLINQ. Ainsi, si j'ai besoin d'écrire des programmes parallèles multi-plateformes, je peux utiliser async.

  4. Filets .Net. Aucune limitation de version.

Pourriez-vous nous faire quelques brefs commentaires sur ces ou ajouter des autres méthodes dans cette liste? Merci.

+1

Quelques liens utiles pour les données brutes: http://msdn.microsoft.com/en-us/concurrency/ee851578.aspx http://channel9.msdn.com/shows/The + Connaissance + Chambre/Pratiques Multi-Cœur-et-Parallèle-Programmation/ http://blogs.msdn.com/pfxteam/rss.xml – Brian

+0

Eh bien, PLINQ/'Parallel' sont certainement les plus faciles à utiliser, mais pas applicable dans toutes les situations –

Répondre

16

Vous avez besoin de faire beaucoup de recherches afin de déterminer comment multithread efficacement. Il y a quelques bons technical articles, une partie du Microsoft Parallel Computing team's site.

Du haut de ma tête, il y a plusieurs façons de s'y prendre: multithreading

  1. Thread classe.
  2. ThreadPool, qui prend également en charge les opérations liées aux E/S et un port d'achèvement des E/S.
  3. Begin*/End* opérations asynchrones.
  4. Composants de programmation asynchrone basée sur des événements (ou "EBAP"), qui utilisent SynchronizationContext.
  5. BackgroundWorker, qui est un EBAP qui définit une opération asynchrone.
  6. Task classe (bibliothèque parallèle de tâches) dans .NET 4.
  7. Parallel LINQ. Il existe un good article sur Parallel.ForEach (bibliothèque parallèle de tâches) par rapport à PLINQ. Ou "LINQ to Events", qui n'a pas encore de version non-bêta mais qui est presque terminée et semble prometteur.
  8. (F # uniquement) Workflows asynchrones.

Mise à jour: Il y a un article Understanding and Applying Parallel Patterns with the .NET Framework 4 disponible pour téléchargement qui donne une direction sur les solutions à utiliser pour quels types de scénarios parallèles (bien qu'il assume .NET 4 et ne couvre pas Rx).

+1

+1 pour une liste complète –

3

Il y a aussi la Reactive Extensions for .NET (Rx)

Rx est essentiellement les requêtes LINQ pour des événements. Il vous permet de traiter et de combiner des flux de données asynchrones de la même manière que linq vous permet de travailler avec des collections. Ainsi, vous l'utiliserez probablement en conjonction avec d'autres technologies parallèles comme un moyen de rassembler les résultats de vos opérations parallèles sans avoir à vous soucier des verrous et autres primitives de threading de bas niveau.

Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) donne un bon aperçu de ce qu'est Rx.

EDIT: Une autre bibliothèque vaut mention est le Concurrency et de la coordination d'exécution (CCR), il a été autour depuis longtemps (plus tôt que '06) et est livré dans le cadre du Microsoft Robotics Studio.

Rx a beaucoup d'idées sympas que le CCR a à l'intérieur, mais avec une API beaucoup plus agréable à mon avis. Il y a encore des choses intéressantes dans le CCR mais cela vaut la peine de vérifier. Il existe également un cadre de services distribués qui fonctionne avec le CCR et qui pourrait le rendre utile en fonction de ce que vous faites.

Expert to Expert: Meijer and Chrysanthakopoulos - Concurrency, Coordination and the CCR

+0

Je n'ai aucune idée de comment j'ai réussi à obtenir un downvote pour cela, Rx rend la programmation parallèle nettement plus facile dans certaines situations - je l'utilise intensivement. –

+0

+1 pour être le premier à mentionner Rx. ;) –

+0

@Mauricio ils sont très liés, tout fonctionner en parallèle est inutile si vous ne pouvez pas coordonner vos résultats. Il ressort clairement de la question que le PO s'intéresse également à cet aspect. Il déclare que "F # a une syntaxe concise supportant cela" se référant à la monade de continuation, Rx est essentiellement la monade de continuation pour tous les langages .NET qui supportent LINQ. –

2

Un autre est la nouvelle tâche bibliothèque parallèle dans .NET 4.0, qui est similaire et le long des lignes de ce que vous avez déjà découvert, mais cela peut être une lecture intéressante:

Task Parallel Library

11

Strictement parlant, la distinction entre parallèle, asynchrone et concurrent doit être faite ici.

Parallèle signifie qu'une "tâche" est répartie entre plusieurs sous-tâches plus petites qui peuvent être exécutées en même temps. Cela nécessite un processeur multi-core ou un ordinateur multi-CPU, où chaque tâche a son noyau dédié ou CPU. Ou plusieurs ordinateurs. PLINQ (parallélisme des données) et TPL (parallélisme des tâches) entrent dans cette catégorie. Asynchrone signifie que les tâches s'exécutent sans se bloquer les unes les autres. L'expression asynchrone F #, Rx, Begin/End pattern sont toutes des API pour la programmation asynchrone.

La concurrence est un concept plus large que la parallélisation et l'asynchronie. La simultanéité signifie que plusieurs «tâches» s'exécutent en même temps, interagissant les unes avec les autres. Mais ces "tâches" ne doivent pas fonctionner sur des unités de calcul physiques distinctes, comme cela est le cas dans la parallélisation. Par exemple, les systèmes d'exploitation multitâches peuvent exécuter simultanément plusieurs processus, même sur des ordinateurs monoprocesseurs à un seul cœur, en utilisant des tranches de temps. La concurrence peut être réalisée par exemple avec le modèle Actor et le passage de message (par exemple, la boîte aux lettres de F #, les processus Erlang (Retlang in .Net))

Les threads sont un concept relativement bas comparé aux concepts ci-dessus. Les threads sont des tâches exécutées dans un processus, s'exécutant simultanément et gérées directement par le planificateur du système d'exploitation. Vous pouvez implémenter la parallélisation lorsque le système d'exploitation mappe chaque thread sur un noyau distinct ou un modèle Actor en implémentant la mise en file d'attente des messages, le routage, etc. sur chaque thread.

+1

Je poste ce wiki comme communauté pour que d'autres puissent corriger et raffiner définitions ... –

4

Il y a aussi des bibliothèques .NET pour la programmation parallèle des données qui ciblent l'unité de traitement graphique (GPU) comprenant:

Microsoft Accelerator est pour la programmation parallèle de données et peuvent cibler soit le GPU ou les processeurs multi-core.

Brama est pour les transformations de données de style LINQ qui s'exécutent sur le GPU.

CUDA.NET fournit un wrapper permettant à CUDA d'être utilisé à partir de programmes .NET.

-1

Deux principales façons de faire parallèle sont les threads et la nouvelle bibliothèque TPL basée sur les tâches.

La programmation asynchrone que vous mentionnez n'est rien de plus qu'un nouveau thread dans le pool de threads.PLINQ, Rx et d'autres mentionnés sont en réalité des extensions situées en haut du nouveau planificateur de tâches.

le meilleur article expliquant exactement la nouvelle architecture pour le nouveau planificateur de tâches et toutes les bibliothèques sur le dessus, Visual Studio 2010 et nouveau TPL .NET 4.0 Parallélisme basé sur les tâches est ici (par Steve Teixeira, Product Unit Manager pour Parallel Outils de développement chez Microsoft):

http://www.drdobbs.com/visualstudio/224400670

autrement Dr Dobbs a consacré la section de programmation parallèle ici: http://www.drdobbs.com/go-parallel/index.jhtml

La principale différence entre les fils de dire et nouvelle tâche en fonction de la programmation parallèle est que vous n'avez pas besoin de penser un nymore en termes de threads, comment gérez-vous les pools et OS et le matériel sous-jacents plus. TPL veille à ce que vous n'utilisiez que des tâches. C'est un énorme changement dans la façon dont vous faites des parallèles à tous les niveaux, y compris l'abstraction.

donc dans .NET en fait, vous n'avez pas beaucoup de choix:

  1. Discussion
  2. Nouvelle tâche en fonction, planificateur de tâches.

De toute évidence, la tâche à accomplir est la solution.

acclamations Valko

Questions connexes