SlideShare uma empresa Scribd logo
1 de 40
Modéliser Parallèle avec C# 4.0 Code Session : TCP301 21 avril 2010 Bruno BOUCARD boucard.bruno@free.fr http://blogs.msdn.com/devpara/default.aspx http://msmvps.com/blogs/brunoboucard
Choisir une stratégie et un algorithme adaptés Trouver la concurrence Méthode itérative
Etape 1 Mesurer les performances de la solution
Etape 1Analyser les performances Analyser les coûts de la solution séquentielle
Analyser les performances Démonstration
Etape 2 Trouver la concurrence
Etape 2Trouver la concurrence Commencer avec un cahier des charges qui décrit le problème Quel que soit le contexte fonctionnel ou technique, vous serez guidé naturellement par l’une des décompositions  ,[object Object]
Il arrive qu’on passe d’une décomposition orientée tâches à une décomposition orientée données ou bien flux de données en fonction du type de traitementCommencer Analyse des dépendances Décomposition Grouper les tâches Orientée données Ordonner les tâches Evaluer le design  Orientée tâches Partager les données Analyser les dépendances ,[object Object]
 NDepend: http://www.ndepend.com/,[object Object]
Trouver la concurrenceSolution séquentielle Dépiler un nom de fichier WM_TIMER Sélectionner un répertoire Charger  une image Structure de pile partagée Charger tous les noms d’images dans le répertoire et ses sous répertoires Normaliser l’image Twister   l’image Insérer dans le contrôle graphique Empiler les noms de fichiers sélectionnés  Convertir l’image en une vignette
Etape 2Décomposition et granularité Votre décomposition en tâches doit tenir compte de leur granularité et de leur surcoût Cœur 0 Cœur 1 Cœur 2 Cœur 3 Cœur 1 Cœur 2 Cœur 0 Cœur 3 tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche Configuration 2 Quelle est la meilleure configuration ? Configuration 1 surcoût charge
Etape 2Décomposition et répartition de charge Votre groupement de tâches doit tenir compte de leur charge Cœur 1 tâche Cœur 2 Cœur 0 Cœur 3 Cœur 1 Cœur 2 Cœur 0 Cœur 3 tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche Configuration 2 Quelle est la meilleure configuration ? Configuration 1 surcoût charge
Etape 2Evaluer votre design Flexibilité Préférer l’abstraction pour faciliter l’adaptation à différents scénarios d’exécution Nombre de cœurs sollicités Partitionnement des données Efficacité Le temps dépensé à gérer le parallélisme vs le temps gagné à tirer parti des cœurs Amélioration des performances en fonction du nombre de processeurs Simplicité Le code peut être facilement diagnostiqué La solution technique choisie est facile à maintenir
Etape 3 Choisir un algorithme en fonction de votre stratégie
Etape 3Choisir un algorithme en fonction de votre stratégie
Etape 3Algorithmes données Décomposition géométrique Taille des morceaux  ,[object Object]
 Trop petit – sur consommation Format des morceaux ,[object Object],Traitement d’une collection d’images, addition de matrices …
