1

Avez-vous déjà utilisé OpenCL ? Des difficultés particulières ?
J'aime bien qu'il soit très ouvert coté backend, mais qu'est-ce que ça vaut par rapport à CUDA / DirectCompute ?
Est-ce que quelqu'un a déjà écrit un moteur graphique 3D logiciel en OpenCL ? (N'utilisant plus OpenGL/DirectX pour le rendu 3D).

Vous connaissez surement aussi C++ AMP (une extension du C++ par MS basé sur DirectX)
J'ai l'impression que C++ AMP () n'apporte pas grand chose à part du sucre syntaxique ?
Car j'ai l'impression que le prog _kernel ne peut pas utiliser du C++ (comme opencl), que les transferts de données sont aussi explicites, ...
mais que beaucoup de monde pense que ca va être magique et extraire le parallélisme sans problème... C'est moi ou je suis médisant ?

2

!call Azrael_CV
--- Call : Azrael_CV appelé(e) sur ce topic ...


Sait-on jamais.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3

J'aime beaucoup cette fragmentation de l'informatique, des processeurs, des OS, des langages et des outils, tout est fait pour simplifier le bintz et aider le pécord lambda à s'y retrouver.

Pascal, quitte ta partie de Go basic et assemble moi du café de Java dans une coupe Ruby

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

4

De ce que j'en connais, OpenCL est plus lent que CUDA. Mais il est plus portable car les application écrites en OpenCL peuvent s'exécuter aussi bien sur ATI que sur NVidia. Sinon tu peux aussi attendre OpenAcc.

Je ne connais ni DirectCompute, ni C++ AMP. En lisant les specs, j'ai l'impression que C++ AMP tient plus de l'usine à gaz qu'autre chose. Ce qui m'ennuie le plus c'est qu'il n'y a pas de garantie de portabilité d'un code écrit avec C++ AMP. Quoique, c'est le cadet des soucis de Microsoft.

Concernant le saupoudrage syntaxique, il y un exemple que je connais bien : Pthreads et OpenMP. Le dernier est une simplification du premier et fonctionne avec des directives (pragmas). Assez efficace et portable. Et c'est également le mode de fonctionnement d'Openacc.

Extraire du parallélisme... vaste débat. Ca dépend tellement du code, des procs sur lesquels il est exécuté, de la vitesse de la mémoire.
PpHd (./1) :
C'est moi ou je suis médisant ?

C'est pas de la médisance, plutôt du pragmatisme.

Pour l'instant, on essaye de paralléliser des codes séquentiels. Peu d'applications sont pensées "parallèle" dès le départ. Il va falloir y venir. Les coeurs seront de moins en moins puissants (consommation électrique oblige), de plus en plus nombreux (pour garder la puissance de calcul).

Encore du boulot en perspective pour les codeurs.
Gare à celui qui touche a mes chips quand je code !

5

