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 !

OpenMP 5.0 est prévu pour novembre 2018
Avec l'ajout d'interfaces pour le débogage et l'analyse poussée de la performance

Le , par dourouc05

63PARTAGES

12  0 
OpenMP est la norme actuelle pour la programmation parallèle à mémoire partagée, c’est-à-dire sur les différents cœurs d’une même machine. Ce genre de technologie permet de tirer parti des machines actuelles, dont le nombre de cœurs ne cesse d’augmenter, même si OpenMP a d’abord été développé pour exploiter les supercalculateurs. La version 4.5 de la norme a étendu les possibilités vers un déchargement de l’exécution du code sur un accélérateur, comme un processeur graphique, disponible dans la machine.

La version 5.0 est annoncée pour la fin de l’année et un nouveau brouillon public est disponible (TR7). Elle apporte bon nombre de nouveautés, comme deux nouvelles interfaces pour la définition d’outils : OMPT pour ceux fournis par l’implémentation d’OpenMP, OMPD pour les outils tiers. Ces outils sont prévus pour inspecter l’état d’OpenMP pendant l’exécution : quand l’objectif d’OMPT est de faciliter l’analyse poussée de la performance du code OpenMP (pourquoi un cœur doit-il attendre ?), celui d’OMPD est plutôt orienté vers le débogage d’applications (pour afficher plus précisément la pile au niveau d’un point d’arrêt, par exemple).


OpenMP 5.0 se focalise aussi sur les accélérateurs. Notamment, la norme introduit des constructions pour gérer les systèmes qui disposent de plusieurs niveaux de mémoire, sous la forme d’espaces de mémoire différents. La clause map sert à transférer les données entre les banques de mémoire. Également, la synchronisation a été revue afin de gérer plus de mécanismes pour acquérir et libérer les droits d’écriture.

Toujours au niveau de la mémoire, la programmation orientée objet est mieux gérée, grâce à la directive declare mapper : elle sert à déclarer la manière de transférer les données d’une structure complexe, c’est-à-dire d’un objet, par exemple vers un accélérateur.

La clause depend gère des dépendances entre tâches plus précises : outre les types entrée-sortie, l’exclusion mutuelle et des dépendances dynamiques ont été ajoutées.

Sources : Technical Report 6 is a preview of OpenMP 5.0, expected in November 2018, OpenMP ARB Releases Technical Report with Support for a Tool Interface, OMPT and OMPD: Emerging Tool Interfaces for OpenMP.

Et vous ?

Qu'en pensez-vous  ?
Quelles nouveautés souhaiteriez-vous avoir dans cette nouvelle version d'OpenMP ?

Voir aussi
La spécification complète.

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