ModéliserAlgorithmes données – Attention au False Sharing Pour des raisons de performances, les systèmes utilisent des lignes de cache Lorsque des threads sur différents processeurs modifient en parallèle les variables qui résident sur la même ligne de cache, le False Sharing n’est pas loin  Coeur 0 Coeur 1 T0 T1 Cache Cache Ligne  de cache Ligne de cache ,[object Object]
Deux champs d'instance dans la même instance de classe sont proches dans leurs emplacement de mémoire
Deux champs statiques dans le même type sont proches en mémoire
Deux éléments avec des index adjacents dans un tableau sont proches en mémoire
Les objets alloués consécutivement sont probablement proches en mémoire
Les variables locales utilisées ensemble dans une fermeture sont probablement capturées dans les champs d'instance, et ainsi, d'après le premier commentaire ci-dessus, sont également proches en mémoireMémoire
Algorithmes données: False Sharing Démonstration
Etape 3Décomposition géométrique for (int i = 0; i < size; i++) { Parallel.For(0, size, j => { inttemp = 0;                       for (int k = 0; k < size; k++) { temp += m1[i, k] + m2[k, j];                       } result[i, j] = temp;                   }); }
Etape 3Algorithmes données Décomposition récursive Le choix de la profondeur détermine la performance - Arbre profond  ,[object Object],- Arbre de profondeur limitée ,[object Object],1 tâche 2 tâches 3 tâches 3 tâches Parcours de graphe ou parcours d’arbre …
Etape 3Récursivité sur des données staticvoidWalk<T>(Tree<T> root, Action<T> Action) {     if (root == null) return; var t1 = Task.Factory.StartNew(() =>         action(root.Data)); var t2 = Task.Factory.StartNew(() => Walk(root.Left, action)); var t3 = Task.Factory.StartNew(() => Walk(root.Rigth, action)); Task.WaitAll(t1, t2, t3); }
Etape 3Algorithmes tâches Parallélisme de tâches linéaires Nombre de tâches ,[object Object]
 trop élevé: contention des tâchesDépendances ,[object Object]
 séparables
 lecture seule ou lecture/écrituresous opération 1 sous opération 2 sous opération 3 sous opération 4 sous opération 4 sous opération 1 sous opération 2 Paralléliser  des opérations décomposables sous opération 3
