Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Comment implémenter la vectorisation dans vos développements pour créer un code plus rapide ?
Un exemple avec Intel Advisor XE

Le , par Michael Guilloux

0PARTAGES

5  0 
Pour leurs différents projets, les développeurs recherchent avant tout un code qui marche. Ensuite, certains le retravaillent pour le rendre plus efficace, selon certains critères d’optimisation. L’optimisation de code tente de minimiser ou de maximiser certains attributs d’un programme informatique exécutable. La pratique la plus courante consiste à minimiser le temps nécessaire pour exécuter une fonction. L’optimisation peut viser également la réduction de la quantité de mémoire occupée (l’espace occupé par les données et le programme). Avec la croissance des ordinateurs portables, l’énergie consommée est devenue également un critère à minimiser.

Si l’optimisation de code a toujours été une question importante pour certains programmeurs, la grande majorité des compilateurs actuels effectuent automatiquement des optimisations. En effet, la plupart des nouveaux compilateurs pratiquent de façon automatique un certain nombre d’optimisations qu’il serait fastidieux d’effectuer manuellement et qui rendraient le code source moins lisible. L’optimisation de la part du compilateur est généralement mise en œuvre en utilisant une séquence de transformations, des algorithmes qui transforment un programme en un programme de sortie sémantiquement équivalent, mais qui utilise moins de ressources.

Il existe de nombreuses techniques d’optimisation, l’une d’elles étant la vectorisation. Il s’agit d’une optimisation de code qui transforme des boucles (un ensemble d’instructions scalaires) en instructions vectorielles. L’idée de base est qu’une boucle (sur une série d'éléments scalaires) peut être transformée en une unique instruction vectorielle (sur une série d'éléments). Cette dernière peut en plus être considérablement plus rapide que la boucle équivalente. Toutefois, le processus d’ajout de vectorisation à votre code peut sembler une tâche ardue.

En effet, de nombreux problèmes peuvent empêcher la vectorisation ou la rendre inefficace, privant ainsi les développeurs du bénéficie de cette accélération remarquable de leur code. Cela n’empêche que la vectorisation est absolument nécessaire si vous voulez tirer le meilleur parti du matériel moderne. Cependant, il convient de noter que la vectorisation automatique est encore un sujet de recherche majeur en informatique. Des recherches se poursuivent pour trouver des méthodes qui permettent à un compilateur de convertir (sans assistance humaine) des programmes scalaires en programmes vectorisés.

C’est donc en voulant rendre plus facile d’optimiser un code par cette technique qu’Intel a conçu la dernière version d’Intel Advisor XE. Il s’agit d’un outil d’assistance à la vectorisation SIMD pour C, C++, C# et Fortran. Intel Advisor XE est disponible sur les systèmes Windows et Linux sous forme d’outil GUI autonome, d'extension à Microsoft Visual Studio ou d’interface en ligne de commande. Il permet une analyse des applications pour déterminer leur profit des architectures SIMD. Ce sont en général les applications qui utilisent beaucoup de tableaux, de matrices ou de structures de données similaires. On peut notamment citer les applications scientifiques ou de traitement du signal.

Pour que la vectorisation soit possible et efficace, Intel Advisor XE fournit des informations détaillées sur les inefficacités SIMD existantes et sur les manières de résoudre les problèmes empêchant cette optimisation. L’outil peut vous aider à vectoriser efficacement votre code, à l’aide d’une méthodologie dont les étapes sont les suivantes :

  • enquête : cette étape indique sur quelles boucles vous passez du temps, avec des statistiques SIMD détaillées ;
  • nombres de parcours : il s’agit de mesurer le nombre d’itérations et le nombre d’appels pour chaque boucle ;
  • recommandations : à cette étape, l’outil donne des conseils spécifiques sur la façon de résoudre les problèmes qui pourraient empêcher l’optimisation ou la rendre inefficace ;
  • analyse de dépendances : Intel Advisor XE fournit une analyse dynamique des dépendances, afin de vérifier si une boucle a des dépendances croisées entre itérations ;
  • analyse des tendances d’accès à la mémoire : à cette étape, l’outil vérifie si vous accédez à la mémoire de manière favorable pour la vectorisation.

Un livre blanc sur la vectorisation est disponible en téléchargement. Il permet de mieux appréhender les difficultés de la vectorisation et comment la mettre en œuvre de manière efficace et facilement. L’article montre également, sur des exemples de code réel, comment utiliser Intel Advisor XE pour optimiser les codes vectoriels. Dans l’exemple traité, l’outil d’assistance à la vectorisation d’Intel a permis une accélération du code par un facteur de 3,2.

Téléchargez le livre blanc sur la vectorisation et son implémentation avec Intel Advisor XE

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de dourouc05
Responsable Qt & Livres https://www.developpez.com
Le 30/11/2015 à 14:58
Citation Envoyé par MikeRowSoft Voir le message
C'est bien pour l'enseignement mais pas forcément pour la recherche. (bien que cela peut facilité des tâches qui pourraient être jugées pénible comme la résolution d'équation)
La recherche à quel niveau ? Au contraire, je pense qu'il faut laisser aux fabricants de CPU la lourde tâche d'optimiser des interfaces communes (à la BLAS) pour leurs processeurs pour en tirer le meilleur parti (tout en évitant qu'ils écrasent des implémentations libres : OpenBLAS a déjà été plus rapide que la MKL d'Intel — https://github.com/JuliaLang/julia/i...mment-22745557 —, je ne sais pas si ça a vraiment évolué depuis). De manière plus générale, dans pas mal de domaines, la tendance est à l'abstraction, à écrire ses équations différentielles de manière très proche des mathématiques (comme GetDP http://geuz.org/getdp/ ou OpenFOAM https://openfoamwiki.net/index.php/H...sport_equation).
3  0 
Avatar de
https://www.developpez.com
Le 30/11/2015 à 11:53
C'est bien sa le problème. Au final il y aura des champs à renseigner ou formules mathématique à écrire et ensuite la librairie proprio et optimisé pour l'architecture d'un système fera le reste. Un peu comme les calculatrices, mais de beaucoup plus haut niveau...

C'est bien pour l'enseignement mais pas forcément pour la recherche. (bien que cela peut facilité des tâches qui pourraient être jugées pénible comme la résolution d'équation)

Je m'attendais plus à des cycles de traitements (fréquences) et bases de registres (ordonnancement et requête) au lieu de la couche programmation de l'utilisateur final.
Il faut bien préparer quelques choses avant de l'utiliser?
0  1 
Avatar de
https://www.developpez.com
Le 30/11/2015 à 17:17
Très captivant.
C'est aussi un moyen d'éviter les erreurs ou incohérences.

Tu as raison, SSE et MMX ne sont pas les vraies mots clés des calculs scientifiques.
0  1