Jump to content
Geeks Nation Forums
Sign in to follow this  
Prestone

Utilisation du GPU

Recommended Posts

Yo

Je me demande depuis qq temps si on peut utiliser son/ses GPU comme une unité de calcul normale genre comme un CPU.

Je sais que CUDA est utilisé surtout via des programmes de recherche/modélisation/encodage/etc mais je veux savoir si une partie du workload normal du cpu peut être transféré au GPU

Share this post


Link to post
Share on other sites

J'ai enfin trouvé un application qui utilise le gpu mais juste pour des programmes précis, avec CUDA et une autre machin de ATI AMD.

Boinc

Je participe maintenant à Milkyway, Aqua, Lattice et l'éternel SETI!

Je poursuit mes recherches pour l'utilisation du gpu comme CPU...

Share this post


Link to post
Share on other sites

Il faut comprendre certain points:

1) Un GPU n'est pas un CPU. Un GPU est compose de plusieurs core, 128 ou plus dans bien des cas. Ce sont des core peu puissant, mais il y en a beaucoup. Ils sont fait pour le calcul vectoriel, matricielle et parallel. Pour ceux qui ont fait des math plus avancee que 2+2 savent que ce genre de calcul est assez different de l'arithmetique. Un CPU est fait pour l'arithmetique, mais il y a quelque extensions comme MMX, SSE(1,2,3 et 4.*) et 3Dnow chez AMD pour faire des vecteurs de maniere native. Mais pour le reste, le CPU est meilleur avec 2+2 que faire un produit matricielle de maniere efficace. Le GPU est aussi bon, comme je l'ai dis, pour le calcul hautement paralelle, parce qu'il y a beaucoup de core. Mais ces calculs la ne doivent pas etre trop arithmetique parce que le GPU est poche pour ca. La cryptographie est un bon example ou un GPU est bon. C'est des calcule matricielle qui peuvent etre multithreadees pour repartir les milliard de cles possible entre les centaines de cores. Mais pour faire aller Windows plus vite, ce qui implique des calcules d'events, de strings et d'operations de gestion, oublie ca. Le best que ton GPU peut te donner est quand tu met a on le compositing dans Windows 7. Dans ce cas la, DirectX ce charge des pixmaps de l'interface, ce qui est matricielle, donc tres facile pour le GPU.

2) Le language du GPU et du CPU sont different. Ca s'appel l'assembleur, ou language machine. C'est les code binaires qui corespondent au operation pour le CPU. Windows est compiler (transfer de code source vers .exe) pour x86_i586 ou x86_64, les langues de 32 et 64 bit Intel/AMD. Tu ne peux pas utiliser ce code sur un autre processeur comme le IBM Cell de la PS3 ou IBM Power Triple de la 360. Ca prend un emulateur pour traduire les codes et les registres, ce qui est tres lent. Pour un CPU assembly -> GPU OpenCL based bytecode, il ne faut pas juste traduire, mais aussi reorganiser le code de maniere qu'il peut etre executee par le GPU. Etant donnees que les cores des GPU sont tres peu faible, qu'il ne parlent pas la meme langue et qu'il ne sont pas bon aux meme chose, faire un emulateur est innutile, ce serait trop lent. x86 n'est pas fait pour le multithreading, c'est une patch qui a ete fait parce que c'etais necessaire, mais Windows/Linux/OSX n'ont jamais ete penses, ni les applications, pour etres multicore. En fait, les languages de programations moderne supportent a peine et avec beaucoup de dificultee le multithreading,

Share this post


Link to post
Share on other sites

Ça y est, je suis démoli là!

Merci elv de ta vulgarisation, c'est très clair. Et très triste à la fois. Faudrait tout repenser le langage de prog pour pouvoir faire un os hyper-multi-thread alors...

je vais laisser ça à d'autre moi!

Share this post


Link to post
Share on other sites

Merci Elv13

Mon chummey qui travail chez UBI me disait que sur une Xbox360, ils peuvent programmé nu peu comme ils le veulent et le system d'exploitation de la console gère les thread tout seul, la prog est assez facile ainsi. ( lui il est programmeur sur les engin de son ).

Tandisqu'avec les PS3, ils doivent travailler avec les thread, rendant la prog bcp plus compliqué.

Je ne suis pas dutout programmeur, mais expliqué de fa^con simple, ça donne ça ;)

Share this post


Link to post
Share on other sites

Bah tu peut pas prendre avantage du gpu pour windows, mais pour ce qui est de l'encodage video, il y a ati avivo converter il utillise les stream processors , j'ai deja encoder un film avi en 1080p 15mbps sur avivo ca lui a prix 30 mins alors que total video converter qui supporte les 8 cores, 8mbps ca lui a prix 1h30..

Share this post


Link to post
Share on other sites

Selon moi les Thread, c'est mieux de les gerer manuelement dans la pluspart des cas. Encore la, c'est assez complexe, je vais essayer d'etre simple.

Il y a des moyens d'automatiser les multithread sans risque pour certaine taches. Disons que je veux faire des verifications sur 200000 utilisateurs qui sont charges en memoire sur mon MainFrame de 3 million de $ (cas extreme, mais sa simplifie les choses). Mon code va ressembler a ca:

 pour chaque utilisateur: fait
    utilisateurActuel->faitVerifications
    affiche resultats
 recommence si incomplet
Dans ce cas simple, chaque tours de la boucle de verifications qui revifie chaque utilisateur ne depend pas du resultat d'une autre iteration (tour de boucle). Avec la programmation PC normale pour le CPU, ce petit bout de code se fait sur un seul core, peut importe le nombre qu'il y en a. C'est un enorme gaspillage. Mais les compilateurs modernes les plus evolues et ceux qui sont utiliser pour tester des theses de doctorat comme LLVM et GCC peuvent dire: Attend un peux, c'est inneficace! Alors ils vont automatiquement transformer le code comme ca:

