Un numéro offert




Recherche :

Le développement parallèle avec Intel Parallel Studio 2011
Arrêtez le chasse-neige, programmez parallèle avec TBB

Télécharger l'article en PDF

Threading Building Block est une librairie qui a pour but d'offrir une interface agréable pour les développeurs en C++ qui souhaitent paralléliser leur code. Agréable, car vous avez la liberté de rester à un haut niveau d'abstraction, garder une formulation objet fonctionnelle et de ne pas vous intéresser aux détails d'implémentation. Le croirez-vous, modélisation objet et performance ne sont cette fois-ci pas incompatibles, bien au contraire.

Le fait de définir avec précision les données du problème en mode objet sans entrer dans les détails techniques donne à la librairie tout ce dont elle a besoin pour être performante sans lui imposer un cadre trop strict. Dans d'autres systèmes comme OpenMP vous ne définissez (pour simplifier) que votre modèle de données, la librairie n'a donc pas autant d'informations. La programmation fonctionnelle vous permettra elle de définir des architectures logicielles naturellement adaptées au multi-core. Vous pouvez être au summum, à la fois de la performance et de la modélisation, pourquoi se priver ?

EXEMPLE SIMPLE

Essayons de faire nos premiers pas parallèles avec TBB en commençant par un cas simple. Dans les exemples, vous trouverez "GettingStarted/sub_string_finder". Si vous êtes en ligne de commande il suffit de dézipper les sources et en-têtes et taper "make". Des projets pour Visual Studio et Xcode sont aussi disponibles. Il s'agit d'un problème simple de traitement de chaînes : pour chaque position dans une chaîne, savoir la longueur de la sous-chaîne qui se retrouve ailleurs dans la chaîne principale. Le problème n'est pas fondamental mais le code est simple à comprendre et à paralléliser. TBB vous évite certes d'avoir à coder les détails d'implémentation, mais il vous reste tout de même à définir à quel niveau de votre algorithme vous souhaitez inclure du parallélisme. Nous observons que l'algorithme peut être parallélisé au niveau du "pour chaque position dans une chaîne". En effet, chaque analyse peut s'effectuer sans connaissance du résultat des autres, tout ce qui est demandé est que chaque unité de traitement ait une copie de la chaîne en entrée et puisse agréger les résultats en sortie.

PROGRAMMATION FONCTIONNELLE

Il faut tout d'abord déplacer votre code de calcul dans une classe, ici "SubStringFinder". La définition d'une classe permet d'avoir une vision claire des variables qui sont utilisées dans la partie parallèle de votre code. Ce point est un grand classique de la programmation parallèle. L'opérateur de la classe est lui la partie "calcul". Constructeur :

SubStringFinder(string &s, size_t *m, size_t *p) :
str(s), max_array(m), pos_array(p) { }

Nous avons donc les données d'entrée (une chaîne) et une classe de calcul, il ne nous reste plus qu'à les associer pour lancer le traitement. Habituellement nous ferions directement appel à la classe en donnant une partie de la chaîne comme argument, le tout à partir d'une boucle pour couvrir toute la chaîne. Avec TBB je remplace la boucle par un appel à un "parallel_for" associé a un "blocked_range". La fonction lance le calcul, et le "range" est l'équivalent des limites de la boucle, avec des subtilités. La gestion de la classe de calcul reste identique. Appel TBB :

parallel_for(blocked_range(0, to_scan.size(), 1),
SubStringFinder( to_scan, max, pos ) );

Du point de vue du développeur, rien de révolutionnaire, il s'agit juste de reformuler dans un style de programmation fonctionnelle. La formulation est abstraite et simple à utiliser. Pour la librairie, par contre, cela change tout : TBB a maintenant le contrôle total du lancement de la partie parallèle d'une part, une partie calcul bien isolée et des données présentées sous une forme bien détaillée d'autre part. Le style n'est pas accessoire, il est à la base du fonctionnement de TBB.

AUTOMAGIQUE

Quelques changements stylistiques, une recompilation, et voila que votre code s'exécute en parallèle. Magique non ? En pratique la librairie a d'abord créé un pool de threads adapté à l'environnement d'exécution et matériel. Il a ensuite fallu gérer les allocations mémoire nécessaires localement pour chaque thread et transférer les données nécessaires vers chaque thread. Puis gérer une queue de travail ou les différentes classes de calcul puisent leurs données. Enfin, rapatrier les résultats dans une variable unique du thread principal avant de rendre la main à la partie non parallèle de votre code.

VARIATIONS

