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.