Question

Je voudrais savoir si quelqu'un a rédigé une candidature qui profite d'un GPGPU en utilisant par exemple nVidia CUDA.Si oui, quels problèmes avez-vous rencontrés et quels gains de performances avez-vous obtenus par rapport à un processeur standard ?

Était-ce utile?

La solution

J'ai fait du développement gpgpu avec SDK de flux d'ATI au lieu de Cuda.Le type de gain de performances que vous obtiendrez dépend d'un parcelle de facteurs, mais le plus important est l’intensité numérique.(C'est-à-dire le rapport entre les opérations de calcul et les références mémoire.)

Une fonction BLAS niveau 1 ou BLAS niveau 2, comme l'ajout de deux vecteurs, n'effectue qu'une seule opération mathématique pour 3 références mémoire, donc le NI est (1/3).C'est toujours exécuté Ralentissez avec CAL ou Cuda que de simplement le faire sur le processeur.La raison principale est le temps nécessaire pour transférer les données du processeur vers le GPU et inversement.

Pour une fonction comme FFT, il existe des calculs O(N log N) et des références mémoire O(N), donc le NI est O(log N).Si N est très grand, disons 1 000 000, il sera probablement plus rapide de le faire sur le GPU ;Si N est petit, disons 1 000, ce sera presque certainement plus lent.

Pour une fonction BLAS niveau 3 ou LAPACK comme la décomposition LU d'une matrice, ou la recherche de ses valeurs propres, il existe des calculs O(N^3) et des références mémoire O(N^2), donc le NI est O(N).Pour les très petits tableaux, disons que N vaut quelques scores, cela sera toujours plus rapide à faire sur le processeur, mais à mesure que N augmente, l'algorithme passe très rapidement de lié à la mémoire à lié au calcul et l'augmentation des performances sur le GPU augmente très rapidement.

Tout ce qui implique une arithmétique complexe nécessite plus de calculs que l'arithmétique scalaire, ce qui double généralement le NI et augmente les performances du GPU.


(source: lien terrestre.net)

Voici les performances de CGEMM - multiplication matrice-matrice complexe en simple précision réalisée sur une Radeon 4870.

Autres conseils

J'ai écrit des applications triviales, cela aide vraiment si vous pouvez paralléliser les calculs en virgule flottante.

J'ai trouvé le cours suivant dispensé par un professeur Urbana Champaign de l'Université de l'Illinois et un ingénieur NVIDIA très utile lorsque je commençais : http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html (comprend les enregistrements de toutes les conférences).

J'ai utilisé CUDA pour plusieurs algorithmes de traitement d'image.Bien entendu, ces applications sont très bien adaptées à CUDA (ou à tout autre paradigme de traitement GPU).

OMI, il y a trois étapes typiques lors du portage d'un algorithme vers CUDA :

  1. Portage initial : Même avec une connaissance très basique de CUDA, vous pouvez porter des algorithmes simples en quelques heures.Si vous avez de la chance, vous gagnez un facteur 2 à 10 en performances.
  2. Optimisations triviales : Cela inclut l'utilisation de textures pour les données d'entrée et le remplissage des tableaux multidimensionnels.Si vous êtes expérimenté, cela peut être fait en une journée et peut vous donner un facteur de performance supplémentaire de 10.Le code résultant est toujours lisible.
  3. Optimisations hardcore : Cela inclut la copie des données dans la mémoire partagée pour éviter la latence globale de la mémoire, le retournement du code pour réduire le nombre de registres utilisés, etc.Vous pouvez passer plusieurs semaines avec cette étape, mais le gain de performances n'en vaut pas vraiment la peine dans la plupart des cas.Après cette étape, votre code sera tellement obscurci que personne ne le comprendra (y compris vous).

Ceci est très similaire à l’optimisation d’un code pour les processeurs.Cependant, la réponse d’un GPU aux optimisations de performances est encore moins prévisible que celle des CPU.

J'utilise GPGPU pour la détection de mouvement (à l'origine en utilisant CG et maintenant CUDA) et la stabilisation (en utilisant CUDA) avec traitement d'image.J'ai obtenu une accélération d'environ 10 à 20 fois dans ces situations.