Avatar de dourouc05
Responsable Qt & Livres https://www.developpez.com
Le 20/07/2018 à 17:24
Non, c'est une norme qui permet d'annoter du code C, C++ ou Fortran ("la boucle qui suit doit être parallélisée", si le compilateur l'implémente.
2  0 
Avatar de dourouc05
Responsable Qt & Livres https://www.developpez.com
Le 20/07/2018 à 20:24
C'est plutôt le contraire : certains compilateurs gèrent OpenMP, d'autres pas. Par exemple, Clang, GCC et Visual C++ l'implémentent tous (mais pas la même version : VC est limité à OpenMP 2.0, les deux autres étant plus à jour). Liste officielle : https://www.openmp.org/resources/ope...mpilers-tools/
2  0 
Avatar de Matthieu76
Membre éclairé https://www.developpez.com
Le 20/07/2018 à 14:29
OpenMP c'est une bibliothèque C++ et Fortran ?
0  0 
Avatar de Matthieu76
Membre éclairé https://www.developpez.com
Le 20/07/2018 à 19:32
Mais donc il y a un compilateur qui va avec ? Ça fonctionne avec G++, Clang, Visual C++ ?
0  0 
Avatar de Matthieu76
Membre éclairé https://www.developpez.com
Le 23/07/2018 à 0:01
Et c'est beaucoup utilisé ? Es-ce vraiment avantageux ? Désolé de poser tous ces questions mais je ne connais pas du tout alors que ça ressemble une solution miracle :
On met une instruction pré-processeur devant toutes les boucles for et paf le code et beaucoup plus rapide !
Genre dans ma library de réseaux de neurones ça serait bien pour paralléliser le travail sur une couche ?

Si c'est si bien que ça pourquoi n'en ai-je jamais entendu parler ?
0  0 
Avatar de dourouc05
Responsable Qt & Livres https://www.developpez.com
Le 23/07/2018 à 0:30
Du côté calcul scientifique/HPC, oui, c'est très utilisé. Maintenant, côté apprentissage profond, sûrement moins, vu qu'il est déjà courant de réinventer la roue, puis aussi de paralléliser à l'échelle de plusieurs serveurs plutôt que "seulement" plusieurs cœurs.

Dans ton cas, ça permettra de paralléliser facilement des boucles si les itérations n'ont pas d'interaction entre elles (donc pas les différentes itérations de la descente de gradient, mais plutôt les multiplications matricielles).
0  0 
Avatar de Matthieu76
Membre éclairé https://www.developpez.com
Le 25/07/2018 à 22:27
Merci pour tes réponses, cela m'aide grandement.

Actuellement je suis mets 21 secondes pour effectuer pour 1 itération d'apprentissage des 60000 images de la MNIST + les 10000 images de test avec 2 couches cachée de 150 et 80 neurones. (Avec un Intel Core i-7 + RAM DDR4)
Ce week-end je vais implémenter OpenMP et je te dirais combien je gagne en terme de performance mais si déjà je gagne un fois 2 ça sera juste génial.
0  0 
Avatar de Matthieu76
Membre éclairé https://www.developpez.com
Le 31/07/2018 à 1:53
J'ai testé OpenMP 2.0 mais pourtant je ne gagne absolument rien en performance, exactement le même temp de calcul.

Code : Sélectionner tout
1
2
3
4
5
#pragma omp parallel for num_threads(7)
for (int n = 0; n < numberOfNeurons; ++n)
{
    // ...
}
Pourtant cela fonction car avec ce #pragma je vois les 8 cœurs de mon pc tourner à 100% au lieu d'un seul en temps normal, extrêmement bizarre. Va falloir que j’investigue....
0  0 
Avatar de dourouc05
Responsable Qt & Livres https://www.developpez.com
Le 31/07/2018 à 2:19
Ça peut beaucoup dépendre de ce qu'il y a dans ta boucle : si tes cœurs doivent se synchroniser, ils perdent du temps plutôt que de calculer. Enfin, mieux vaut créer un sujet de discussion juste pour ça .
0  0 
Avatar de Madmac
Membre éprouvé https://www.developpez.com
Le 10/11/2018 à 0:51
À mon avis, le besoin pour les recherches dans ce domaine est nettement plus criant que pour la IA. Avec la surenchère de CPU multicœur, si rend n'est fait la production va atteindre un mur rapidement. Faute de pouvoir se traduire en gains de performance.

Citation Envoyé par Matthieu76 Voir le message
Et c'est beaucoup utilisé ? Es-ce vraiment avantageux ? Désolé de poser tous ces questions mais je ne connais pas du tout alors que ça ressemble une solution miracle :
On met une instruction pré-processeur devant toutes les boucles for et paf le code et beaucoup plus rapide !
Genre dans ma library de réseaux de neurones ça serait bien pour paralléliser le travail sur une couche ?

Si c'est si bien que ça pourquoi n'en ai-je jamais entendu parler ?
Pour commencer, il faudrait que les programmeurs abandonnent l'usage des For, while et Until quand ils travaillent sur des tableaux. Les opérations sur les tableaux son généralement "parallélisables" et un opérateur comme each en Ruby n'est utilisable que pour des listes et tableaux. Par contre for while et until peuvent servir également pour la saisie du clavier.

En somme, il faudrait repenser les langages afin de pourvoir signaler au compilateur la possibilité de faire des opérations en parallèle.

Citation Envoyé par Matthieu76 Voir le message
J'ai testé OpenMP 2.0 mais pourtant je ne gagne absolument rien en performance, exactement le même temp de calcul.

Code : Sélectionner tout
1
2
3
4
5
#pragma omp parallel for num_threads(7)
for (int n = 0; n < numberOfNeurons; ++n)
{
    // ...
}
Pourtant cela fonction car avec ce #pragma je vois les 8 cœurs de mon pc tourner à 100% au lieu d'un seul en temps normal, extrêmement bizarre. Va falloir que j’investigue....
Rien de bizarre, Tu as assisté à ce qui est défini par le terme "Von Newman bottleneck", concept qui énonce que la vitesse d'un système est toujours limité par l'élément le plus lent de l'ensemble. Et dans le cas présent, c'est ton bus mémoire et ta mémoire vive qui est le maillon faible de ce système. La seule solution imparfaite est l'usage de mémoire-cache. Et encore là, les langages de programmation sont le problème.

Par exemple, pendant l'utilisation et la traversé d'un tableau, la portion de code qui est appliqué (la fonction) pourrait n'être lu qu'une seule fois pour être conservé dans la mémoire-cache.

Premier avantage. puisque la mémoire cache est comme un deuxième bus, le bus mémoire est libre pour un autre coeur
Deuxièmement pendant la lecture de cette fonction depuis la mémoire-cache, cela laisse la possibilité de lire simultanément le prochain élément du tableau.
0  0