si (le nombre d'utilisateur est plus grand que 500) et (le nombre de core est plus grand que 1): alors
   pour chauque core
      pour chaque utilisateur de (((nombre d'utilisateur divisee par le nombre de core) fois core actuel) moin (nombre d'utilisateur divisee par le nombre de core)) a  ((nombre d'utilisateur divisee par le nombre de core) fois core actuel): fait
         (utilisateurActuel->faitVerifications) dans core actuel
         affiche resultats
      recommence si incomplet
   fin pour chaque core
sinon
   pour chaque utilisateur: fait
      utilisateurActuel->faitVerifications
      affiche resultats
   recommence si incomplet
fin si

Ca se complique un peux, mais c'est pas toi qu'il le gere. Il verifie si ca vaut la peine de faire le travail supplementaire pour initialiser des thread (si utilisateur > 500) et si il peux diviser ca tache. Sinon, il le fait normalement.

Dans ce cas si, ca marche! Mais dans 99% des cas, ca ne fonctionne pas, parce que les differentes iterations de la boucle affecte le deroulement des operation et la prochaine iteration. Comma dans le cas suivant:

variable nombreDePomme = 0

pour chaque panier de pommes: fait
   nombreDePomme = nombreDePomme + panierActuel->nombreDePommeDansPanier
recommence si incomplet

afficher nombreDePommes

Dans cet example, la variable "nombreDePomme" recois a chaque tour le nombre de pommes des iterations precedente plus le nombre de pomme du panier actuel. La difference avec le cas precedent, c'est qu'il y a une variable qui est reutilisee dans chaque iterations. Si je separe le code sur plusieurs thread automatiquement, il faut qu'il partage la meme variable nombreDePomme. La compilateur (traducteur de code vers language machine comme dit dans le post precedent) ne prendra pas le risque de faire une variable nombreDePomme pour chaque thread et les additionner a la fin, parce que pendant l'execution, chaque variable nombreDePomme n'aurait pas le vraie total, mais uniquement le total de son thread, ce qui risque tres fort de fausser le calculs finale (pas dans ce cas, mais servez vous de votre imagination).

Donc il faut partager la meme variable nombreDePomme, pas le choix. Mais comment? Si deux thread veulent enregistrer la nouvelle valeur de nombreDePomme en meme temps, qui a raison? Peut importe lequel le fait en premier, le 2e a deja fait sont calcul avec l'ancienne valeur, donc quand ca va etre sont tour, il ne va pas prendre en compte ce que l'autre thread vient d'ajouter (dans pomme de son panier actuel a lui). Dans ce cas, le calcul est un echec, le nombre de pommes n'est pas le bon.

Comment faire? Il faut verouiller la variable, dire "attend un peux, j'utilise la variable en se moment, attend que j'ai finit avec de calculer". Qu'est-ce que ca fait? Ils vont tous attendre les un apres les autres et un seul va faire le travail en meme temps. Mais le resultat va etre le bon! Par contre, meme avec le multi thread, le calcul va etre plus long qu'avec un thread a cause du mechanisme de syncronisation.

Voici un bloquage simple ou gerer le multithread automatiquement = desastre. Dans 95% des cas, c'est ce qui va arriver. Alors comment faire du multithread efficace? Penser multithread des le depart et faire son code en consequence. Vraiment separer les variable pour eviter les shared le plus possible. Dans le cas de mon panier de pomme, additioner le resultat de chaque thread a la fin. Dans un cas plus complexe, trouver un moyen de ne pas dependre sur le "nombreDePomme" commun, mais quand meme ajouter mon resultat a la fin, comme ca une partie du code n'attendera pas apres les autres, ce qui va accelerer significativement.

Ca, c'est dans le monde actuel avec les languages de programation actuel. Il faut vraiment penser multithread quand ont veux en faire pour eviter les "deadlock", les "wait" et la desincronisation. En plus du fait que 90% des trucs sont trop simple pour que ca vaille la peine, parce que ca prend plus du triple du temps faire les chose en multithread que les faire en procedures continue. Alors les programmeurs ne le font pas, ca ne vaut pas le temps et l'argent que ca prend comparer a le faire plus "naturelement" comme notre cerveau le ferait.

Pensez a faire un plan dans votre tete pour un voyage en solitere d'une fin de semaine comparer a organiser un voyage de groupe. C'est exectement la meme chose. C'est beaucoup plus complexe au niveau organisationelle (le code) et sociale (la syncronisation et la cooperation entre les thread). Est-ce que ca vaux la peine une fois que tout les trucs additionels ont ete fait? Normalement oui, mais tu est plus epuise et ca ta pris une semaine a tout organiser a la place de juste partir sur un coup de tete.

Donc en resume, oui, il y a moyen de faire de l'optimisation software au niveau du compilateur pour faciliter l'exploitation des cores, mais non, ce n'est pas une solution magique, parce que c'est 95% moin efficace point de vue performace que le faire a la main parce que les cas ou il peux etre sur que ca ne fera pas de trouble sont tres rares.

EDIT: j'avais oublier laboucle des core dans l'exemple 2

Edited by Elv13

Share this post


Link to post
Share on other sites

j'aurais essayer de l'expliquer au moin...

Mais c'est très clair ce que tu a écrit, elv. Tu es un excellant vulgarisateur et tes exemples étaient très concrètes.

J'ai vraiment beaucoup appris avec ce que tu as écrit

Merci

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...