2 votes

Comment réduire le temps de mise en file d'attente d'OpenCL/autres idées ?

J'ai un algorithme et j'ai essayé de l'accélérer en utilisant OpenCL sur mon nVidia.

Il doit traiter une grande quantité de données (disons de 100 000 à des millions), où pour chaque donnée : une matrice (sur le dispositif) doit d'abord être mise à jour (en utilisant la donnée et deux vecteurs) ; et seulement après que la matrice entière a été mise à jour, les deux vecteurs (également sur le dispositif) sont mis à jour en utilisant la même donnée. Mon code hôte ressemble donc à ceci

for (int i = 0; i < milions; i++) {
        clSetKernelArg(kernel_matrixUpdate, 7, sizeof(int), (void *)&i); 
        clSetKernelArg(kernel_vectorsUpdate, 4, sizeof(int), (void *)&i);       
        clEnqueueNDRangeKernel(command_queue, kernel_matrixUpdate, 1, NULL, &global_item_size_Matrix, NULL, 0, NULL, NULL);
        clEnqueueNDRangeKernel(command_queue, kernel_vectorsUpdate, 1, NULL, &global_item_size_Vectors, NULL, 0, NULL, NULL);}

Malheureusement, l'exécution de cette boucle est plus longue que celle des noyaux eux-mêmes. Mes questions sont donc les suivantes :

  • Existe-t-il un moyen de mettre en file d'attente N noyaux plus efficacement ?
  • Existe-t-il un moyen de mettre à jour l'ensemble de la matrice d'abord, puis les vecteurs, sans utiliser des noyaux distincts ? Par exemple, l'appareil exécute-t-il les noyaux dans l'ordre (c'est-à-dire le premier groupe de travail avec 0,1,...,63 ; le deuxième groupe de travail avec 64,...) ? Mais je suppose que ce serait une mauvaise pratique de toute façon...
  • D'autres idées ? :D

Tout retour d'information ou avis sera apprécié. Nous vous remercions de votre attention.

0voto

user9111337 Points 165

Vous devez télécharger toutes vos données vers le GPU, puis appeler un noyau avec un élément de travail par élément, au lieu de la boucle for.

En général, lorsqu'on passe du CPU au GPU, la boucle "for" la plus éloignée devient une invocation du noyau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X