8
votes

Quelle est la fonction la plus triviale qui bénéficierait d'être calculée sur un GPU?

Je viens de commencer l'apprentissage opencl. J'essaie d'avoir une idée de vos gains de performance à attendre lors de la déplacement des fonctions / des algorithmes sur le GPU.

Le noyau le plus basique donné dans la plupart des tutoriels est un noyau qui prend deux tableaux de nombres et résume la valeur dans les index correspondants et les ajoute à un troisième tableau, comme: P>

__kernel void 
add(__global float *a,
    __global float *b,
    __global float *answer)
{
    int gid = get_global_id(0);
    answer[gid] = a[gid] + b[gid];
}

__kernel void
sub(__global float* n,
    __global float* answer)
{
    int gid = get_global_id(0);
    answer[gid] = n[gid] - 2;
}

__kernel void
ranksort(__global const float *a,
         __global float *answer)
{
  int gid = get_global_id(0);
  int gSize = get_global_size(0);
  int x = 0;
  for(int i = 0; i < gSize; i++){
    if(a[gid] > a[i]) x++;
  }
  answer[x] = a[gid];
}


0 commentaires

6 Réponses :


3
votes

dépend de la définition de trivial. À mon avis, ce serait un produit matriciel matriciel, car il a o (3) / o (2) calculer au rapport de mémoire. Les algorithmes qui présentent des ratios similaires, sont susceptibles de bénéficier d'être concurrentiels sur le GPU.


1 commentaires

La multiplication de matrice est loin d'une application triviale et non le meilleur exemple d'application pouvant bénéficier du calcul du GPU.



0
votes

Après la multiplication de matrice, je dirais que la convolution d'image (telle que flou, dénoing, etc.). Découvrez Tutoriel d'AMD .


0 commentaires

2
votes

Bien que votre noyau soit clairement très trivial, il peut s'agir d'un exemple utile, il est complètement de mémoire car pour chaque élément que vous avez deux lectures et une seule écriture, et une seule opération arithmétique. Il y a quelques instructions pour calculer l'adresse, etc., mais tout cela permet de ne pratiquement rien comparé au coût d'accès à la mémoire.

En supposant que les données sont déjà sur le GPU, vous pouvez bénéficier de la bande passante très élevée du GPU à la mémoire même pour ce noyau simple.

Bien sûr, GPU s'appuie sur vous avoir suffisamment de threads pour masquer la latence de la mémoire, de sorte que votre format de groupe de travail local doit être assez grand (par exemple 256 ou 512) et votre taille de groupe de travail mondial devrait être très grande (par exemple des centaines de milliers de milliers de personnes. ) Pour que cela soit efficace, mais c'est un peu le point!


0 commentaires

6
votes

Si vous avez un ensemble de matrices suffisamment volumineux, vous avez l'intention d'effectuer des opérations d'algèbre linéaire sur ou que vous effectuez essentiellement la même opération sur chaque élément, je considérerais cela comme un exemple trivial. Multiplication Matrix, addition, FFT, Convolution, etc. Vous verrez un peu de vitesse sans faire beaucoup de travail. Maintenant, si vous souhaitez voir les 100x ScarpsUps, vous devez approfondir la gestion de la mémoire et connaître un peu de ce qui se passe dans les coulisses.

Pour commencer, je vous recommanderais de commencer par Pycuda car il est assez simple de commencer car il fournit un très haut niveau d'abstraction et vous permettra de sauter très rapidement. Découvrez ce cours sur l'informatique parallèle à l'aide de Cuda de l'Université de l'Illinois http: //courses.ece. Illinois.edu/ece498/al/ Lorsque vous êtes prêt à plonger plus loin.


0 commentaires

0
votes

Qu'est-ce que "le plus trivial" est une question d'opinion, mais je dirais que le calcul d'une image de l'ensemble Mandelbrot est une application assez simple à l'aide du GPU. Chaque point est totalement indépendant de tous les autres points afin que vous puissiez démarrer un fil pour chaque point et obtenir un effectif formidable. La formule elle-même qui est itératée est une simple fonction quadratique. Je l'ai utilisé comme exemple dans un tutoriel qui peut être trouvé sur mon blog ici , il suffit de calculer les chiffres sans même faire une image pour le rendre encore plus simple. Presque tout problème parallèle embarrassant (voir Wikipedia Entry) est un bon pour commencer.


0 commentaires

1
votes

Je sais que la question est assez ancienne mais ... J'ai constaté que les calculs de l'ensemble Mandelbrot sont assez optimaux pour GPU. Vous avez un vecteur d'entrée complexe (flotteur) et une sortie scalaire (int) et vous aurez une centaine d'opérations par vecteur d'entrée en moyenne.

Il pourrait être utilisé comme bon exemple d'application, comme il ...

  • a un jeu de données d'entrée en 2 dimensions (calcule une image)
  • Vous pouvez expliquer des fronts d'onde et pourquoi le traitement 2 dimensions est bénéfique dans certains cas
  • démontre des types de données de vecteur
  • produit une image, qui est rapidement vérifiable par les yeux humains (débogage)
  • peut être facilement prolongé par: Mappage de couleur (__Cactsant), traitement flottant au lieu de float2 (optimisation), produisant des vecteurs de sortie INT4 (R, G, B, A) (optimisation). Étapes de réduction (RGBA) => (RVB)
  • besoin de connaissances mathématiques est acceptable (formule simple)

    Cordialement, Stefan


0 commentaires