Programmation GPU
En CUDA, comment le programme côté CPU reçoit-il les résultats calculés par un noyau GPU (une fonction marquée __global__) ?
- APar la valeur de retour du noyau, qui renvoie ensemble au CPU les résultats de tous les threads
- BLe noyau écrit ses résultats dans un tableau en mémoire GPU et, une fois le noyau terminé, le côté CPU copie ce tableau dans la mémoire CPU (ou lit la mémoire unifiée)
- CLe programme côté CPU lit comme variables les valeurs que chaque thread a affichées avec printf
Afficher la réponse et l'explication
Réponse : B. Le noyau écrit ses résultats dans un tableau en mémoire GPU et, une fois le noyau terminé, le côté CPU copie ce tableau dans la mémoire CPU (ou lit la mémoire unifiée)
Un noyau GPU est exécuté par de nombreux threads à la fois : il ne peut donc pas renvoyer ses résultats par une seule valeur de retour, et en CUDA le type de la valeur de retour d'une fonction __global__ doit être void. Le côté CPU alloue un tableau en mémoire GPU et en passe le pointeur en argument, et chaque thread écrit son résultat dans l'élément dont il a la charge. Comme le lancement d'un noyau est asynchrone, le côté CPU recopie le tableau avec cudaMemcpy ou une fonction similaire une fois le noyau terminé (dans le même flux, la copie attend la fin du noyau précédent). printf dans un noyau est une aide au débogage destinée à l'affichage, et le programme ne peut pas relire ces valeurs.