Programmation GPU
En CUDA, __syncthreads() est placé dans « if (threadIdx.x < 16) », de sorte que seuls certains threads le franchissent. Que peut-il se produire ?
- ALa synchronisation se fait entre les 16 threads seulement et le programme fonctionne correctement
- BLes autres threads n'arrivant jamais, le bloc peut se bloquer ou le résultat devenir indéterminé
- C__syncthreads() est automatiquement ignoré et rien ne se passe
Afficher la réponse et l'explication
Réponse : B. Les autres threads n'arrivant jamais, le bloc peut se bloquer ou le résultat devenir indéterminé
__syncthreads() attendant l'arrivée de tous les threads du bloc, le placer dans une branche que seuls certains threads franchissent revient à attendre des threads qui ne viendront jamais. Le comportement n'est pas défini par la spécification ; en pratique, le bloc peut se bloquer ou, s'il fonctionne par hasard, produire des résultats erronés. En principe, la synchronisation s'écrit hors des branchements, à un endroit que tous les threads franchissent obligatoirement.