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.

Documents pareils