Numéro 6
Transcription
Numéro 6
THE PARALLEL N° 6 Mars 2011 UNIVERSE La parallélisation Fonctions Intel® Integrated Performance Primitives à l’aide d’Intel® Cilk™ Plus et d’Intel® Threading Building Blocks par Walter Shands Conseils de programmation Intel® Array Building Blocks par Zhang Zhang Lettre du rédacteur en chef par James Reinders Walter Shands Technical Consulting Engineer Intel® Parallel StudIo devIent extrêMe Réalisez des performances sans précédent avec Intel® Parallel Studio XE Par les auteurs d’Intel® VTune™ Performance Analyzer et d’Intel® Visual Fortran Compiler, voici maintenant le nec plus ultra des toolkits de performances tout-en-un. victoria Gromova Technical Consultant Engineer Intel® Parallel StudIo xe Intel® Parallel Studio XE regroupe dans une même suite les compilateurs C/C++ et Fortran plébiscités d’Intel, des bibliothèques, des fonctions d’identification des erreurs, de sécurité et de profilage,.qui permettent aux développeurs de maximiser les performances, la sécurité et la fiabilité des applications de calcul intensif et d’entreprise. Intel® C++ Studio XE offre les mêmes avantages aux développeurs qui ont seulement besoin du compilateur C++. Intel Parallel Studio XE comprend trois nouvelles versions de produits de pointe : › Intel® Composer xe Compilateurs optimisants et bibliothèques de hautes performances › Intel® Inspector xe Détecteur puissant des erreurs de mémoire et de parallélisme › Intel® VTune™ Amplifier XE Profileur avancé de performances Faites des économies en achetant des suites vous possédez déjà le logiciel ? Lorsqu’on les achète dans le cadre de suites, les composants peuvent être obtenus à des prix considérablement moindres. Pour des détails sur l’achat d’outils pris individuellement, allez sur http://software.intel.com/en-us/articles/buy-or-renew/. Si vous possédez déjà des outils logiciels d’Intel®, vous avez peut-être droit à un tarif spécial de mise à niveau. Pour en savoir plus, allez sur http://software.intel.com/en-us/articles/intel-xe-productcomparison/#upgrade. Téléchargez une version gratuite d’évaluation pendant 30 jours d’Intel® Software Development Products depuis www.intel.com/software/products/eval. Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice © 2011, Intel Corporation. Tous droits réservés. Intel, le logo Intel et VTune sont des marques commerciales d’Intel Corporation, aux États-Unis et/ou dans d’autres pays. *D’autres noms et désignations peuvent être revendiqués comme marques par des tiers. tHe Parallel unIverSe SommaIrE lettre du rédacteur en chef PBB, XE, l’explosion cambrienne et l’art de la programmation, PAR JAmES REINDERS 4 James Reinders, évangéliste en chef et directeur du groupe Intel® Software Development Products, discute de la difficulté de choisir les produits et les modèles de programmation les mieux adaptés à ses besoins en programmation. Fonctions Intel® Integrated Performance Primitives de parallélisation à l’aide d’Intel® Cilk™ Plus et d’Intel® threading 6 Building Blocks, PAR WALTER ShANDS Les modèles parallèles d’Intel® Parallel Building Blocks s’intègrent sans problèmes aux applications existantes, préservant ainsi les investissements réalisés dans le code existant et contribuant à accélérer le développement d’applications parallèles. Conseils de programmation Intel® array Building Blocks, PAR ZhANg ZhANg 12 Aidez le système de runtime en générant du code hautes performances et acquérez une bonne compréhension de l’API Intel® Array Building Blocks pour éviter des erreurs. Success Story roundup Envivio, The Creative Assembly et Altair racontent en quoi les outils Intel® Software Development leur ont permis de gagner en performances, en productivité et en fiabilité. abonnez-vous : The Parallel Universe est un magazine trimestriel gratuit. Cliquez sur le lien ci-dessous pour recevoir les prochains numéros et partager cette publication avec des amis et collègues. © 2011, Intel Corporation. Tous droits réservés. Intel, le logo Intel, Cilk Plus, Intel Core et Intel VTune sont des marques déposées ou enregistrées d’Intel Corporation aux États-Unis et/ou dans d’autres pays. *D’autres noms et désignations peuvent être revendiqués comme marques par des tiers. 20 tHe Parallel unIverSe LETTRE DU RÉDACTEUR EN ChEF PBB, XE, L’EXPLoSIoN CAmBRIENNE, ET L’ART DE LA PRogRAmmATIoN J’aime avoir le choix parce que le choix est synonyme d’options multiples. La programmation, c’est comme la mécanique, on commence par chercher quels sont les outils adaptés à la tâche. Ce numéro de The Parallel Universe nous forme à sélectionner les outils adaptés à la tâche en nous formant aux méthodes et aux outils de programmation. Les articles de ce numéro sont essentiellement consacrés à la programmation parallèle à l’aide des derniers outils Intel® XE en montrant les résultats que l’on peut obtenir grâce aux modèles et aux outils de programmation et en indiquant des conseils d’utilisation de ces modèles et outils. Un buffet a beau proposer un tas de plats savoureux, il est certaines personnes que déconcerte l’abondance des choix proposés. C’est une chose que j’ai remarquée : lorsque je me trouve avec un groupe dans un restaurant chinois proposant 185 entrées numérotées sur le menu, nombreuses sont les personnes qui mettent du temps à choisir. J’ai également remarqué que les décisions sont prises plus rapidement si quelqu’un émet une recommendation ou si un plat du jour spécial est mis en évidence. Si la programmation multicœur vous tente, je me permets de vous recommander le produit Intel® Parallel Studio XE et Intel® Parallel Building Blocks. Si vous avez un plus gros appétit et que les clusters de processeurs ne vous font pas peur, alors, je vous recommande Intel® Cluster Studio et la bibliothèque Intel® message Passing Interface (MPI). J’ai reçu quelques réactions très sympatiques sur les articles du dernier numéro qui m’ont aidé à détailler ces recommandations. Si vous l’avez manqué, je ne saurais trop vous encourager à lire le numéro 5 (http://i.cmpnet.com/ddj/go-parallel/ assets/Parallel_Mag_Issue5.pdf). 4 Dans le présent numéro, nous continuerons d’explorer mes recommandations en montrant encore plus ce que ces produits et ces modèles de programmation sont capables de faire concrètement. L’objectif est de vous aider à déterminer quand ces produits et ces modèles de programmation sont indiqués pour vos besoins en programmation. Bien sûr, nous ne pouvons être exhaustifs, mais j’espère que vous trouverez dans ces pages des choses qui vous seront utiles. Nous avons des solutions qui étendent la plupart des langages et des environnements de programmation. Comme j’ai déjà eu l’occasion de le dire, le matériel informatique n’a jamais été aussi complexe. Le défi qu’ont à relever les modèles et les outils de programmation est de rendre gérable cette complexité en étant assez génériques pour pouvoir être utilisables, tout en offrant un contrôle suffisamment prêt du détail pour produire des résultats utiles. En dépit de nos efforts, le nombre de solutions proposées peut paraître accablant. L’un de mes collègues a même appelé cela « l’explosion cambrienne de la programmation parallèle ». Est-il possible de sélectionner des gagnants ? Je le pense, parce que je pense que nous sommes bien avancés dans l’« explosion cambrienne » (elle a commencé de manière générale dans les années 1950 avec les langages de programmation). Les gagnants d’aujourd’hui doivent poursuivre les réalisations des gagnants d’hier.. Nous ne partons pas de zéro. Nous devrions ? Je ne le crois pas et je remets à plus tard le développement de ce point. Les solutions les plus populaires, je veux dire « les gagnants », seront celles qui étendent les langages de programmation les plus utilisés. C’est ce qui explique qu’Intel® Parallel Building Blocks et les outils Intel® Parallel Studio XE s’adressent essentiellement aux développeurs C, C++ et Fortran et bénéficient de ce fait d’un degré élevé de popularité. Nous avons des solutions qui étendent la plupart des langages et des environnements de programmation. Cela dit, il nous reste encore beaucoup à apprendre ensemble. Les articles de ce numéro nous y aideront en explorant les modèles de programmation et les outils pour faire connaître des réussites et proposer des conseils et astuces. Votre avis m’intéresse : d’autres articles, voire peut-être un livre, vous seraient-ils utiles ? N’hésitez pas à m’écrire un mot à [email protected] si vous avez d’autres suggestions. J’ai toujours apprécié les messages que j’ai reçus l’an dernier de nombre d’entre vous. Bienvenue donc à vos commentaires ! Bonne lecture ! JaMeS reInderS Portland, oregon (USa) mars 2011 Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice. James reinders est Chief Software Evangelist chez Intel Corporation. Il a rédigé des articles et des ouvrages sur le parallélisme comme Intel Threading Building Blocks: outfitting C++ for multicore Processor Parallelism, qui a été traduit en japonais, chinois et coréen. Reinders intervient également fréquemment dans les médias sur la question du parallélisme. 5 Parallélisation d’Intel® Integrated Performance Primitives Avec Intel® Cilk™ Plus et Intel® Threading Building Blocks par Walter Shands Intel® Integrated Performance Primitives (Intel® IPP) est une vaste bibliothèque de fonctions logicielles optimisées pour les applications multimédias, de traitement de données et de communication exécutées sur des plates-formes multicœurs. Intel® IPP est inclus dans Intel® Composer XE, composant d’Intel® Parallel Studio XE, et dans Intel® C++ Composer XE, composant d’Intel® C++ Studio XE. 6 tHe Parallel unIverSe Walter Shands Technical Consulting Engineer 7 tHe Parallel unIverSe Intel IPP est fourni en versions monothread et multithread qui peuvent être liées de manière statique ou dynamique. Les développeurs préfèrent parfois utiliser les versions monothread de la bibliothèque. Il existe diverses raisons à cela, dont l’une est de pouvoir contrôler le nombre des threads dans une application qui utilise Intel IPP. Par exemple, si la bibliothèque Intel IPP est utilisée et qu’une fonction Intel IPP avec threads est appelée par l’application, le sous-système Intel IPP de threads va créer un nombre de threads logiciels égal au nombre de threads matériels disponibles sur le système. Si le code de l’application prévoit des threads de manière générale, le nombre total de threads s’exécutant dans l’application lors de l’appel à une fonction Intel IPP risque d’être supérieur aux threads matériels disponibles. Cela peut provoquer un surcroît de charge système pour la synchronisation des threads. Et même quand on utilise des versions monothread de la bibliothèque Intel IPP, il arrive qu’il soit important de créer des threads pour des fonctions Intel IPP individuelles. C’est le cas, par exemple, lorsqu’une application qui comprend des threads et qui est optimisée pour un nombre précis de threads matériels s’exécute sur un système comportant beaucoup plus de cœurs. L’appel à une fonction Intel IPP qui n’était pas un problème sur un petit nombre de cœurs peut très bien s’avérer un véritable problème lorsque la partie de consommation intensive du CPU à l’origine s’étend sur un nombre bien plus important de cœurs. Or, il se trouve qu’Intel Composer XE et Intel C++ Composer XE comportent également des outils permettant d’ajouter du threading à des fonctions Intel IPP monothread. Ces outils portent le nom d’Intel® Parallel Building Blocks (Intel® PBB). Intel PBB n’est pas le nom d’un produit, mais un terme désignant une collection de modèles (ou d’outils) qui aident les développeurs à implémenter le parallélisme. Comme ils s’appuient sur le même socle, vous pouvez mêler les modèles qui correspondent à vos besoins particuliers d’implémentation parallèle. Ces modèles parallèles s’intègrent sans problèmes aux applications existantes, préservant ainsi les investissements réalisés dans le code existant et contribuant à accélérer le développement d’applications parallèles. Ce sont Intel® Cilk™ Plus, Intel® Threading Building Blocks (Intel® TBB), et Intel® array Building Blocks (Intel® ArBB). Deux de ces briques, Intel TBB et Intel Cilk Plus, fournissent, respectivement, des algorithmes et des mots clés parallèles au code de threads existant. Dans les paragraphes qui suivent, je vais m’employer à décrire comment les utiliser pour écrire des encapsuleurs fournissant du threading aux fonctions d’Intel IPP. Intel TBB est une bibliothèque de modèles C++ pouvant être employés pour implémenter un parallélisme général. Il est destiné aux développeurs C++ qui écrivent des applications générales de parallélisme de boucles et de tâches. Cet outil inclut les fonctions suivantes : allocation évolutive de mémoire, équilibrage de charge, programmation de tâches work-stealing, pipelines thread-safe et conteneurs simultanés, algorithmes parallèles généraux et primitives de synchronisation en grand nombre. Il est possible d’utiliser Intel TBB et des fonctions lambda pour ajouter des threads à des fonctions Intel IPP quand le besoin s’en fait sentir. L’idée de base est d’encapsuler l’appel à la fonction Intel IPP avec un algorithme parallèle d’Intel TBB comme parallel_for et d’utiliser une fonction lambda pour simplifier le code. La fonction parallel_for du modèle Intel TBB parallélise une boucle for en décomposant l’espace d’itération en chunks et en exécutant chacun de ces chunks dans un thread distinct. Voici un exemple de fonction Intel IPP qui a été threadée avec Intel TBB et une fonction lambda. Figure 1. La fonction ippiSet_8u_C1R d’Intel IPP donne une valeur spécifique aux éléments d’un tableau d’entiers 8 bits non signés, lequel tableau représente normalement un morceau d’image. Ce morceau d’image sur lequel travailler est dénommé la région d’intérêt ou ROI. Les fonctions Intel IPP qui prennent en charge les ROI se reconnaissent à la présence d’un descripteur R dans leur nom. La fonction parallel_for opère avec une classe de modèles fournie par Intel TBB et dénommée blocked_range<T>. Cette classe décrit un espace d’itération unidimensionnel sur le type T. Il s’agit essentiellement de la plage des données qui sera décomposée et exécutée dans des threads individuels. La fonction ippiSet_8u_C1R prend comme paramètres une valeur, le pointeur de départ de la roI, la distance en octets entre les lignes de la ROI et une structure qui décrit la taille de la ROI. En passant la hauteur en lignes de la ROI au modèle blocked_range, nous avons donné ordre à l’instruction parallel_for de décomposer l’espace d’itération en lignes ROI. Puisque blocked_range décompose l’espace d’itération en plusieurs sous-espaces, nous devons ajuster la taille ippiSet_8u_C1R de la ROI inline void inl_ippiSet_8u_C1R(const Ipp8u value, Ipp8u* pDstROI, int dstStep, IppiSize _roisize) { parallel_for( blocked_range<int> (0,_roisize.height), [value, pDstROI, dstStep, _roisize ] (const blocked_range<int> &r) { IppiSize roisize = {_roisize.width, r.end() - r.begin()}; ippiSet_8u_C1R( value, &pDstROI[ dstStep * r.begin()], dstStep, roisize); }, auto_partitioner()); } Figure 1 8 Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice. tHe Parallel unIverSe donnée en entrée à celle du sous-espace de la ROI sur laquelle nous travaillons. Nous devons également déplacer le pointeur d’entrée vers le tableau ROI pour qu’il pointe sur la ROI du sous-espace en indiquant l’index approprié au tableau ROI. Grâce à une fonction lambda comme deuxième paramètre de parallel_ for, nous pouvons éviter d’écrire un objet fonction de style STL à l’extérieur de l’instruction parallel_for et placer la totalité du code dans le parallel_for. En outre, la fonction wrapper inl_ippiSet_8u_C1R est effectuée en ligne pour tenter d’éviter le coût d’un appel supplémentaire à une fonction. L’encapsuleur Intel TBB fournit une version parallèle fiable, portable et évolutive de l’opération. La fonction Intel IPP fournit des optimisations de bas niveau basées sur les fonctionnalités disponibles du processeur comme Streaming SIMD Extensions (SSE) et d’autres jeux d’instructions optimisés. Intel Cilk Plus est une extension de C et de C++, qui est implémentée par Intel® C++ Compiler et qui procure un moyen rapide, facile et fiable d’ajouter le threading aux applications. Intel Cilk Plus est destiné aux développeurs C++ qui écrivent des applications parallèles de boucles et de tâches simples. En associant des fonctions de vectorisation au parallélisme de tâches et de données de type boucle haut niveau, cet outil offre de riches possibilités. Il est possible d’utiliser un encapsuleur de fonctions construit à l’aide d’Intel Cilk Plus à la place d’un encapsuleur Intel TBB pour threader l’appel Intel IPP. Voici un exemple de la même fonction Intel IPP qui a été threadée à l’aide d’Intel Cilk Plus. Figure 2. Dans cet exemple, l’on utilise le mot clé cilk_for pour paralléliser la boucle for d’origine afin qu’elle puisse s’étendre sur plusieurs cœurs. Une boucle cilk_for remplace la boucle for C++ d’origine en permettant à des itérations de boucle de s’exécuter en parallèle. Dans la boucle cilk_for, les données de la roI sont traitées une ligne après l’autre de manière à ce que la hauteur de la ROI ait la valeur de un. Mais Intel Cilk Plus divisera le travail à effectuer dans la boucle de manière à ce que plusieurs lignes puissent être traitées par le même thread. Tout comme Intel TBB, Intel Cilk Plus utilise un planificateur de tâches workstealing qui assure l’équilibrage des charges et empêche le surabonnement des threads matériels disponibles. tHe Parallel unIverSe BLOG highlights Utiliser la fonction Community Preview de la classe graph d’Intel® Threading Building Blocks : une implémentation du dîner des philosophes Par MICHael voSS La version 3.5 d’Intel® Threading Building Blocks a vu l’introduction de la classe graph en tant que fonction Community Preview (CP). Un post de présentation donne une vue d’ensemble de la classe et des nœuds qu’il est possible d’utiliser avec cette classe. Vous pouvez télécharger sur www.threadingbuildingblocks.org la version open-source de cette release et vous êtes encouragé à faire connaître votre feedback concernant graph via le forum. Dans un précédent post, j’ai fourni un exemple qui créait un simple graphe de message. Dans le présent post, je décris un exemple plus compliqué qui met en lumière quelques fonctionnalités intéressantes de l’API. Cet exemple va montrer : • comment utiliser la fonction run de graph • comment mélanger des puts explicites avec des edges explicites • la nature non gloutonne de join_node Dans ce post, je vais fournir une implémentation du problème du dîner des philosophes. Le problème est le suivant : plusieurs philosophes sont assis à la même table. Chacun d’entre eux doit réfléchir et manger, mais il ne peut faire qu’une seule chose à la fois. 10 La méthode consistant à utiliser les encapsuleurs Intel TBB ou Intel Cilk Plus pour threader de manière externe les fonctions Intel IPP peut être utilisée pour un grand nombre d’autres fonctions Intel IPP moyennant une adaptation appropriée des paramètres passés auxdites fonctions. Les fonctions Intel IPP sont thread safe, ce qui fait que, dès lors que les données en entrée sont protégées, il n’y a pas de danger de blocages ou d’accès concurrents lorsque la même fonction Intel IPP est appelée depuis des threads différents. Cela est dû au fait que les fonctions Intel IPP n’utilisent pas de variables globales internes. Il ne peut pas se produire de changements d’état lorsque la même fonction Intel IPP, qui a été appelée sur un thread, est appelée depuis un autre thread avec des paramètres différents. En outre, les encapsuleurs de threading peuvent être utilisés avec la bibliothèque threadée d’Intel IPP si la parallélisation au sein de la bibliothèque a été désactivée à l’avance. Il suffit pour cela d’appeler l’API Intel IPP ippSetNumThreads avec un paramètre de 1. Et de plus, il est possible d’imbriquer les constructs Intel TBB et Intel Cilk Plus. Vous pouvez, par exemple, utiliser un appel cilk_for d’Intel Cilk Plus à l’intérieur d’un appel à parallel_for d’Intel TBB, et inversement. Et pour finir, Intel Composer XE et Intel C++ Composer XE sont disponibles aussi bien sur Linux* que sur Microsoft Windows*. Si vous êtes sur plate-forme Microsoft Windows et que vous utilisez Microsoft Visual Studio*, il est facile d’ajouter à votre application la prise en charge d’Intel TBB et d’Intel IPP. Dans Microsoft Visual Studio* 2010, éditez les propriétés du projet, sélectionnez l’élément Intel Performance libraries dans Propriétés de configuration, puis sélectionnez Oui dans les deux listes déroulantes Intel Integrated Performance Primitives et Intel Threading Building Blocks. Il ne vous reste plus qu’à inclure les headers Intel IPP et Intel TBB dans le code de votre application. Intel Composer XE et Intel C++ Composer XE combinent des compilateurs optimisés avec des bibliothèques hautes performances, une vectorisation avancée et Intel Parallel Building Blocks, ce qui accélère et simplifie le threading et les performances sur Linux et sur Microsoft Windows avec le même code de base. Les technologies Intel PBB présentes dans Intel Composer XE et dans Intel C++ Composer XE étant compatibles avec la bibliothèque Intel IPP, les développeurs peuvent les utiliser pour créer des solutions logicielles sur mesure extensibles sur plusieurs cœurs. FIgure 3. o Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice. tHe Parallel unIverSe inline void inlc_ippiSet_8u_C1R(const Ipp8u value, Ipp8u* pDstROI, int dstStep, IppiSize _roisize) { cilk_for( int i=0; i < _roisize.height; i++) { IppiSize roisize = {_roisize.width, 1}; ippiSet_8u_C1R( value, &pDstROI[ dstStep * i], dstStep, roisize); }; } Figure 2 Figure 3 Pour davantage d’informations, voir les liens ci-dessous : Intel® Parallel Studio XE—http://software.intel.com/en-us/articles/intel-parallel-studio-xe Intel® Composer XE and Intel C++ Composer XE—http://software.intel.com/en-us/articles/intel-composer-xe Intel® Parallel Building Blocks—http://software.intel.com/en-us/articles/intel-parallel-building-blocks Intel® Cilk Plus—http://software.intel.com/en-us/articles/intel-cilk-plus Tm Intel® Integrated Performance Primitives—www.intel.com/software/products/ipp Intel® Threading Building Blocks—www.intel.com/software/products/tbb LES INFORMATIONS CONTENUES DANS CE DOCUMENT SONT FOURNIES EN LIEN AVEC DES PRODUITS INTEL. LA SOCIÉTÉ INTEL N’ACCORDE AUCUNE LICENCE EXPRESSE, NI IMPLICITE, PAR FORCLUSION OU AUTRE SUR UN DROIT QUELCONQUE DE PROPRIÉTÉ INTELLECTUELLE. À L’EXCEPTION DES DISPOSITIONS PRÉVUES AUX CONDITIONS GÉNÉRALES DE VENTE D’INTEL POUR LESDITS PRODUITS, INTEL DÉCLINE TOUTE RESPONSABILITÉ ET EXCLUT TOUTE GARANTIE EXPLICITE OU IMPLICITE SE RAPPORTANT À LEUR VENTE OU À LEUR UTILISATION. INTEL DÉCLINE NOTAMMENT TOUTE RESPONSABILITÉ ET TOUTE GARANTIE CONCERNANT LEUR ADÉQUATION À UN USAGE PARTICULIER, LEUR QUALITÉ LOYALE ET MARCHANDE, LA CONTREFAÇON DE TOUT BREVET, LA VIOLATION DE DROITS D’AUTEUR OU D’AUTRES DROITS DE PROPRIÉTÉ INTELLECTUELLE. SAUF ACCORD ÉCRIT D’INTEL DANS CE SENS, CES PRODUITS NE SONT PAS À UTILISER DANS UN CONTEXTE OÙ LEUR DÉFAILLANCE RISQUERAIT DE CONDUIRE À DES PRÉJUDICES CORPORELS OU À LA MORT. Intel se réserve le droit de modifier à tout moment sans préavis les spécifications et les descriptions de ses produits. Les concepteurs ne doivent pas se fier à l’absence ou aux caractéristiques de fonctionnalités ou d’instructions marquées comme « réservées » ou « non définies ». Intel se réserve la possibilité de compléter ses définitions à l’avenir et ne saurait être tenue responsable de quelque manière que ce soit pour les conflits et les incompatibilités découlant des modifications qui y seront apportées alors. Les informations fournies ici étant susceptibles de modification sans préavis, il est déconseillé de s’en servir comme base pour mener à terme un projet effectif. Les produits décrits dans le présent document peuvent comporter des défauts ou erreurs de conception, connus sous le nom d’errata, susceptibles de faire s’écarter le produit des spécifications publiées. La liste des errata déjà identifiés peut être fournie sur demande. Avant de passer commande d’un produit, interrogez votre interlocuteur Intel local ou votre distributeur Intel pour connaître les spécifications les plus récentes. Des copies des documents comportant un numéro d’ordre et référencés dans ce document, ou d’autres documents Intel, peuvent être obtenues en appelant le +1 800-548-4725 ou en allant sur : http://www.intel.com/design/literature.htm tHe Parallel unIverSe Intel® array BuIldInG BloCkS par Zhang Zhang 12 Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice. tHe Parallel unIverSe Intel® Array Building Blocks (Intel® ArBB) est une solution de programmation parallèle conçue spécifiquement pour le parallélisme de données dynamiques. C’est le tout dernier composant d’Intel® Parallel Building Blocks (Intel® PBB), qui inclut également Intel® Threading Building Blocks (Intel® TBB) et Intel® Cilk™ Plus. Ce qui donne à Intel® arBB son caractère unique, c’est un système de runtime capable d’effectuer de la compilation reciblable et dynamique. Le système de runtime comprend une machine virtuelle (VM) avec un compilateur JIT capable de s’adapter à l’architecture cible en générant dynamiquement du code parallélisé, vectorisé et optimisé. Par-dessus cette VM, Intel ArBB est implémenté en tant que langage embarqué dont la syntaxe est implémentée comme API de bibliothèques C++ compatible avec la norme C++ ISO. Le modèle de programmation imposé par cette aPI prend en charge le parallélisme structuré, déterministe et de données race-free. Les développeurs programmant en Intel ArBB se concentrent sur les algorithmes. Ils n’ont pas besoin pour obtenir de bonnes performances de se préoccuper des détails architecturaux de bas niveau, comme les instructions SIMD, la gestion des threads et les fonctions intrinsèques. C’est le système de runtime qui s’en charge. Cela dit, il y a quand même certaines choses qu’un programmeur peut faire pour aider le système de runtime à générer du code hautes performances. Également, il y a des zones de l’API Intel ArBB qui nécessitent d’être bien comprises si l’on veut éviter des erreurs. Cet article récapitule ces conseils en les expliquant à l’aide d’exemples de code. CoNSEIL N° 1 : Exprimer le parallélisme La première question que pose un programmeur qui veut écrire un algorithme à l’aide d’Intel ArBB est : « comment exprimer le parallélisme ? ». Conçu pour être un langage convenant au parallélisme des données, Intel ArBB permet de deux manières d’exprimer le parallélisme à un niveau élevé. 1. en utilisant directement des opérations vectorielles sur des collections de données Une opération vectorielle est une fonction qui prend des conteneurs comme paramètres. Le parallélisme est réalisé lorsqu’on utilise ces opérations car les calculs sur les éléments du conteneur sont soit indépendants, soit ont des stratégies connues d’implémentations parallèles. Prenons par exemple le calcul des distances euclidiennes entre deux points dans un espace à m dimensions. La distance entre ces points est calculée à l’aide de la formule : d= 1/2 m ∑ | x –y i i | 2 i=1 Supposons que nous avons également n points. Dans ce cas, le résultat inclura n distances. Pour programmer cela, l’on pourra utiliser des conteneurs denses 2D qui représenteront une collection de points, dont chacun nécessitera plusieurs coordonnées. La largeur des conteneurs denses 2D pourra être n, le nombre de points, tandis que la hauteur pourra être la dimensionnalité m des points. Le code est montré à la figure 4 La fonction de distance lit et opère sur les deux conteneurs (X et Y) pris comme un tout et elle écrit le résultat vers un autre conteneur (d) pris lui aussi comme un tout. 2. en appliquant des fonctions élémentaires aux collections de données Une fonction élémentaire (c’est-à-dire, une fonction noyau) est écrite pour agir sur des éléments de données pris individuellement, par opposition aux collections de données. Une fonction élémentaire std::size_t length = N, dim = M; dense<f64, 2> vec_X(length, dim), vec_Y(length, dim); void distance(dense<f64, 2> X, dense<f64, 2> Y, dense<f64>& d) { dense<f64, 2> sqdiff = (X ñ Y) * (X ñ Y); dense<f64> s = add_reduce(sqdiff, 1); d = sqrt(s); } Figure 4. Utilisation d’opérations vectorielles pour exprimer le parallélisme. tHe Parallel unIverSe peut être invoquée, en parallèle, sur tous les éléments d’un conteneur à l’aide de l’opérateur arbb::map qui mappe la fonction dans l’ensemble du conteneur. La figure 5 montre un exemple de calcul de l’ensemble de Mandelbrot dans le plan complexe. La fonction noyau évalue un polynôme quadratique pour un nombre complexe individuel. Puis l’opérateur arbb::map prend comme argument un pointeur vers cette fonction noyau en le mappant sur tous les éléments des conteneurs denses 2D utilisés (D et C). Vous noterez que le _for utilisé ici est un construct de flux de contrôle sériel agissant sur un élément du tableau d’entrée, et qu’il ne s’agit pas d’un for parallèle. CoNSEIL N° 2 : Programmer en vue des performances La machine virtuelle Intel ArBB procède à de nombreux types d’optimisations pendant la génération du code. Tous sont transparents pour l’utilisateur. Cela n’empêche pas l’utilisateur d’adopter un ensemble de bonnes pratiques qui permettront encore plus d’optimisations et qui aideront la machine virtuelle à générer du code efficace. 1. utilisez arbb::expect_size pour une bonne allocation de mémoire et une bonne distribution des données en mémoire cache. Intel arBB comporte un modèle de gestion isolée de la mémoire dans lequel les objets conteneurs Intel ArBB sont alloués et gérés dans un espace mémoire distinct des objets C++ normaux. La raison en est double : sécurité des données d’une part et, de l’autre, motifs de performances. Dans les cas où la taille d’un conteneur est connue avant qu’il ne soit passé à une fonction, le runtime peut pré-allouer la mémoire, découper les données en tranches et les distribuer d’une manière qui permette une utilisation efficace du cache, la vectorisation et le multithreading. Tout ce que l’utilisateur a à faire est de communiquer au compilateur JIT la taille prévue à l’aide d’arbb::expect_size. La liste 3 montre des exemples où les tailles prévues sont communiquées pour des conteneurs denses 1D, 2D et 3D. Les instructions arbb::expect_size doivent venir en premier lieu dans les fonctions qui prennent les paramètres des conteneurs Intel ArBB. Les tailles doivent être indiquées pour chacune des dimensions du conteneur. Elles peuvent être spécifiées sous la forme de constantes entier, de variables C++ ou d’expressions qui s’évaluent en un entier. À noter : les tailles peuvent être calculées lors de l’exécution, mais la taille servant à construire un closure Intel ArBB et la taille effectivement utilisée lorsque le closure est invoqué doivent correspondre. arbb::expect_size(1d_dense, width); arbb::expect_size(2d_dense, width, height); arbb::expect_size(3d_dense, width, height, depth); Figure 6. Communiquer les tailles attendues. 2. Préférez la mémoire gérée par Intel arBB pour éviter les copies superflues de données. Il existe deux manières de créer un conteneur : lier par bind un descripteur Intel ArBB à un tableau C++ existant ou laisser Intel ArBB le créer entièrement dans l’espace de la mémoire gérée. La première approche facilite le travail avec des données C++ existantes, mais elle oblige le runtime 1) à copier les données vers l’espace de la mémoire gérée avant une opération et 2) à rapatrier les données dans l’espace d’origine à la fin de l’opération. Les transferts supplémentaires de données ont un impact sur les performances, sans compter qu’ils peuvent également nécessister une synchronisation supplémentaire. L’autre approche, utiliser la mémoire gérée d’Intel arBB, permet aux données associées de résider dans l’espace mémoire du runtime pendant toute la durée de vie du conteneur. Aucune copie des données entre l’espace de la mémoire gérée et celui de la mémoire normale n’a lieu, sauf spécification explicite. Également, le runtime peut mieux gérer les besoins d’alignement (qui, en fait, peuvent être spécifiques à la plate-forme matérielle utilisée). Les figures 7 et 8 montrent des exemples des deux approches. static const int max_count = 1000; // kernel function void mandel(i32& d, std::complex<f32> c) { i32 i; std::complex<f32> z = 0.0f; _for (i = 0, i < max_count, i++) { _if (abs(z) >= 2.0f) { _break; } _end_if; z = z*z + c; } _end_for; d = i; } // use map() to invoke the kernel function void doit(dense<i32, 2>& D, dense<std::complex<f32>, 2> C) { map(mandel)(D,C); } // from within C++ code call(doit)(dest, pos); Figure 5. Utilisation de l’opérateur map pour appliquer une fonction élémentaire à chacun des éléments d’une collection de données. 14 http://software.intel.com/en-us/articles/optimization-notice tHe Parallel unIverSe dense<f32> a(1024), b; // init ‘a’ using write range range<f32> ra = a.write_only_range(); for (size_t i = 0; i < ra.size(); ++i) { ra[i] = . . .; } // copy in of ‘a’ call(fun1)(a, b); // NO copy out of ‘b’ // NO copy in of ‘a’ call(fun2)(a, b); // NO copy out of ‘b’ // get data out of ‘b’ when we need it const_range<f32> rb = b.read_only_range(); std::vector<float> result(rb.size()); std::copy(rb.begin(), rb.end(), result.begin()); Figure 7. Préférer la mémoire gérée par ArBB. dense<f32> a, b; bind(a, c_arr, 1024); bind(b, c_brr, 1024); // copy in of ‘a’ call(fun1)(a, b); // sync; copy out of ‘b’ // copy in of ‘a’ call(fun2)(a, b); // sync; copy out of ‘b Figure 8. L’interface The bind est commode, mais peut donner lieu à des copies supplémentaires. 3. utilisez modérément les opérations collectives. Les opérations collectives (réductions, scans, collectes, dispersions et permutations) sont nécessaires pour l’implémentation d’un grand nombre d’algorithmes. Mais elles introduisent fréquemment dans les flux de calculs des irrégularités qui risquent de nécessiter des synchronisations. Les synchronisations peuvent considérablement diminuer les possibilités pour le runtime d’effectuer des optimisations sur une grosse portion du code. Les bonnes règles pour utiliser les opérations collectives sont les suivantes : > à n’utiliser qu’avec modération et uniquement si nécessaire. > dans la mesure du possible, l’opération collective doit figurer au début ou à la fin de la fonction qui l’invoque 4. Utilisez la fonction la plus spécifique afin d’éviter les dépendances de données inutiles. Pour aider le runtime à générer du code efficace, les programmeurs doivent éviter d’écrire du code qui introduit des dépendances de données inutiles. Cela signifie deux choses. Tout d’abord, si une opération peut être accomplie en une seule étape à l’aide d’un opérateur spécialisé, elle ne doit pas être effectuée en plusieurs étapes avec des opérations plus générales. Ensuite, les copies intermédiaires de conteneurs sont à éviter autant que possible. En particulier, ne réutilisez pas sans nécessité une variable temporaire, tout particulièrement si vous n’actualisez qu’une partie d’une collection. Introduisez une nouvelle variable temporaire pour les opérations disjointes du point de vue logique. tHe Parallel unIverSe La figure 9 montre trois manières équivalentes de restreindre à une plage les valeurs présentes dans un conteneur. Les deux premières ont toutes les deux besoin de deux instructions. Mais, la première introduit des copies shadow intermédiaires du conteneur qui ne sont actualisées qu’en partie, et la seconde comporte des dépendances sérielles inutiles. Par contraste, la troisième méthode parvient au même résultat en utilisant une seule instruction spécialisée et a donc plus de chances de produire un code optimal. dense<f32> x = ..; // dep. between ‘x’ copies x = select(x < 0.0f, 0.0f, x); x = select(x > 255.f, 255.f, x); // dep. between ‘x’ copies x = max(0.0f, x) x = min(255.f, x); // Optimal x = clamp(x, 0.0f, 225.f) Figure 9. Éviter les dépendances de données inutiles et utiliser l’opération la plus spécialisée possible. CoNSEIL N° 3 : Utiliser correctement _for pour le flux de contrôle sériel Il arrive que les utilisateurs croient à tort que la boucle _for est parallélisée. En fait, la boucle _for, et tous les autres constructs de boucle fournis par Intel ArBB, sont des boucles sérielles. Les itérations d’une boucle _for sont exécutées de manière séquentielle. Intel ArBB ne parallélise pas automatiquement les boucles _for. En d’autres termes, la boucle _for ne peut pas servir à exprimer le parallélisme des données Reportez-vous au conseil n° 1 pour savoir comment exprimer correctement le parallélisme dans Intel ArBB. La boucle _for est conçue pour exprimer de manière sérielle un calcul itératif dépendant. Il s’agit du cas où un calcul doit être effectué de manière incrémentielle, l’étape en cours dépendant du résultat de l’étape précédente. Un bon exemple de cela est le calcul stencil itératif (comme celui que l’on trouve dans la dissipation de la chaleur), illustré figure 10. Dans ce code, chaque étape d’actualisation à base de stencil est parallélisée grâce à l’utilisation de l’opérateur arbb::map. mais l’actualisation doit se faire plusieurs fois en séquence pour le calcul graduel de la solution. void apply_stencil(dense<f64, 2>& grid, i32 iterations) { _for(i32 i = 0, i < iterations, ++i) { map(stencil)(grid); } _end_for } Figure 10. Utilisation de la boucle _for pour exprimer un calcul itératif sériel. 16 Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice. tHe Parallel unIverSe CoNSEIL N° 4 : Utiliser des expressions Intel ArBB pour le flux de contrôle Intel arBB Les instructions de flux de contrôle (_for, _while, _do_until, _if/_else, etc.) d’Intel ArBB doivent être construites à l’aide d’expressions de condition, tout comme leurs contreparties en C++. Mais les expressions de condition doivent être des types Intel ArBB. C’est en effet une erreur répandue que d’utiliser une variable conditionnelle de type C++. Ainsi, la figure 11 montre la mauvaise et la bonne manière de construire une instruction _for. Pour comprendre cela, il suffit de se rappeler que les instructions avec des types C++ sont exécutées une fois pour toutes au moment de JIT (c’est-à-dire, au moment de la capture). L’effet de ces instructions est impulsé dans le code qui est généré et il reste invariable pendant toute l’exécution ultérieure d’Intel ArBB. _for(int i = 0, i < iterations, ++i) { // WRONG . . . } _end_for _for(i32 i = 0, i < iterations, ++i) { // CORRECT . . . } _end_for Figure11. Ne pas utiliser de type C++ pour les variables conditionnelles. CoNSEIL N° 5 : Sortir proprement du flux de contrôle Intel arBB Une autre erreur très répandue, concernant les flux de contrôle Intel ArBB, consiste à utiliser une instruction return pour sortir d’une branche _if/_else ou d’une boucle Intel ArBB. L’utilisation d’instructions return dans l’instruction de flux de contrôle Intel ArBB n’est pas prise en charge. Cela mène à des erreurs du runtime puisque les instructions de flux de contrôle Intel ArBB ne sont pas correctement imbriquées. Heureusement, il existe des solutions faciles dans ce cas. Dans le cas de constructs de boucle (_for, _while et _do/_until), Intel ArBB fournit l’instruction _break qui permet de mettre fin correctement à une boucle. Dans le cas de branches _if/_else, les utilisateurs doivent restructurer le code pour éviter d’avoir besoin d’une instruction return. Les exemples de la figure 12 illustrent l’instruction _break et la manière correcte de sortir d’une branche. BLOG BLO L LO G highlights TBB 3.0 et l’affinité de processeurs Par andrey MaroCHko La semaine dernière, j’ai commencé à vous parler de quelques nouvelles fonctionnalités utiles du planificateur de tâches de TBB 3.0 Update 4 et nous avons discuté de la prise en charge des groupes de processeurs, une extension de l’API Win32 disponible dans l’édition 64 bits de Windows* 7. Le but principal des groupes de processeurs est d’étendre les possibilités de Win32 pour permettre aux applications d’exploiter plus que 64 CPU logiques. De par sa nature, cette fonctionnalité est assez proche du concept classique d’affinité de processeurs, en transformant, pour l’essentiel, un modèle plat d’affinité de processeurs en un modèle hiérarchique. L’on commence par définir l’affinité d’un thread pour un groupe de processeurs, puis l’on peut appliquer un masque conventionnel d’affinités pour lier le thread à un sous-ensemble de CPU dans le groupe courant. Une relation aussi évidente entre les deux concepts m’a rappelé une idée que l’équipe TBB avait lancée il y a déjà quelque temps. Pour être tout à fait franc, l’idée s’était imposée à nous suite au problème rencontré par l’un de nos clients qui essayait de fusionner TBB et mPI sur un système NUMA. Leurs processus MPI s’exécutaient sur des nœuds NUMA multicœurs et ils souhaitaient paralléliser les calculs au sein du processus MPI à l’aide de TBB. Le problème sur lequel ils butaient était que TBB, lorsqu’il était initialisé par défaut, instanciait son pool de threads de travail selon le nombre total d’accès simultané du système, sans tenir compte du nombre de cœurs sur le nœud NUMA courant. Bien évidemment, le résultat était au rendez-vous : surabonnement et chute des performances. Heureusement, dans ce cas particulier, les développeurs disposaient d’un contrôle total sur la partie TBB du code, et ils ont été en mesure de résoudre le problème en spécifiant le nombre souhaité de threads via le constructeur tbb::task_ scheduler_init. Mais que se passe-t-il si votre code s’appuie sur l’initialisation automatique du planificateur de tâches ? Ou, pire, si vous ne soupçonnez même pas la présence de TBB parce qu’il est utilisé en interne par un composant tierce partie, qui, très vraisemblablement, l’initialise par défaut (s’il n’est pas configurable via une quelconque API) ? tHe Parallel unIverSe débogueur ou à utiliser les instructions printf ou std::cout avec la variable d’environnement ARBB_OPT_LEVEL définie à O0. Ces deux méthodes sont équivalentes puisque le débogage et ARBB_OPT_ LEVEL=O0 placent l’exécution en mode émulation. Dans ce mode, les opérations Intel ArBB sont émulées à l’aide d’une exécution C++ normale et non d’une compilation JIT. Ce mode n’est là qu’à des fins de débogage et ne procure aucun avantage en termes de performances. Une fois les valeurs inspectées, ARBB_OPT_LEVEL doit être ramené à O2 ou à O3 pour récupérer les avantages de performances. Figure 13. // Break out of a loop using _break _for(int i = 0, i < iterations, ++i) { . . . _break; } _end_for // This leads to runtime error _if(x == 0) { return; CoNSEIL N° 7 : } _else { La conversion implicite de types n’est pas prise en charge . . . } _end_if // This is OK _if(x != 0) { . . . } _end_if Figure 12. Sortir correctement des instructions de flux de contrôle d’Intel ArBB. CoNSEIL N° 6 : N’inspecter les valeurs des variables Intel arBB qu’en mode débogage Une variable Intel ArBB est un descripteur opaque qui ne détient une valeur que lors de l’exécution du code généré. Elle ne contient aucune valeur lors de la « capture » (c’est-à-dire, lors de JIT). En conséquence de quoi, l’utilisation d’instructions printf ou std::cout pour inspecter les valeurs des variables Intel ArBB au sein de fonctions appelées depuis un call ne donne rien, car ces instructions ne sont exécutées qu’au moment JIT alors qu’elles ne comportent pas de valeurs (voir la figure 13). La bonne manière d’inspecter la valeur d’une variable Intel ArBB consiste à utiliser un void arbb_func(i32 var) { . . . printf (ì%dî, var); printf (ì%dî, value(var)); . . . } Les programmeurs C/C++ sont souvent surpris qu’Intel ArBB n’effectue pas de conversions automatiques des types Intel ArBB. ainsi, la figure 14 montre une définition de fonction qui essaie de multiplier par un facteur entier un conteneur de virgules flottantes. Si ce code avait été écrit pour des types C/ C++, le compilateur aurait automatiquement « promu » le facteur entier en valeur de virgule flottante. En revanche, dans Intel ArBB, du code est requis pour un transtypage explicite du facteur entier. C’est à dessein qu’Intel ArBB ne prend pas en charge la conversion implicite de types car celle-ci serait trop onéreuse dans le contexte de la vectorisation (puisqu’elle risquerait de requérir des changements de files, génération de valeurs intermédiaires, etc.) et trop propice à des erreurs. Fondamentalement, les transtypages implicites introduiraient de manière invisible des opérations supplémentaires et potentiellement onéreuses et la philosophie d’Intel arBB est précisément que ce type d’opération doit être explicite de manière à pouvoir être contrôlé. Les programmeurs peuvent toujours effectuer un transtypage explicite. Les transtypages de types C et C++ fonctionnent, mais le dernier, le transtypage C++ (celui qui est illustré dans l’exemple), est préféré en général. Il est à noter que cette règle s’applique également aux constantes, ce qui fait que les constantes doivent être du bon type. Ainsi, une valeur de un en virgule flottante simple précision devra être écrite sous la forme de 1.0f et non de 1.0. La dernière en effet est de type double précision. Figure 14. // Does not work in O2, O3 // Does not work in O2, O3 Figure 13. Cette utilisation de printf ne fonctionne pas en modes o2 et o3. void arbb_func(i32 factor, dense<f64>& vec) { vec = vec * factor; vec = vec * std::static_cast<f64>(factor); } // WRONG // CORRECT Figure 14. Intel ArBB ne prend pas en charge les transtypages implicites. 18 Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice. tHe Parallel unIverSe CoNSEIL N° 8 : Attention aux conventions d’indexation des conteneurs Intel arBB multidimensionnels Les conteneurs multidimensionnels sont disposés dans la mémoire en ordre « row-major ». Mais les conventions d’indexation ne sont pas les mêmes pour Intel ArBB que pour C/C++. Pour être précis, dans Intel ArBB, un conteneur multidimensionnel (c’est-à-dire, un conteneur dense 2D ou 3D) est toujours indexé dans l’ordre largeur, hauteur et profondeur. Cela a des implications au moins dans les cas suivants : > Lorsqu’on déclare ou que l’on fait un bind d’un conteneur multidimensionnel, cela exige que la taille de chacune des dimensions soit spécifiée dans l’ordre suivant : la largeur avant la hauteur et la hauteur avant la profondeur. Vous pouvez vous représenter la chose comme un ordre x, y, z. Voir les exemples de la figure 15. > Lorsqu’on accède à un élément individuel à l’aide d’index, l’index de colonne vient avant l’index de ligne, et l’index de page vient en dernier. Voir l’exemple de la figure 16. > Lorsqu’on accède à un élément voisin à l’aide de l’opérateur arbb::neighbor, le décalage de colonne passe avant celui de ligne, qui lui-même vient avant de celui de page. Voir les exemples de la figure 17. void stencil(f64& e) { f64 N = neighbor(e, f64 S = neighbor(e, f64 W = neighbor(e, f64 E = neighbor(e, . . . } 0, -1); 0, +1); -1, 0); +1, 0); Figure 17. Accéder à des cellules voisines dans un dense 2D. résumé Intel ArBB offre une interface qui facilite l’écriture de code pouvant opérer en parallèle sur des collections de données. La syntaxe permet un code structuré, lisible et gérable et elle diminue les temps de développement. Le runtime fournit une portabilité et une extensibilité des performances sur des unités SImD, sur plusieurs cœurs et même sur des accélérateurs. Une bonne compréhension de la syntaxe et une utilisation correcte peuvent nous aider à exploiter à plein le potentiel de productivité et de performances. o double c_mat[NROW][NCOL]; dense<f64, 2> matA(NCOL, NROW); // Same shape as c_mat dense<f64, 2> matB; bind(matB, &c_mat[0][0], NCOL, NROW);// Note the order of NCOL and NROW Figure 15. Déclarer et créer un bind pour un conteneur multidimensionnel. void arbb_func(dense<f64, 2>& m) { . . . f64 e = m(2, 3); . . . } Figure 16. Accéder à un élément individuel d’un dense 2D. Pour plus d’informations sur les techniques de programmation d’Intel ArBB, voir les liens ci-dessous : Base de connaissances Intel® ArBB : http://software.intel.com/en-us/articles/intel-array-building-blocks-kb/all/1/ Forum Intel® en ligne : http://software.intel.com/en-us/forums/intel-array-building-blocks/ LES INFORMATIONS CONTENUES DANS CE DOCUMENT CORRESPONDENT AUX PRODUITS INTEL. LA SOCIÉTÉ INTEL N’ACCORDE AUCUNE LICENCE EXPRESSE, NI IMPLICITE, PAR FORCLUSION OU AUTRE SUR UN DROIT QUELCONQUE DE PROPRIÉTÉ INTELLECTUELLE. À L’EXCEPTION DES DISPOSITIONS PRÉVUES AUX CONDITIONS GÉNÉRALES DE VENTE D’INTEL POUR LESDITS PRODUITS, INTEL DÉCLINE TOUTE RESPONSABILITÉ ET EXCLUT TOUTE GARANTIE EXPLICITE OU IMPLICITE SE RAPPORTANT À LEUR VENTE OU À LEUR UTILISATION. INTEL DÉCLINE NOTAMMENT TOUTE RESPONSABILITÉ ET TOUTE GARANTIE CONCERNANT LEUR ADÉQUATION À UN USAGE PARTICULIER, LEUR QUALITÉ LOYALE ET MARCHANDE, LA CONTREFAÇON DE TOUT BREVET, LA VIOLATION DE DROITS D’AUTEUR OU D’AUTRES DROITS DE PROPRIÉTÉ INTELLECTUELLE. SAUF ACCORD ÉCRIT D’INTEL DANS CE SENS, SES PRODUITS NE SONT PAS À UTILISER DANS UN CONTEXTE OÙ LEUR DÉFAILLANCE POURRAIT CONDUIRE À DES SITUATIONS DE PRÉJUDICES CORPORELS OU À LA MORT. Intel se réserve le droit de modifier à tout moment sans préavis les spécifications et les descriptions de ses produits. Les concepteurs ne doivent pas se fier à l’absence ou aux caractéristiques de fonctionnalités ou d’instructions marquées comme « réservées » ou « non définies ». Intel se réserve la possibilité de compléter ses définitions à l’avenir et ne saurait être tenue responsable de quelque manière que ce soit pour les conflits et les incompatibilités découlant des modifications qui y seront apportées alors. Les informations fournies ici étant sujettes à modification sans préavis, Ne finalisez aucune création avec cette information. Les produits décrits dans le présent document peuvent comporter des défauts ou erreurs de conception, connus sous le nom d’errata, susceptibles de faire s’écarter le produit des spécifications publiées. La liste des errata déjà identifiés peut être fournie sur demande. Interrogez votre point de vente local ou votre distributeur Intel pour obtenir les plus récentes spécifications avant de passer commande d’un produit. Des copies des documents comportant un numéro d’ordre et référencés dans ce document, ou d’autres documents Intel, peuvent être obtenues en appelant le +1 800-548-4725 ou en allant sur : http://www.intel.com/design/literature.htm 19 SucceSS Succe SSrounduP Story SUCCESS STORY Aider à garantir la meilleure qualité et les meilleures performances vidéo Intel® Parallel Studio XE aide Envivio à créer du code sûr et sécurisé La société Société : envivio Inc. Secteur d’activité : Compression vidéo « Pouvoir disposer d’un tel outil aux premiers stades du développement libère la validation des rapports de bugs banals et donne à nos ingénieurs la possibilité de programmer plus efficacement dès le tout début du cycle du produit. » Jean Kypreos ADVANCED VIDEO PROCESSING TEAM MANAGER Envivio N’importe quelle vidéo — N’importe quand, n’importe où. L’objectif d’Envivio est de rendre le contenu vidéo mondial visible par tous les spectateurs, sur n’importe quel appareil, n’importe quel réseau, à tout moment. Depuis sa fondation en 2000 en tant qu’inventeur de technologie d’encodage vidéo, Envivio a accumulé des dizaines de brevets, a été pionnier dans le domaine des méthodes de vidéo sur IP et est leader permanent dans la prise en charge des technologies émergentes. Aujourd’hui, les solutions Envivio* fournissent des millions de flux de contenu à des centaines de styles différents de téléphones mobiles, de STB et de plates-formes PC pour le compte de propriétaires de contenu, d’opérateurs de télécommunications, de sociétés de câble et de satellites et de prestataires de services mobiles, sur tous les marchés du monde. Exploitant des codecs allant du H.264 standard jusqu’aux codecs Elite et Extreme développés dans ses laboratoires, Envivio optimise l’expérience de visionnage sur tous les écrans, sur tous les réseaux. Le déploiement et le support sont assurés par une équipe mondiale familière des règles locales techniques, commerciales et légales en vigueur dans le monde entier. Le siège d’Envivio se trouve à San Francisco, avec des bureaux à Rennes (France), à Pékin, à Tokyo et à Singapour. Pour plus d’informations, allez sur www.envivio.com. la mission Augmenter la qualité du produit 4Caster C4* et réaliser la meilleure qualité vidéo, les meilleures performances et la mise sur le marché la plus rapide. le produit 4Caster C4 est une application de transcodage en temps réel qui prend en charge un canal de haute définition ou plusieurs canaux de définition standard d’encodage pour IPTV, d’encodage Internet TV jusqu’à une résolution VGA et d’encodage 3G Mobile TV. Le défi Avec la croissance en taille du code, un simple IDE ne suffit plus à suivre correctement des sections conséquentes du code. Un code plus gros génère davantage de bugs d’une complexité accrue, compromettant ainsi la fiabilité et la mise sur le marché. l’impact La probabilité de retour des bugs à l’équipe de programmation a diminué tandis que les temps de développement et de mise sur le marché se sont améliorés. 20 Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice. y Roundup Pourquoi les produits d’Envivio ont eu avantage à utiliser le parallélisme Comment Intel® Software Development Products a apporté son assistance Selon les formats, plusieurs cœurs sont nécessaires pour effectuer un seul encodage. En particulier, pour le repurposing en H.264 de contenu haute définition MPEG2, un seul cœur est insuffisant pour l’encodage en temps réel. Dans ce cas, les technologies aussi bien multicœurs que multiprocesseurs (DP) sont nécessaires pour fournir à l’application le minimum de puissance. Pour le contenu de définition standard, un haut niveau de qualité vidéo est requis pour le segment de marché de la télévision. Cette qualité est obtenue à grand renfort d’algorithmes lourds de traitement tout en se pliant à la contrainte du temps réel. En même temps, pour pouvoir conserver un niveau modulaire de densité (c’est-à-dire, 2/4 canaux de définition standard par plate-forme), un schéma de parallélisation (2/4 cœurs par canal) est obligatoire si l’on veut tirer profit des capacités de la plate-forme. La problématique de la densité est induite par l’équation économique du coût des nomenclatures : plus de canaux par plate-forme conduisent à des produits vendus plus petits. Dans les applications Envivio, le codec H.264 est le composant logiciel le plus « critique en termes de temps ». Un soin particulier est pris pour équilibrer la parallélisation de ce module. La fonctionnalité SSA d’Intel Parallel Studio XE a servi à analyser le module central du produit : l’encodeur H.264. SSA a été défini pour le maximum de sensibilité, ce qui a aidé à réduire les temps de validation flottante, tout en améliorant la qualité du produit et en facilitant la livraison dans les temps. SSA offre également une plus grande résilience au code. Cette protection a augmenté la confiance des développeurs dans le code, en rendant sûre la connexion d’une partie du logiciel à l’autre. Un code sûr et sécurisé retourne immédiatement les erreurs, prévenant ainsi les longues sessions de débogage. Utilisé au tout début du développement, SSA a corrigé des bugs avant même leur apparition, d’où un gain de temps et des économies de ressources. La combinaison avec Intel® Inspector XE, là aussi au tout début du développement, a permis d’atteindre une plus grande résilience dynamique. Par ailleurs, l’outil SSA a été facile à configurer, à lancer et à utiliser. Et, comme les résultats s’affichaient dans Intel Inspector XE, il n’y a eu qu’une seule interface à maîtriser. En outre, l’accès au code source était rapide et les problèmes pouvaient être détectés et corrigés en quelques minutes. SSa est totalement intégré au compilateur et les résultats étaient manipulables de diverses manières. La convivialité de l’interface et les filtres ont permis aux développeurs de se concentrer sur une catégorie de problèmes, tout en s’aidant d’une documentation qui clarifiait les problèmes de programmation ardus et sophistiqués. Les résultats Grâce à la fonctionnalité SSA d’Intel® Parallel Studio XE, l’analyse d’échantillons du code permet de détecter tous les bugs faussement insérés. SSA a ensuite été introduit dans le traitement avec un test réel : le cœur de l’encodage par 4Caster C4. En fonction des résultats de l’analyse, certaines sections inutilisées, mais exécutées, du code ont été supprimées, d’où une amélioration des performances. Des sections inutilisées, mais exécutées, du code ont été supprimées, d’où une amélioration des performances. Même s’il n’a été trouvé aucun exemple d’endommagement potentiel de la mémoire, un grand nombre de zones du code ont vu leur sécurité améliorée, grâce à l’ajout d’une gestion des erreurs et la traque d’erreurs potentielles de pointeur null. Un soin tout particulier a été pris avec l’interface d’entrée/sortie, du fait que le dernier test de SSA a permis de sécuriser le frontal de l’encodeur. Toute mauvaise utilisation dans le produit de ce module capital se traduira par une détection immédiate. À son premier lancement, SSA a trouvé environ 300 erreurs, la plupart en rapport à une utilisation potentielle de pointeurs. Cinq bugs critiques ont été découverts, plus trois bugs mineurs et une cinquantaine de vulnérabilités. Résultat : certaines zones détectées ont été réécrites ; la plupart du code mort a été éliminé ; et un grand nombre de pointeurs critiques ont été sécurisés. Globalement, c’est un code plus fiable qui a été remis aux intégrateurs, avec de moindres possibilités de retour de bugs à l’équipe de programmation. SucceSS Succe SSrounduP Story SUCCESS STORY Permettre une expérience de jeu immersive et réaliste sur PC The Creative Assembly s’appuie sur Intel® Software Development Products pour venir à bout des défis de threading et de graphisme dans son nouveau jeu Napoleon: Total War La société Société : the Creative assembly Secteur d’activité : Jeux vidéos « Deux choses nous ont attirés chez Intel® TBB. La première et la plus importante, c’était la facilité relative avec laquelle il pouvait s’intégrer au code sériel existant, et la seconde était la vitesse avec laquelle les programmeurs pouvaient apprendre à l’utiliser. » Yuri o’Donnell SENIOR ENGINE CODER The Creative Assembly Fondée en 1987, The Creative Assembly est un société leader de développement de jeux sur ordinateur, dont le siège est dans le Sussex (Royaume-Uni) et qui est connue surtout pour sa série Total War* de jeux de stratégie. Napoleon: Total War* est la cinquième version majeure de la franchise et, comme ses prédécesseurs, est une version uniquement pour PC. La société a également à son palmarès des réussites majeures sur la marché des consoles de jeux avec Spartan: Total Warrior* et Viking: Battle for Asgard*. De 2003 à 2005, le moteur Total War* a été utilisé pour le gameshow BBC, Time Commanders, qui a recueilli des applaudissements du monde entier. En 2005, The Creative Assembly a été acquis par SEGA. Pour plus d’informations, allez sur www.creative-assembly.co.uk. la mission Marier des batailles stratégiques en temps réel avec la vision tactique épisode après épisode, forcément plus lente, d’une carte de campagne afin de créer des jeux immersifs et réalistes auxquels les gens ont envie de jouer. le produit Napoleon: Total War est le premier d’une nouvelle branche de jeux à base historique de la franchise Total War RTS, maintes fois primée. Napoleon: Total War conservera les batailles en 3D sur terre et sur mer, leaders du genre, qui sont la marque de la franchise. La campagne est divisée en trois campagnes historiques qui racontent l’ascension et la chute de Napoléon Bonaparte au travers de ses batailles les plus célèbres. Le défi Exploiter la puissance de PC multicœurs au service du développement d’un environnement de jeu immersif et réaliste. l’impact Les programmeurs de The Creative Assembly bénéficient d’une extensibilité sur tous les cœurs fournis, ce qui, pour les jeux de stratégie, les libère de l’assujettissement aux CPU et met le moteur à l’épreuve du futur. 22 Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice. y Roundup Pourquoi les produits de The Creative Assembly ont eu avantage à utiliser le parallélisme Plus il est possible de consacrer de la puissance de traitement et de graphisme à un jeu et meilleur seront le look de ce jeu et la sensation d’immersion. La personnalisation lourde des détails individuels dans Napoleon: Total War a été rendue possible par les techniques de multithreading. Bien qu’il s’exécute sur un processeur monocœur, le moteur du jeu a été programmé en ayant à l’esprit une cible bicœur, voire plus grande, et il a été scindé en deux parties : la logique et le rendu. Ces routines ont été ensuite subdivisées en algorithmes individuels de minitâches, par exemple, l’actualisation de la géométrie des mers et le pathfinding. L’idée est qu’aucun processus n’en retienne un autre et que le jeu puisse tirer avantage du matériel disponible. Les résultats Napoleon: Total War est parvenu à créer une expérience utilisateur plus réaliste et il a considérablement augmenté la fidélité de l’expérience visuelle grâce à une meilleure animation, tout en fournissant des contraintes système bien inférieures à celles de son prédécesseur. L’équipe en est convaincue : elle n’aurait jamais pu livrer à temps sans Intel® Threading Building Blocks (Intel® TBB). L’efficacité du moteur signifie que les champs de bataille et les batailles navales du jeu peuvent être vastes et noires de monde, avec des routines d’IA pour chaque unité. Le jeu comporte des batailles avec de 10 000 à 20 000 hommes, dont chacun est créé avec un niveau de détail comparable à celui des jeux ne comportant qu’une dizaine ou une vingtaine de personnages à l’écran. L’un des nouveaux outils clés de Napoleon est un créateur d’unités personnalisées, qui permet aux designers d’ajouter des détails aux modèles. Napoleon représente l’incarnation la plus sophistiquée de la série Total War tout en réclamant moins de contraintes système que son prédécesseur. Comment Intel® Software Development Products a apporté son assistance L’équipe The Creative Assembly a largement puisé dans l’expérience des ingénieurs Intel® et dans les outils Intel® pour la conception du moteur de jeu. Intel® Thread Checker a aidé à valider chaque opération mémoire entreprise par l’équipe The Creative Assembly. La notification d’accès simultané à la mémoire partagée a permis d’identifier et de pallier les conditions d’indétermination. Se sont avérées encore plus utiles les bibliothèques Intel TBB dont les développeurs se sont servis pour paralléliser leur code. Non seulement, cela a été relativement facile d’intégrer au code sériel existant, mais les programmeurs ont rapidement été capables d’apprendre à les utiliser. Les avantages en termes de performances ne se sont pas fait attendre : ils étaient au rendez-vous au bout de quelques jours. L’un des avantages de cibler le PC, plutôt que d’écrire pour un public multiplate-forme, est qu’Intel TBB a pu être totalement intégré au moteur, d’où d’énormes économies de temps et d’argent. The Creative Assembly a évité d’avoir à écrire son propre système de file d’attente de jobs, ce qui lui a fait gagner du temps en développement, en tests et en débogage L’équipe en est convaincue : elle n’aurait jamais pu livrer à temps sans Intel TBB. Afin de réduire les conditions système requises, l’équipe s’est tournée vers Intel® Graphics Performance Analyzers. Les développeurs ont pu constater le timing de chaque appel d’API et voir le temps que cet appel prenait sur le GPU. Cela leur a permis de modifier l’état de rendu et de déterminer l’impact sur les performances. L’analyse par l’outil en temps réel du pipeline de rendu les a aidés à identifier les goulots d’étranglement et les emplacements d’overdraw dans les scènes. SucceSS Succe SSrounduP Story SUCCESS STORY Créer un nouveau standard dans les crash tests virtuels Altair fait progresser la simulation de crash frontaux avec l’aide d’Intel® Software Development Products La société Société : altair engineering, Inc. Secteur d’activité : Fabrication et industrie « Ce produit révolutionnaire fournit le lien qui manquait au design CAE dans la sécurité des véhicules. Cela, combiné à notre nouvelle approche hybride du solveur, nous a permis d’éliminer les goulots d’étranglement des temps de rotation, inhérents aux crash tests. À présent, l’optimisation multidisciplinaire des crash, la durabilité et le NVh seront capables de fournir de précieuses indications au processus de design. » Dr. Uwe Schramm CTO FOR HYPERWORkS Altair Engineering, Inc. Altair Engineering, Inc. donne à ses clients les moyens d’être innovants et de prendre des décisions grâce à une technologie qui optimise l’analyse, la gestion et la visualisation des informations métier et d’ingénierie. Société privée employant plus de 1 300 personnes, Altair a des bureaux en Amérique du Nord, en Amérique du Sud, en Europe et en Asie/Pacifique. Avec un palmarès de vingt-cinq ans de design de produits, de logiciels d’ingénierie avancée et de technologies de grid-computing, Altair ne cesse de fournir un avantage concurrentiel à ses clients dans un vaste éventail de secteurs d’activité. S’appuyant sur l’optimisation du design, la gestion des données de performances et l’automatisation des traitements, HyperWorks est une solution de simulation pour l’entreprise permettant une exploration du design et une prise rapide de décisions. Pour en savoir plus, allez sur www.altair. com et sur www.altairhyperworks.com. la mission Écrire le premier code de simulation permettant de résoudre en moins de cinq minutes une simulation de crash frontal d’un véhicule complet, avec plus d’un million d’éléments. le produit RADIOSS est un solveur FEA (finite element analysis) nouvelle génération pour des simulations linéaires et non linéaires. Il peut servir à simuler des structures, des fluides, des interactions fluides/ structures, de l’estampage de feuilles métalliques et des systèmes mécaniques. La robustesse de cette solution multidisciplinaire permet aux fabricants de maximiser la durabilité, les performances de bruit et de vibration, la résistance aux chocs, la sécurité et la fabricabilité des designs afin de mettre plus rapidement des produits sur le marché. Le défi Utiliser une programmation hybride dernier cri mêlant différentes techniques de parallélisation pour une plus grande extensibilité et des performances optimales sur un très grand nombre de processeurs. l’impact Altair a augmenté la satisfaction de ses clients en allant au-delà de ce que demandaient ces derniers en termes de performances et de temps de réalisation. 24 Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice. y Roundup Pourquoi les produits d’Altair ont eu avantage à utiliser le parallélisme Comment Intel® Software Development Products a apporté son assistance Les crash tests virtuels sont l’une des tâches les plus gourmandes en temps du processus de développement automobile. Altair souhaitait faire la démonstration de la faisabilité d’un nouveau processus d’analyse qui réduise spectaculairement les temps de simulation nécessaires aux crash tests virtuels. En termes de cycle de vie des produits, Altair cherchait à réduire les coûts de prototypage et les délais de commercialisation, deux avantages concurrentiels clés pour ses clients. La programmation massivement parallèle permet une très bonne extensibilité grâce à des techniques de décomposition de domaines et à une bibliothèque de communications MPI. Cette extensibilité tend à diminuer lorsque le nombre de processeurs augmente et que la quantité de données à calculer diminue. altair a utilisé une programmation hybride dernier cri mêlant différentes techniques de parallélisation (mPI et openmP) pour une plus grande extensibilité et des performances optimales sur un très grand nombre de processeurs. Pour réaliser cet objectif, Altair a exploité l’optimisation rendue possible par les compilateurs, les bibliothèques et les outils Intel®. Il n’existe pas de véritable autre moyen pour atteindre un niveau nécessaire de performances. Pour atteindre ses objectifs de vitesse, d’extensibilité et de performances, Altair a incorporé une série d’outils Intel Software Development : Les résultats L’objectif des cinq minutes a pu être dépassé (294 secondes avec 1 024 cœurs [128 MPI x 8 OpenMP]) avec une multiplication par 10 des performances globales. Résultat de la programmation hybride : l’extensibilité du code démontrée sur 1 024 cœurs. En outre, un nouvel algorithme, appelé Advance Mass Scaling (AMS), a diminué les coûts de calcul. Altair a vu la satisfaction de ses clients augmentée grâce au dépassement des attentes en termes de performances et de délais de réalisation. Ce dépassement est dû aux évaluations plus rapides des variantes de design et à une analyse moins longue de la sensibilité et de la robustesse des designs. Pour le marché, ce progrès peut être considéré comme une approche révolutionnaire : réduction des temps de simulation de quelques heures à quelques minutes ; possibilité de nouveaux traitements et de progrès dans les crash tests virtuels (maillages plus fins, intégration de meilleures lois matérielles aux ruptures, optimisations et dispersions, etc.). La diminution des délais de crash tests virtuels permet de diminuer spectaculairement les délais de commercialisation et les coûts. > Intel® Compilers > Intel® VTune™ Analyzer (appelé désormais Intel® VTune Amplifier™ XE) > Intel® Cluster Toolkit > Intel® Trace Analyzer and Collector > Intel® mPI Library Altair et Intel ont également pu exploiter des clusters Intel® Xeon® 5500 Series et fournir de substantielles améliorations de performances pour les simulations de crash. Cette amélioration entraînera des avantages à long terme pour l’industrie. Enfin, Intel a apporté une aide technique pour l’exécution et l’optimisation, l’accès aux ressources informatiques et le support marketing. tHe Parallel unIverSe Avertissement concernant les optimisations Les compilateurs Intel® , ainsi que les bibliothèques et outils de développement associés, peuvent inclure ou utiliser des options optimisées pour les jeux d’instructions disponibles dans les microprocesseurs Intel® et non Intel (par exemple, instructions SIMD). En revanche, le niveau d’optimisation n’est pas identique pour les processeurs non Intel. De plus, certaines options de compilation conçues pour les compilateurs Intel, y compris certaines qui ne sont pas spécifiques à la microarchitecture Intel, sont réservées aux processeurs d’Intel. Pour obtenir une description détaillée de ces options de compilation, notamment des jeux d’instructions et microprocesseurs spécifiques qu’elles impliquent, consultez la section qui y est consacrée dans les guides d’utilisation et de référence de l’outil Intel® Compiler. De nombreuses routines bibliothèques intégrées aux compilateurs Intel® sont principalement optimisées pour les processeurs Intel. Même si les compilateurs et bibliothèques intégrées à Intel® Compiler offrent des optimisations pour les processeurs Intel et non Intel, votre code et d’autres facteurs pourront disposer de performances supplémentaires avec les processeurs Intel selon les options que vous sélectionnez. Pour les optimisations qui ne sont pas uniques aux processeurs Intel, les compilateurs Intel®, ainsi que les bibliothèques et outils de développement associés, pourront ne pas bénéficier du même degré d’optimisation pour les processeurs non Intel. Ces optimisations incluent entre autres les jeux d’instructions Intel® Streaming SIMD Extensions 2 (Intel® SSE2), Intel® Streaming SIMD Extensions 3 (Intel® SSE3) et Supplemental Streaming SIMD Extensions 3 (Intel® SSSE3). Intel ne fournit aucune garantie quant à la disponibilité, la fonctionnalité ou l’efficacité des optimisations sur des microprocesseurs d’autres fabricants. Dans ce produit, les optimisations dépendantes du processeur sont conçues pour les processeurs Intel. Intel considère ses compilateurs et bibliothèques comme un excellent choix pour obtenir des performances optimales sur processeurs Intel® et non Intel, mais vous recommande toutefois d’évaluer d’autres produits afin de déterminer ceux qui répondent le mieux à vos besoins. Nous nous efforçons de proposer des produits de qualité. N’hésitez pas à nous faire part de vos remarques ou suggestions. Révision N°20101101 26 Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice. SuIteS d’outIlS Intel® HauteS PerForManCeS Atteignez des performances et une fiabilité d’application sans précédent Quel que soit votre objectif de développement, Intel a la suite d’outils hautes performances qui convient à vos besoins. Werner krotz-vogel Technical Marketing Engineer Pour les développeurs d’entreprise et d’informatique hautes performances Intel® Parallel Studio XE Pour les développeurs MPI sur clusters hautes performances Intel® Cluster Studio (ex-Intel® Cluster Toolkit Compiler Edition) Intel® Parallel Studio XE2011 regroupe dans une même suite les Intel® Cluster Studio est un package intégré d’outils de tout premier compilateurs C/C++ et Fortran plébiscités d’Intel, des bibliothèques, des ordre, contenant des compilateurs Intel C/C++ et Intel® Fortran, des fonctions d’identification des erreurs, de sécurité et de profilage, qui bibliothèques optimisées de performances, Intel® Trace Analyzer and permettent aux développeurs de booster les performances, la sécurité Collector, Intel® mPI Library et Intel® mPI Benchmarks, permettant et la fiabilité des applications de calcul intensif et d’entreprise. Intel® d’augmenter les performances MPI sur clusters Linux et Windows. C++ Studio XE offre les mêmes avantages aux développeurs qui ont seulement besoin du compilateur C++. Faites des économies en achetant des suites vous possédez déjà le logiciel ? Lorsqu’on les achète dans le cadre de suites, les composants peuvent être obtenus à des prix considérablement moindres. Pour des détails sur l’achat d’outils pris individuellement, allez sur http://software.intel.com/en-us/articles/buy-or-renew/. Si vous possédez déjà des outils logiciels d’Intel®, vous avez peut-être droit à un tarif spécial de mise à niveau. Pour les détails, allez sur http://software.intel.com/en-us/articles/intel-xeproduct-comparison/#upgrade. Téléchargez une version gratuite d’évaluation pendant 30 jours d’Intel® Software Development Products depuis www.intel.com/software/products/eval. Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice © 2011, Intel Corporation. Tous droits réservés. Intel et le logo Intel sont des marques commerciales d’Intel Corporation, aux États-Unis et dans d’autres pays. * Les autres noms et désignations peuvent être revendiqués comme marques par des tiers. Intel® HIGH-PerForManCe tool SuIteS Créez, déboguez et boostez les performances des applications sérielles et parallèles Quel que soit votre objectif de développement, Intel a la suite d’outils tout-en-un qui convient à vos besoins. Trouvez ci-dessous la suite qui vous convient. Bhanu Shankar Software Engineer l’essentiel des performances des performances sophistiquées Intel® Parallel Studio Intel® Parallel Studio XE Intel® Parallel Studio constitue une suite complète d’outils, qui comprend un assistant innovant pour le threading, un compilateur optimisant et des bibliothèques, un vérificateur d’erreur de mémoire et de threading et un profileur de performances de threading pour les développeurs Microsoft Visual Studio* C/ C++ qui souhaitent exploiter le multicœur. Intel® Parallel Studio XE2011 regroupe dans une même suite les compilateurs C/C++ et Fortran plébiscités d’Intel, des bibliothèques, des fonctions d’identification des erreurs, de sécurité et de profilage, qui permettent aux développeurs de booster les performances, la sécurité et la fiabilité des applications de calcul intensif et d’entreprise. des performances réparties Intel® Cluster Studio (ex-Intel® Cluster Toolkit Compiler Edition) Intel® Cluster Studio est un package intégré d’outils de tout premier ordre, contenant des compilateurs Intel C/C++ et Intel® Fortran, des bibliothèques optimisées de performances, Intel® Trace Analyzer and Collector, Intel® MPI Library et Intel® mPI Benchmarks, permettant d’augmenter les performances mPI sur clusters Linux et Windows. Faites des économies en achetant des suites vous possédez déjà le logiciel ? Lorsqu’on les achète dans le cadre de suites, les composants peuvent être obtenus à des prix considérablement moindres. Pour des détails sur l’achat d’outils pris individuellement, allez sur http://software.intel.com/en-us/articles/buy-or-renew/. Si vous possédez déjà des outils logiciels d’Intel®, vous avez peut-être droit à un tarif spécial de mise à niveau. Pour les détails, allez sur http://software.intel.com/en-us/articles/intel-xeproduct-comparison/#upgrade. Téléchargez une version gratuite d’évaluation pendant 30 jours d’Intel® Software Development Products depuis www.intel.com/software/products/eval. Pour plus de détails sur les performances et les options d’optimisation des logiciels d’Intel, allez sur http://software.intel.com/en-us/articles/optimization-notice © 2011, Intel Corporation. Tous droits réservés. Intel et le logo Intel sont des marques commerciales d’Intel Corporation, aux États-Unis et dans d’autres pays. * Les autres noms et désignations peuvent être revendiqués comme marques par des tiers.