Il est toujours possible que chaque calcul prenne un temps différent en fonction de la donnée qui lui est fournie en entrée, ou qu'il y ait une granularité optimale pour découper vos données. Ces imperfections de parallélisme sont nuisibles à la sociabilité de votre logiciel parallèle, c'est-à-dire sa capacité à utiliser un grand nombre de coeurs efficacement. Si vous savez le prédire, renseignez TBB, le temps d'exécution n'en sera qu'amélioré. Ici nous avons opté pour un "blocked_range" pour distribuer en morceaux identiques la charge de travail entre threads, mais testez d'autres systèmes de répartitions. Idem pour la granularité. Il ne suffit après tout que d'un changement minime dans votre code et d'une recompilation.

RÉDUCTIONS

Nous venons de voir un cas simple ou les calculs exécutés en parallèle sont indépendants et où le résultat final n'est que l'agglomération des résultats unitaires. Prenons un exemple plus complexe pour comprendre le réel apport de TBB : calculons combien de nombres premiers se trouvent dans un intervalle en utilisant le crible d'Ératosthène (fichiers dans "parallel_reduce/primes"). Savoir si chaque nombre est premier est un calcul indépendant, mais le nombre final est lui une valeur commune. Il faut calculer une opération à la fin des blocs parallèles pour obtenir le résultat composite. La fonction TBB parallel_reduce va donc faire un appel à une fonction de jonction en plus de l'operateur de calcul dans votre classe. Ici la classe "Sieve" (crible en anglais) a donc une fonction "join" en plus d'"operator".

DIVISION ET CONQUÊTE

Rien de bien spectaculaire pour les habitués de la programmation parallèle, la réduction est un classique. Mais la méthode par crible d'Ératosthène provoque un fort déséquilibre dans les calculs, qui plus est, dur à prévoir. L'implémentation qui vous est proposée utilise une méthode de division et conquête. En pratique, si un intervalle de nombres s'avère trop lourd à calculer pour un seul thread il est possible de le diviser entre plusieurs, dynamiquement au cours de l'exécution. Notez le second constructeur pour "Sieve", il est utilisé lors d'une division de tâche. Une réponse simple et stylée à un problème complexe. Vous voyez alors l'apport de la programmation fonctionnelle et comment TBB vous permet de l'utiliser pour paralléliser efficacement. TBB n'est pas seulement une énième interface vers la même couche de parallélisation mais bien un cadre qui fait le lien entre les dernières innovations en architecture logicielle et matérielle.

ET BIEN PLUS ENCORE

Nous avons vu un exemple de parallel_for et parallel_reduce mais TBB ne se limite pas à ces deux cadres. Vous pouvez par exemple travailler sous forme de pipelines linéaires, c'est à dire définir des dépendances entre opérations et un degré de traitement parallèle. TBB fera le reste et gérera l'équilibre entre différentes phases de votre traitement. L'appel à parallel_do permet, lui, de gérer les cas ou le nombre d'itérations est inconnu à l'avance tout en maximisant la capacité à travailler en parallèle. Outre ces cadres de parallélisations, TBB vous propose des structures de données utilisables en parallèle. Des HashMap Vector et Queue accessibles en parallèle en toute sécurité ? C'est maintenant possible, même si vous utilisez des threads sans passer par TBB dans votre code. Vous pouviez déjà synchroniser et protéger tous les accès à ces structures pour assurer la validité de vos données, mais les structures de TBB le font avec un minimum de dégradation de performance.

TÂCHES

Avoir une librairie qui cache la complexité des threads logiques est utile, mais les threads ne sont pas toujours le bon outil pour paralléliser. Avec certains algorithmes il est nécessaire d'avoir beaucoup plus d'unités de calcul que de coeurs disponibles. Si vous programmez un jeu vidéo ou chaque personnage voit son intelligence artificielle gérée par un thread, vous risquez d'avoir des problèmes pour un grand nombre de personnages. Alors que si vous utilisez des tâches, elles se partageront plus aisément les coeurs. La ou le gestionnaire de l'OS gérait la priorité entre threads, c'est TBB qui la gère entre tâches. Or TBB a plus d'informations sur les besoins réels des tâches et peut donc repartir de manière optimale. La tâche est donc l'outil rêvé pour programmer en fonctionnel sans tenir compte des ressources matérielles tout en les exploitant à leur optimum. J'espère que vous saurez maintenant mieux situer TBB dans l'éventail des technologies logicielles de parallélisations. TBB offre un rare potentiel de performance à ceux qui maîtrisent la programmation fonctionnelle (attention c'est addictif).