Bon je vais essayer de résumer:
+ pthread / winthread https://en.wikipedia.org/wiki/Pthread
100% manuel et ne fonctionne qu'avec le CPU.
+ openmp https://en.wikipedia.org/wiki/Openmp
Compatible code existant, ne fonctionne qu'avec le CPU.
+ openacc https://en.wikipedia.org/wiki/OpenACC
Compatible code existant, fonctionne avec le GPU (le CPU ?), y'a pas AMD dedans (ni intel, ni MS, ), donc j'ai des doutes sur la pérennité de l'offre.
+ openhmpp (ou c'est openacc ?) https://en.wikipedia.org/wiki/OpenHMPP
Compatible code existant, fonctionne avec le GPU (le CPU ?), TBC
+ cuda https://en.wikipedia.org/wiki/CUDA
Nouveau code dans un nouveau langage, Fonctionne avec le GPU (nvidia)
+ AMD stream (Obsolete) https://en.wikipedia.org/wiki/Stream_processing
+ BrookGPu: https://en.wikipedia.org/wiki/BrookGPU
Je ne connais pas.
+ opencl https://en.wikipedia.org/wiki/Opencl
Nouveau code dans un nouveau langage, Compiler en runtime pour tenir compte de la perfo de la cible, fonctionne avec GPU/CPU/Cell/...
+ directcompute https://en.wikipedia.org/wiki/DirectCompute
Fonctionne avec le GPU (je ne m'y suis jamais plongé dedans).
+ c++ amp https://en.wikipedia.org/wiki/C%2B%2B_AMP
Extension du C++ (incompatible avec standard). Fonctionne avec GPU/CPU

Si j'en ai oublié, n'hésiter pas à le dire.

Sans parler qu'AMD prévoit qu'à terme avec ses APU, une fusion complète GPU + CPU, avec la possibilité de controler le GPU sans passer par les drivers (cf. http://www.silicon.fr/wp-content/uploads/2012/02/AMD-FAD-2012-Breakout-HSA-7.png & http://www.silicon.fr/wp-content/uploads/2012/02/AMD-FAD-2012-Breakout-HSA-6.png ).
Ce qui laisserai espérer d'avoir des jeux d'instructions permettant de contrôler directement le GPU trilove


Azrael_CV (./4) :
C'est pas de la médisance, plutôt du pragmatisme.

#ami#
Azrael_CV (./4) :
Pour l'instant, on essaye de paralléliser des codes séquentiels. Peu d'applications sont pensées "parallèle" dès le départ. Il va falloir y venir. Les coeurs seront de moins en moins puissants (consommation électrique oblige), de plus en plus nombreux (pour garder la puissance de calcul).

Je suis tout à fait d'accord. C'est pour ca que j'essaye de me tenir à jour et d'essayer quelques trucs.
Je pense que d'ici 3, 4 ans, soit tu sauras en tirer partie, soit ton appli sera has been.
Azrael_CV (./4) :
En lisant les specs, j'ai l'impression que C++ AMP tient plus de l'usine à gaz qu'autre chose.

J'avoue ne pas avoir été convaincu par les specs.
J'attends les exemples concrets.
Azrael_CV (./4) :
Assez efficace et portable. Et c'est également le mode de fonctionnement d'Openacc.

Oui.
Mais j'avoue que je vois mal comment ils comptent implanter automatiquement les transferts entre les différentes zones mémoires (RAM CPU, RAM Locale GPU, RAM Globale GPU, RAM private GPU, ...) avec ce système.
Sans parler de gérer les systèmes avec multi GPU.

6

Dans le genre il y a :
+ Brook+ qui est la version "cuda" d'ATI, moins aboutie que cuda.
+ TBB et Cilk+ qui sont des extensions du C développées pas Intel (en open-source maintenant)
+ les langages PGAS (http://en.wikipedia.org/wiki/Partitioned_global_address_space) : Coarray-Fortran, UPC, X10, Chapel, Fortress

Quelques précisions :

+ OpenHMPP est la version libre du logiciel commercial de CAPS entreprise HMPP. A la bas HMPP est une extension du C, via des pragmas, pour écrire du code qui va s'exécuter sur des accélérateurs (GPGPU, coprocesseurs...). Si tu veux qu'une fonction s'exécute sur la GPU, tu l'encapsules par les bons pragmas. La fonction sera restrancrite dans un langage cible, par exemple CUDA pour un GPU NVidia, ou OpenCL pour un GPU ATI. Si le GPU est disponible, ta fonction va s'y exécuter, sinon c'est la version proc qui prend le relais. Tu peux préciser quelles sont les variables que tu veux transférer sur la carte et quelles sont celles que tu vas rapatrier. Il peut aussi y avoir des variables persistantes sur le GPU. Tu peux aussi construire un prototype de la fonction destinée à s'exécuter sur le GPU et la modifier pour l'optimiser... La stratégie de mettre HMPP en open source est clairement de populariser ce pseudo langage. Ca ressemble pas mal à OpenMP. La gestion de systèmes multi-GPU/accélérateur est prise en compte

+ OpenACC est une tentative de normalisation issu d'un groupe de réflexion d'OpenMP sur les accélérateurs, en vue d'une intégration dans la norme 4.0 d'OpenMP. C'est aussi un coup d'éclat, du genre "si on ne nous écoute pas à l'intérieur ou si on trouve que ça ne va pas assez vite, alors on déborde la comm à l'extérieur pour montre combien on a raison." Ca n'a pas l'air mal. Les transferts pourront soit se faire automatiquement, soit être préfetchés par le codeur. Par contre je ne sais pas ce que tu entends par "RAM Locale GPU, RAM Globale GPU, RAM private GPU" ? Tu parles de la mémoire texture et autres ? Dans un contexte de programmation parallèle avec des accélérateurs et coprocesseurs, le programmeur s'intéresse uniquement à la mémoire globale. Ceux qui veulent utiliser la mémoire de "texture" par exemple devront passer par le langage spécifique au proc visé. La gestion de systèmes multi-GPU/accélérateur est aussi prise en compte.

A suivre aussi : Intel MIC. Un futur coprocesseur qui utilise les langages de programmation traditionnels.

Le principal inconvénient des GPGPU est le modèle de programmation qui est basé sur du SIMD, mais coté "data". Si tous les threads ne font pas le même travail en même temps, tu as une perte de performance (typiquement un if dans une boucle). Et il faut des milliers de threads pour tirer de la perf. J'aime bien cette page qui résume ce qui marche, ou pas, sur un GPGPU : http://lava.cs.virginia.edu/gpu_summary.html

Pour la roadmap d'ATI, je dirais que ça va dans le bon sens. Le GPU ne peut pas rester sur un port PCI avec les taux de transfert qu'on connait. Le seul hic est peut-on se servir du GPGPU pour faire autre chose que ce qui est du domaine de l'imagerie ? Et quid de la norme IEEE danns les GPGPU ? c'est bien beau de faire des calculs rapides, mais si le GPGPU fournit des résultats différents du CPU, certaines applications n'ont aucun intérêt à tourner sur le GPGPU.
Gare à celui qui touche a mes chips quand je code !

7

Azrael_CV (./6) :
Le seul hic est peut-on se servir du GPGPU pour faire autre chose que ce qui est du domaine de l'imagerie ?
Oh que oui !
Traitement de signal de tout type (par exemple l'audio), crypto...
http://en.wikipedia.org/wiki/GPGPU#Applications
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

8

Azrael_CV (./6) :
Le seul hic est peut-on se servir du GPGPU pour faire autre chose que ce qui est du domaine de l'imagerie ? Et quid de la norme IEEE danns les GPGPU ? c'est bien beau de faire des calculs rapides, mais si le GPGPU fournit des résultats différents du CPU, certaines applications n'ont aucun intérêt à tourner sur le GPGPU.


Maintenant IEEE754 est respectée par les GPU, même en double (depuis un an, je crois).
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

9

Zerosquare (./7) :
Azrael_CV (./6) :
Le seul hic est peut-on se servir du GPGPU pour faire autre chose que ce qui est du domaine de l'imagerie ?
Oh que oui !
Traitement de signal de tout type (par exemple l'audio), crypto...
http://en.wikipedia.org/wiki/GPGPU#Applications

Quel chipoteur. J'ai dis "domaine de l'imagerie" :-p le traitement du signal en fait partie (Photoshop en tire partie par exemple). Ceci étant, ce que j'ai dis est suffisamment vague pour que chacun y trouve à boire et à manger grin

Ca en fait des domaines... j'aimerais bien voir les facteurs d'accélération roll pas seulement de la routine modifiée, mais de toute l'appli.

flanker (./8) :
Maintenant IEEE754 est respectée par les GPU, même en double (depuis un an, je crois).

Par pour cosinus et exponentielle. http://developer.download.nvidia.com/CUDA/training/floatingpointwebinarjune2011.pdf (pas d'autre document
Gare à celui qui touche a mes chips quand je code !

10

Azrael_CV (./6) :
Par contre je ne sais pas ce que tu entends par "RAM Locale GPU, RAM Globale GPU, RAM private GPU" ? Tu parles de la mémoire texture et autres ? Dans un contexte de programmation parallèle avec des accélérateurs et coprocesseurs, le programmeur s'intéresse uniquement à la mémoire globale. Ceux qui veulent utiliser la mémoire de "texture" par exemple devront passer par le langage spécifique au proc visé.

Disons qu'il me semble que pour être performant, il faut vraiment faire gaffe à quelle mémoire tu accèdes dans ton algorithme (voir les différents mémoires d'opencl) parce qu'utiliser tout le temps la mémoire globale dans le kernel, çà à l'air très couteux smile Sans parler des mémoires _locale à une compute unit:
image001.jpg
Bref je ne sais pas comment rendre le modèle mémoire du C (un seul espace mémoire pour l'application) compatible avec Open* (Plusieurs espaces mémoires sont disponibles) tout en gardant les choses simples.

Surtout que j'avais lu un article d'un fabricant hard qui se demandait s'ils allaient réussir à maintenir la cohérence de toutes les différentes mémoires dans le futur,
où si ils allaient en déléguer une partie au soft.
Azrael_CV (./6) :
J'aime bien cette page qui résume ce qui marche, ou pas, sur un GPGPU : http://lava.cs.virginia.edu/gpu_summary.html

Ca à l'air bien smile
Azrael_CV (./9) :
Par pour cosinus et exponentielle. http://developer.download.nvidia.com/CUDA/training/floatingpointwebinarjune2011.pdf (pas d'autre document

Je ne comprends pas. IEEE 754 n'impose pas grand chose dans mes souvenirs pour exp et cos.
Seulement pour + * - / et sqrt
Par contre, opencl impose des précisions pour chaque opération (pas très élevés par ailleurs).
Azrael_CV (./6) :
Le seul hic est peut-on se servir du GPGPU pour faire autre chose que ce qui est du domaine de l'imagerie ?

Ca risque de faire comme pour le processeur CELL avec des milliers de SPU smile

11

PpHd (./10) :
Bref je ne sais pas comment rendre le modèle mémoire du C (un seul espace mémoire pour l'application) compatible avec Open* (Plusieurs espaces mémoires sont disponibles) tout en gardant les choses simples.

Là je ne sais quoi te répondre. Est-ce que la Local Memory doit être gérée comme une sorte de cache ou bien comme une éventuelle extension de mémoire ? pour ma part je gérerais cette mémoire comme une sorte de cache qui a beaucoup moins de latence que la Global Memory.

Le modèle mémoire du C est certes simple, mais quand tu regardes le proc sur lequel il s'exécute il y a entre 1 et 3 niveaux de cache.
PpHd (./10) :
Je ne comprends pas. IEEE 754 n'impose pas grand chose dans mes souvenirs pour exp et cos.
Seulement pour + * - / et sqrt
Par contre, opencl impose des précisions pour chaque opération (pas très élevés par ailleurs).

yep, en effet, autant pour moi. Mes infos sont obsolètes sur la normalisation dans le GPU NVidia... la norme IEEE 754-2008 a ajouté le FMA. Et il n'y a pas de norme sur cos et exp.

Gare à celui qui touche a mes chips quand je code !

12

Azrael_CV (./11) :
Là je ne sais quoi te répondre. Est-ce que la Local Memory doit être gérée comme une sorte de cache ou bien comme une éventuelle extension de mémoire ? pour ma part je gérerais cette mémoire comme une sorte de cache qui a beaucoup moins de latence que la Global Memory.


Dans ce cas, qui assure la cohérence de ce cache ? Il n'y a rien dans le matériel qui assure cette cohérence : c'est à faire en "soft" à la main, et je ne suis pas sûr que ca soit possible avec les GPU actuels.
(Sans parler qu'il y a 2 global memory : la RAM du CPU et la RAM du GPU).
Bref j'attends de voir.
Azrael_CV (./11) :
Le modèle mémoire du C est certes simple, mais quand tu regardes le proc sur lequel il s'exécute il y a entre 1 et 3 niveaux de cache.


Certes, mais il y a beaucoup de transistors dans le CPU pour assurer cette cohérence et tout accès passe par cette seule unité
(Tu oublies la RAM, le disque dur et potentiellement aussi le réseau wink)

On aura peut être (surement ?) des systèmes de contrôles / cohérence de cache avec les GPU du futur (comme si c'était un autre CPU).
Ca me semble indispensable si on veut avoir une mémoire unifiée GPU+CPU.
Ou alors, c'est à faire à la main, et ca va être difficile (il me semble) et couteux.

13

Comme la Local Memory et la Global Memory sont distinctes et accessibles de manière explicite, il n'y a pas de cohérence entre les deux. Tu peux stocker dans la Local Memory les données auxquelles tu accèdes le plus, comme des constantes par exemple.

Le GPU va descendre sur la carte mère à terme, mais ça va quand même compliquer la customisation du pc de geek...

Tu t'es décidé pour un langage ?
Gare à celui qui touche a mes chips quand je code !

14

Je vais partir sous OpenCL.