Etape 3Algorithmes tâches Arbres profond  ,[object Object],Arbres de profondeur limitée ,[object Object],Diviser pour régner Problème Séquentiel Split Sous - problème Sous - problème 2 chemins parallèles Split Split Sous - problème Sous - problème Sous - problème Sous - problème 4 chemins parallèles Résoudre Résoudre Résoudre Résoudre Sous - problème Sous - problème Sous - problème Sous - problème Fusionner Fusionner 2 chemins parallèles Sous - solution Sous - solution Fusionner QuickSort Solution Séquentiel
Etape 3Diviser pour régner staticvoidQuickSort<T>(T[] data, intfromInclusive, inttoExclusive) where T : IComparable<T> {     if (toExclusive - fromInclusive <= THRESHOLD)     { InsertionSort(data, fromInclusive, toExclusive);     } else     { intpivotPos = Partition(data, fromInclusive, toExclusive);         if (toExclusive - fromInclusive <= PARALLEL_THRESHOLD)         {             // NOTE: PARALLEL_THRESHOLD ischosen to begreaterthan THRESHOLD. QuickSort(data, fromInclusive, pivotPos); QuickSort(data, pivotPos, toExclusive);         } elseParallel.Invoke(             () => QuickSort(data, fromInclusive, pivotPos),             () => QuickSort(data, pivotPos, toExclusive));     } }
Etape 3Algorithmes flux de données Pipeline Les charges de travail des étapes ,[object Object]
 inégales – pipeline non-linéaireChaîne de montage automobile
Etape 3Algorithmes flux de données Coordination orientée événements Traitement d’une dépêche sur un desk journalistique …
Etape 3Pipeline             var input = new BlockingCollection<string>();             var readLines = Task.Factory.StartNew(() =>              {  try {  foreach(var line in File.ReadAllLines(@"input.txt")) input.Add(line);                  }  finally                 {  input.CompleteAdding();                  }              });             var writeLines = Task.Factory.StartNew(() =>              {  File.WriteAllLines(@"output.txt", input.GetConsumingEnumerable());              }); Task.WaitAll(readLines, writeLines);
Etape 4 Choisir un pattern de structure
Etape 4Choisir un pattern de structures de programme  Après avoir sélectionné votre algorithme parallèle, il faut maintenant le supporter dans votre programme Structures de programme SPMD Master/Worker Boucle parallèle Fork/Join
Etape 4Les Patterns de structures de programme SPMD, Master/Worker, Boucle parallèle et Fork/Join partagent les mêmes idiomes Partitionner Exécuter Fusionner

Mais conteúdo relacionado

Semelhante a ALT.NET Modéliser Parallèle avec C# 4.0

Java 7 - Fork/Join
Java 7 - Fork/JoinJava 7 - Fork/Join
Java 7 - Fork/JoinZenika
 
Support systemes multitaches-tempsreel
Support systemes multitaches-tempsreelSupport systemes multitaches-tempsreel
Support systemes multitaches-tempsreelyoussef essakhi
 
Mardi gras du 2 juin 2010 : CSIM2
Mardi gras du 2 juin 2010 : CSIM2Mardi gras du 2 juin 2010 : CSIM2
Mardi gras du 2 juin 2010 : CSIM2hortis
 
CHAPITRE3_Fondements_Big_Data_MR_YARN - converted (1).pdf
CHAPITRE3_Fondements_Big_Data_MR_YARN - converted (1).pdfCHAPITRE3_Fondements_Big_Data_MR_YARN - converted (1).pdf
CHAPITRE3_Fondements_Big_Data_MR_YARN - converted (1).pdfYounesOuladSayad1
 
TD_complet_reseau__CISCO__Packet Tracer.pdf
TD_complet_reseau__CISCO__Packet Tracer.pdfTD_complet_reseau__CISCO__Packet Tracer.pdf
TD_complet_reseau__CISCO__Packet Tracer.pdfInes Ben Hassine
 
SQLSaturday Paris 2014 - Monitoring et configuration SSAS
SQLSaturday Paris 2014 - Monitoring et configuration SSASSQLSaturday Paris 2014 - Monitoring et configuration SSAS
SQLSaturday Paris 2014 - Monitoring et configuration SSASGUSS
 
Km400 g formation-ibm-infosphere-advanced-datastage
Km400 g formation-ibm-infosphere-advanced-datastageKm400 g formation-ibm-infosphere-advanced-datastage
Km400 g formation-ibm-infosphere-advanced-datastageCERTyou Formation
 
Chapitre 3-architecture-des-dsp
Chapitre 3-architecture-des-dspChapitre 3-architecture-des-dsp
Chapitre 3-architecture-des-dspgharbisalah
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaOlivier BAZOUD
 
ch3_les variables_dynamiques.pdf
ch3_les variables_dynamiques.pdfch3_les variables_dynamiques.pdf
ch3_les variables_dynamiques.pdfFadouaBouafifSamoud
 
335105967 support-de-cours-sap2000-version-07-2006-pdf
335105967 support-de-cours-sap2000-version-07-2006-pdf335105967 support-de-cours-sap2000-version-07-2006-pdf
335105967 support-de-cours-sap2000-version-07-2006-pdftoufik kaidi
 
C2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieC2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieLoic Yon
 
[MAP-MEEDM] Présentation Spatial Data Integrator
[MAP-MEEDM] Présentation Spatial Data Integrator[MAP-MEEDM] Présentation Spatial Data Integrator
[MAP-MEEDM] Présentation Spatial Data Integratormathieuraj
 
BigData_TP2: Design Patterns dans Hadoop
BigData_TP2: Design Patterns dans HadoopBigData_TP2: Design Patterns dans Hadoop
BigData_TP2: Design Patterns dans HadoopLilia Sfaxi
 
MapReduce: Traitement de données distribué à grande échelle simplifié
MapReduce: Traitement de données distribué à grande échelle simplifiéMapReduce: Traitement de données distribué à grande échelle simplifié
MapReduce: Traitement de données distribué à grande échelle simplifiéMathieu Dumoulin
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystMathieu Goeminne
 

Semelhante a ALT.NET Modéliser Parallèle avec C# 4.0 (20)

iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Xml
XmlXml
Xml
 
Coursmp
CoursmpCoursmp
Coursmp
 
Cours s epart2
Cours s epart2Cours s epart2
Cours s epart2
 
Java 7 - Fork/Join
Java 7 - Fork/JoinJava 7 - Fork/Join
Java 7 - Fork/Join
 
Support systemes multitaches-tempsreel
Support systemes multitaches-tempsreelSupport systemes multitaches-tempsreel
Support systemes multitaches-tempsreel
 
Mardi gras du 2 juin 2010 : CSIM2
Mardi gras du 2 juin 2010 : CSIM2Mardi gras du 2 juin 2010 : CSIM2
Mardi gras du 2 juin 2010 : CSIM2
 
CHAPITRE3_Fondements_Big_Data_MR_YARN - converted (1).pdf
CHAPITRE3_Fondements_Big_Data_MR_YARN - converted (1).pdfCHAPITRE3_Fondements_Big_Data_MR_YARN - converted (1).pdf
CHAPITRE3_Fondements_Big_Data_MR_YARN - converted (1).pdf
 
TD_complet_reseau__CISCO__Packet Tracer.pdf
TD_complet_reseau__CISCO__Packet Tracer.pdfTD_complet_reseau__CISCO__Packet Tracer.pdf
TD_complet_reseau__CISCO__Packet Tracer.pdf
 
SQLSaturday Paris 2014 - Monitoring et configuration SSAS
SQLSaturday Paris 2014 - Monitoring et configuration SSASSQLSaturday Paris 2014 - Monitoring et configuration SSAS
SQLSaturday Paris 2014 - Monitoring et configuration SSAS
 
Km400 g formation-ibm-infosphere-advanced-datastage
Km400 g formation-ibm-infosphere-advanced-datastageKm400 g formation-ibm-infosphere-advanced-datastage
Km400 g formation-ibm-infosphere-advanced-datastage
 
Chapitre 3-architecture-des-dsp
Chapitre 3-architecture-des-dspChapitre 3-architecture-des-dsp
Chapitre 3-architecture-des-dsp
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - Xebia
 
ch3_les variables_dynamiques.pdf
ch3_les variables_dynamiques.pdfch3_les variables_dynamiques.pdf
ch3_les variables_dynamiques.pdf
 
335105967 support-de-cours-sap2000-version-07-2006-pdf
335105967 support-de-cours-sap2000-version-07-2006-pdf335105967 support-de-cours-sap2000-version-07-2006-pdf
335105967 support-de-cours-sap2000-version-07-2006-pdf
 
C2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieC2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partie
 
[MAP-MEEDM] Présentation Spatial Data Integrator
[MAP-MEEDM] Présentation Spatial Data Integrator[MAP-MEEDM] Présentation Spatial Data Integrator
[MAP-MEEDM] Présentation Spatial Data Integrator
 
BigData_TP2: Design Patterns dans Hadoop
BigData_TP2: Design Patterns dans HadoopBigData_TP2: Design Patterns dans Hadoop
BigData_TP2: Design Patterns dans Hadoop
 
MapReduce: Traitement de données distribué à grande échelle simplifié
MapReduce: Traitement de données distribué à grande échelle simplifiéMapReduce: Traitement de données distribué à grande échelle simplifié
MapReduce: Traitement de données distribué à grande échelle simplifié
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et Catalyst
 

Mais de Bruno Boucard

Boostez votre processus de découverte avec Example Mapping.pdf
Boostez votre processus de découverte avec Example Mapping.pdfBoostez votre processus de découverte avec Example Mapping.pdf
Boostez votre processus de découverte avec Example Mapping.pdfBruno Boucard
 
Continuous Discovery is it future of Continuous Delivery.pdf
Continuous Discovery is it future of Continuous Delivery.pdfContinuous Discovery is it future of Continuous Delivery.pdf
Continuous Discovery is it future of Continuous Delivery.pdfBruno Boucard
 
Combine workshops to boost business understanding.pdf
Combine workshops to boost business understanding.pdfCombine workshops to boost business understanding.pdf
Combine workshops to boost business understanding.pdfBruno Boucard
 
How to test untestable code at apidays Paris 2017
How to test untestable code at apidays Paris 2017 How to test untestable code at apidays Paris 2017
How to test untestable code at apidays Paris 2017 Bruno Boucard
 
How to test untestable code
How to test untestable codeHow to test untestable code
How to test untestable codeBruno Boucard
 
Diamond kata agile tour lille
Diamond kata agile tour lilleDiamond kata agile tour lille
Diamond kata agile tour lilleBruno Boucard
 
Si le tdd est mort alors pratiquons une autopsie mix-it 2015
Si le tdd est mort alors pratiquons une autopsie mix-it 2015Si le tdd est mort alors pratiquons une autopsie mix-it 2015
Si le tdd est mort alors pratiquons une autopsie mix-it 2015Bruno Boucard
 
Fruit shop techdays 2015
Fruit shop techdays 2015Fruit shop techdays 2015
Fruit shop techdays 2015Bruno Boucard
 
How to turn your developers in less than 6 months in perfect software craftsmen
How to turn your developers in less than 6 months in perfect software craftsmenHow to turn your developers in less than 6 months in perfect software craftsmen
How to turn your developers in less than 6 months in perfect software craftsmenBruno Boucard
 

Mais de Bruno Boucard (9)

Boostez votre processus de découverte avec Example Mapping.pdf
Boostez votre processus de découverte avec Example Mapping.pdfBoostez votre processus de découverte avec Example Mapping.pdf
Boostez votre processus de découverte avec Example Mapping.pdf
 
Continuous Discovery is it future of Continuous Delivery.pdf
Continuous Discovery is it future of Continuous Delivery.pdfContinuous Discovery is it future of Continuous Delivery.pdf
Continuous Discovery is it future of Continuous Delivery.pdf
 
Combine workshops to boost business understanding.pdf
Combine workshops to boost business understanding.pdfCombine workshops to boost business understanding.pdf
Combine workshops to boost business understanding.pdf
 
How to test untestable code at apidays Paris 2017
How to test untestable code at apidays Paris 2017 How to test untestable code at apidays Paris 2017
How to test untestable code at apidays Paris 2017
 
How to test untestable code
How to test untestable codeHow to test untestable code
How to test untestable code
 
Diamond kata agile tour lille
Diamond kata agile tour lilleDiamond kata agile tour lille
Diamond kata agile tour lille
 
Si le tdd est mort alors pratiquons une autopsie mix-it 2015
Si le tdd est mort alors pratiquons une autopsie mix-it 2015Si le tdd est mort alors pratiquons une autopsie mix-it 2015
Si le tdd est mort alors pratiquons une autopsie mix-it 2015
 
Fruit shop techdays 2015
Fruit shop techdays 2015Fruit shop techdays 2015
Fruit shop techdays 2015
 
How to turn your developers in less than 6 months in perfect software craftsmen
How to turn your developers in less than 6 months in perfect software craftsmenHow to turn your developers in less than 6 months in perfect software craftsmen
How to turn your developers in less than 6 months in perfect software craftsmen
 

ALT.NET Modéliser Parallèle avec C# 4.0

  • 1. Modéliser Parallèle avec C# 4.0 Code Session : TCP301 21 avril 2010 Bruno BOUCARD boucard.bruno@free.fr http://blogs.msdn.com/devpara/default.aspx http://msmvps.com/blogs/brunoboucard
  • 2. Choisir une stratégie et un algorithme adaptés Trouver la concurrence Méthode itérative
  • 3. Etape 1 Mesurer les performances de la solution
  • 4. Etape 1Analyser les performances Analyser les coûts de la solution séquentielle
  • 5. Analyser les performances Démonstration
  • 6. Etape 2 Trouver la concurrence
  • 7.
  • 8.
  • 9.
  • 10. Trouver la concurrenceSolution séquentielle Dépiler un nom de fichier WM_TIMER Sélectionner un répertoire Charger une image Structure de pile partagée Charger tous les noms d’images dans le répertoire et ses sous répertoires Normaliser l’image Twister  l’image Insérer dans le contrôle graphique Empiler les noms de fichiers sélectionnés Convertir l’image en une vignette
  • 11. Etape 2Décomposition et granularité Votre décomposition en tâches doit tenir compte de leur granularité et de leur surcoût Cœur 0 Cœur 1 Cœur 2 Cœur 3 Cœur 1 Cœur 2 Cœur 0 Cœur 3 tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche Configuration 2 Quelle est la meilleure configuration ? Configuration 1 surcoût charge
  • 12. Etape 2Décomposition et répartition de charge Votre groupement de tâches doit tenir compte de leur charge Cœur 1 tâche Cœur 2 Cœur 0 Cœur 3 Cœur 1 Cœur 2 Cœur 0 Cœur 3 tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche tâche Configuration 2 Quelle est la meilleure configuration ? Configuration 1 surcoût charge
  • 13. Etape 2Evaluer votre design Flexibilité Préférer l’abstraction pour faciliter l’adaptation à différents scénarios d’exécution Nombre de cœurs sollicités Partitionnement des données Efficacité Le temps dépensé à gérer le parallélisme vs le temps gagné à tirer parti des cœurs Amélioration des performances en fonction du nombre de processeurs Simplicité Le code peut être facilement diagnostiqué La solution technique choisie est facile à maintenir
  • 14. Etape 3 Choisir un algorithme en fonction de votre stratégie
  • 15. Etape 3Choisir un algorithme en fonction de votre stratégie
  • 16.
  • 17.
  • 18.
  • 19. Deux champs d'instance dans la même instance de classe sont proches dans leurs emplacement de mémoire
  • 20. Deux champs statiques dans le même type sont proches en mémoire
  • 21. Deux éléments avec des index adjacents dans un tableau sont proches en mémoire
  • 22. Les objets alloués consécutivement sont probablement proches en mémoire
  • 23. Les variables locales utilisées ensemble dans une fermeture sont probablement capturées dans les champs d'instance, et ainsi, d'après le premier commentaire ci-dessus, sont également proches en mémoireMémoire
  • 24. Algorithmes données: False Sharing Démonstration
  • 25. Etape 3Décomposition géométrique for (int i = 0; i < size; i++) { Parallel.For(0, size, j => { inttemp = 0; for (int k = 0; k < size; k++) { temp += m1[i, k] + m2[k, j]; } result[i, j] = temp; }); }
  • 26.
  • 27. Etape 3Récursivité sur des données staticvoidWalk<T>(Tree<T> root, Action<T> Action) { if (root == null) return; var t1 = Task.Factory.StartNew(() => action(root.Data)); var t2 = Task.Factory.StartNew(() => Walk(root.Left, action)); var t3 = Task.Factory.StartNew(() => Walk(root.Rigth, action)); Task.WaitAll(t1, t2, t3); }
  • 28.
  • 29.
  • 31. lecture seule ou lecture/écrituresous opération 1 sous opération 2 sous opération 3 sous opération 4 sous opération 4 sous opération 1 sous opération 2 Paralléliser des opérations décomposables sous opération 3
  • 32.
  • 33. Etape 3Diviser pour régner staticvoidQuickSort<T>(T[] data, intfromInclusive, inttoExclusive) where T : IComparable<T> { if (toExclusive - fromInclusive <= THRESHOLD) { InsertionSort(data, fromInclusive, toExclusive); } else { intpivotPos = Partition(data, fromInclusive, toExclusive); if (toExclusive - fromInclusive <= PARALLEL_THRESHOLD) { // NOTE: PARALLEL_THRESHOLD ischosen to begreaterthan THRESHOLD. QuickSort(data, fromInclusive, pivotPos); QuickSort(data, pivotPos, toExclusive); } elseParallel.Invoke( () => QuickSort(data, fromInclusive, pivotPos), () => QuickSort(data, pivotPos, toExclusive)); } }
  • 34.
  • 35. inégales – pipeline non-linéaireChaîne de montage automobile
  • 36. Etape 3Algorithmes flux de données Coordination orientée événements Traitement d’une dépêche sur un desk journalistique …
  • 37. Etape 3Pipeline var input = new BlockingCollection<string>(); var readLines = Task.Factory.StartNew(() => { try { foreach(var line in File.ReadAllLines(@"input.txt")) input.Add(line); } finally { input.CompleteAdding(); } }); var writeLines = Task.Factory.StartNew(() => { File.WriteAllLines(@"output.txt", input.GetConsumingEnumerable()); }); Task.WaitAll(readLines, writeLines);
  • 38. Etape 4 Choisir un pattern de structure
  • 39. Etape 4Choisir un pattern de structures de programme Après avoir sélectionné votre algorithme parallèle, il faut maintenant le supporter dans votre programme Structures de programme SPMD Master/Worker Boucle parallèle Fork/Join
  • 40. Etape 4Les Patterns de structures de programme SPMD, Master/Worker, Boucle parallèle et Fork/Join partagent les mêmes idiomes Partitionner Exécuter Fusionner
  • 41. Etape 4Fork / Join var tasks = new Task[3]; tasks[0] = new Task(() => ComputeMean()); tasks[1] = new Task(() => ComputeMedian()); tasks[2] = new Task(() => ComputeMode()); foreach(Task t in tasks) t.Start(); Task.WaitAll(tasks); Parallel.Invoke( () => ComputeMean(), () => ComputeMedian(), () => ComputeMode() );
  • 42. Etape 4Boucle parallèle Parallel.ForEach(stack, bitmap => _imagesStack.Push(ProcessBitmap(bitmap))); var query = from bitmap in stack.AsParallel() select ProcessBitmap(bitmap); query.ForAll(image => _imagesStack.Push(image));
  • 43. Etape 4Structures de programme parallèle Appliquées dans différents contextes SPMD – Systèmes distribués MPI, SOA, GridComputing, Fork / Join – Orienté Tâches TPL Master/Worker – Orienté Tâches TPL Boucle Parallèle – Orienté Données TPL, PLINQ
  • 44. Structures de programme parallèle Démonstration
  • 45. Structures de programme parallèleSolution parallèle WM_TIMER Collection des noms de fichiers Sélectionner un répertoire Pile partagée concurrente Charger une image Charger tous les noms d’images dans le répertoire et ses sous répertoires Dépiler une vignette Normaliser l’image Insérer dans le contrôle graphique Twister l’image Empiler les noms de fichiers sélectionnés Convertir l’image en une vignette
  • 46. Etape 1 Mesurer les performances de la solution
  • 47. Etape 1Analyser les performances Analyser les coûts de la solution parallèle
  • 48. Structures de programme parallèle Démonstration
  • 49. ConclusionQuelques suggestions pour l’implémentation Préférer les nouveaux outils de haut niveau d’abstraction Privilégier les solutions simples à maintenir La granularité fine est souvent synonyme de complexité Utiliser systématiquement des librairies thread-safe Fiabilité == Gain de temps Ne jamais présumer d’un ordre d’exécution La justesse du code est à ce prix
  • 50. ConclusionPour retrouver le « Free Lunch » Respecter les 4 grandes étapes Notamment les « analyses des dépendances » et « analyses des performances » Avancer de manière itérative Difficile de trouver « la solution » du premier coup Si possible privilégier les capacités de monter en charge ainsi que la simplicité Mesurer régulièrement les performances de vos choix Visual Studio 2010 est votre ami Si vos choix ne vous semblent pas satisfaisants Oser changer votre algorithme pour augmenter ses chances de parallélisation Penser Parallèle C’est en pratiquant régulièrement la méthode présentée que vous gagnerez en réflexes sur l’usage des Patterns parallèles les mieux adaptés à vos besoins
  • 51. Vous n’êtes pas seul !Livres et blogues Mes ouvrages préférés Programmation Parallèle http://msmvps.com/blogs/brunoboucard Portail Microsoft ParallelComputing http://msdn.microsoft.com/en-us/concurrency Patterns for Parallel Programming de Stephen Toub http://www.microsoft.com/downloads/details.aspx?FamilyID=86b3d32b-ad26-4bb8-a3ae-c1637026c3ee&displaylang=en