Paul Guermonprez
Sr. Software Engineer - Intel Software EMEA


Actualités

Intel Parallel Studio 2011 Getting Started


Pratique

Supplément C++
Téléchargez gratuitement le supplément de 24 pages, publié en Juillet 2011
Télécharger le PDF

Livre blanc


Téléchargez le Guide Intel Parallel Studio : toutes les infos et les liens ! Pratique, forum, downlaoad, cas clients etc.
Faites évoluer votre code
• Pourquoi passer à la programmation parallèle
• Simplifier le développement parallèle
• La chasse aux bogues parallèles
• Plus de coeurs, plus rapide, plus de montée en charge
• Vous ne reconnaîtrez plus votre C++

Téléchargez le PDF complet
Intel Parallel Studio 2011

Intel propose une nouvelle gamme d'outils de développement d'applications pour profiter du multicore via une programmation parallèle. Il s'agit de l'Intel® Parallel Studio qui d'adresse aux développeurs Windows qui possèdent Visual Studio* C/C++2008. Ce nouvel outil est en fait un ensemble qui réunit , Parallel Advisor pour diagnostiquer le code quant aux possibilités de parallélisation, Parallel Composer pour incorporer du parallélisme à l'aide d'un compilateur C++ Intel et des bibliothèques thread safe, Parallel Inspector pour découvrir des conflits de threading éventuels et Parallel Amplifier pour diagnostiquer le comportement des threads.




Liens
Page d'accueil Intel Parallel Studio
Présentations vidéos

Actu

Pratique


Actu


Distributeurs INTEL

FRANCE

Micro Sigma
+ 33 (1) 55 90 99 16
http://www.microsigma.fr/intel
info@microsigma.fr

Comsoft-SOS Developers
Tel 0825 07 06 07 – 0825 07 06 08 (fax)
www.comsoft-direct.fr/intel
infos@comsoft.fr

ALLYS
+33 (0)1 4763 9344, +33 (0)1 4763 9344
http://www.allys-soft.com
allys@allys-soft.com

Insight France
+33 (1) 30 67 25 00
http://fr.insight.com
linfo.fr@insight.com

RITME INFORMATIQUE
+33 (0) 1.4246.0042, +33 (0) 1.4246.0033
http://www.ritme.com
info@ritme.com

Software Technology Resources
+33 (1) 30 70 61 61
http://http://www.str.fr
contact@str.fr

transtec S.A.R.L.
+33 (0) 3.88.55.16.00, +33 (0) 3.88.55.16.09 (fax)
www.transtec-cluster.com
ccenter@transtec.de


BELGIQUE

ttec Computers B.V.B.A.
+32 (0) 800 93 920, +32 (0) 800 93 921 (fax)
www.transtec-cluster.com
ccenter@transtec.de

SOS Developers
+32 (0800) 74.756, +32 (0800) 74.757 (fax)
http://www.sosdevelopers.com/
benelux@sosdevelopers.com


SUISSE

COMSOL AG
+41 (31) 998.44.11, +041 (31) 998.44.18 (fax)
http://www.comsol.ch/Intel
info@comsol.ch

PC-Ware Systems (Schweiz) AG
+41 41 925 50 50, +41 41 925 51 51 (fax)
http://www.pc-ware.ch
mail@pc-ware.ch

SCIENTIFIC SOLUTIONS
+41 021 711 15 20, +41 021 711 15 21 (fax)
http://www.scientific-solutions.ch
info@scientific-solutions.ch

SOS Software Service GmbH
+41-52-728 07 38; +41-52-720 93 70 (fax)
http://www.sos-software.ch/intel
intel@sos-software.ch

transtec Computer AG
+41 (0) 44/818 47 00, +41 (0) 44/818 47 20 (fax)
www.transtec-cluster.com
ccenter@transtec.de

Programmez.com - 2013 - Tous droits réservés
Développement - WEB - ASP - PHP - C++ - Delphi - Java - Magazines - Ressources - Forum - Télécharger - Video - Emploi - Campus - .Net - Tutoriels

Le présent site Web est édité par Go 02, Sarl inscrite au RCS de Paris sous le N° 411321366 et dont le siège social est au 21 rue de Fécamp 75012 Paris.
Adresse de courrier électronique :diff@programmez.com

Le directeur de la publication du site www.programmez.com est Jean-Claude Vaudecrane en qualité de gérant de la sarl GO 02

Le portail du décideur informatique en entreprise : Solutions & Logiciels