D'après ce que j'ai lu, c'est assez typique des algorithmes de données parallèles.

Bien que je n'aie pas encore d'expérience pratique avec CUDA, j'ai étudié le sujet et trouvé un certain nombre d'articles qui documentent des résultats positifs en utilisant les API GPGPU (elles incluent toutes CUDA).

Ce papier décrit comment les jointures de bases de données peuvent être parallélisées en créant un certain nombre de primitives parallèles (carte, dispersion, collecte, etc.) qui peuvent être combinées dans un algorithme efficace.

Dans ce papier, une implémentation parallèle de la norme de chiffrement AES est créée avec une vitesse comparable à celle du matériel de chiffrement discret.

Enfin, ceci papier analyse dans quelle mesure CUDA s'applique à un certain nombre d'applications telles que les grilles structurées et non structurées, la logique de combinaison, la programmation dynamique et l'exploration de données.

J'ai implémenté un calcul de Monte Carlo dans CUDA pour une utilisation financière.Le code CUDA optimisé est environ 500 fois plus rapide qu'une implémentation de processeur multithread « aurait pu faire plus d'efforts, mais pas vraiment ».(En comparant une GeForce 8800GT à un Q6600 ici).Il est bien connu que les problèmes de Monte Carlo sont parallèles et embarrassants.

Les principaux problèmes rencontrés concernent la perte de précision due à la limitation des puces G8x et G9x aux nombres à virgule flottante simple précision IEEE.Avec la sortie des puces GT200, cela pourrait être atténué dans une certaine mesure en utilisant l'unité de double précision, au détriment de certaines performances.Je ne l'ai pas encore essayé.

De plus, puisque CUDA est une extension C, son intégration dans une autre application peut être non triviale.

J'ai implémenté un algorithme génétique sur le GPU et obtenu des accélérations d'environ 7.Plus de gains sont possibles avec une intensité numérique plus élevée, comme quelqu'un l'a souligné.Alors oui, les gains sont là, si l'application est bonne

J'ai écrit un noyau de multiplication matricielle à valeurs complexes qui battait l'implémentation de cuBLAS d'environ 30 % pour l'application pour laquelle je l'utilisais, et une sorte de fonction de produit externe vectoriel qui exécutait plusieurs ordres de grandeur par rapport à une solution de multiplication-trace pour le reste de le problème.

C'était un projet de fin d'études.Cela m'a pris une année complète.

http://www.maths.tcd.ie/~oconbhup/Maths_Project.pdf

J'ai implémenté la factorisation Cholesky pour résoudre de grandes équations linéaires sur GPU à l'aide du SDK ATI Stream.Mes observations étaient

alt text

Vous avez obtenu une accélération des performances jusqu'à 10 fois.

Travailler sur le même problème pour l'optimiser davantage, en le adaptant à plusieurs GPU.

Oui.J'ai mis en œuvre le Filtre de diffusion anisotrope non linéaire en utilisant l'API CUDA.

C'est assez simple, puisqu'il s'agit d'un filtre qui doit être exécuté en parallèle à partir d'une image d'entrée.Je n'ai pas rencontré beaucoup de difficultés là-dessus, puisque cela nécessitait juste un noyau simple.L'accélération était d'environ 300x.C'était mon dernier projet sur CS.Le projet peut être trouvé ici (c'est écrit en portugais tu).

J'ai essayé d'écrire le Mumford&Shah l'algorithme de segmentation aussi, mais cela a été difficile à écrire, car CUDA en est encore à ses débuts et donc beaucoup de choses étranges se produisent.J'ai même constaté une amélioration des performances en ajoutant un if (false){} dans le code O_O.

Les résultats de cet algorithme de segmentation n'étaient pas bons.J'ai eu une perte de performances de 20 fois par rapport à une approche CPU (cependant, comme il s'agit d'un CPU, une approche différente donnant les mêmes résultats pourrait être adoptée).C'est encore un travail en cours, mais malheureusement j'ai quitté le laboratoire sur lequel je travaillais, alors peut-être qu'un jour je pourrais le terminer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top