44 votes

Obstacles dans OpenCL

En OpenCL, ma compréhension est que vous pouvez utiliser l' barrier() fonction pour synchroniser les threads dans un groupe de travail. Je n' (en général), comprendre ce qu'ils sont et quand les utiliser. Je suis également conscient que tous les threads d'un groupe de travail doit frapper la barrière, sinon il y a des problèmes. Cependant, chaque fois que j'ai essayé d'utiliser les obstacles jusqu'à présent, il semble résulter soit de mon pilote vidéo panne, ou un message d'erreur sur l'accès à la mémoire non valide d'une certaine sorte. J'ai vu cela sur 2 différentes cartes vidéo jusqu'à présent (1 ATI, 1 NVIDIA).

Donc, mes questions sont les suivantes:

  1. Aucune idée de pourquoi cela arriverait?
  2. Quelle est la différence entre barrier(CLK_LOCAL_MEM_FENCE) et barrier(CLK_GLOBAL_MEM_FENCE)? J'ai lu la documentation, mais il n'était pas clair pour moi.
  3. Est-il de la règle générale sur l'utilisation de barrier(CLK_LOCAL_MEM_FENCE) vs barrier(CLK_GLOBAL_MEM_FENCE)?
  4. Est-il jamais un temps que la convocation barrier() avec le mauvais type de paramètre peut causer une erreur?

33voto

FelixCQ Points 1171

Comme vous l'avez dit, les obstacles ne peuvent synchroniser les threads dans le même groupe de travail. Il n'y a aucun moyen de synchroniser les différents groupes de travail dans un noyau.

Maintenant pour répondre à votre question, le cahier des charges n'était pas clair pour moi non plus, mais il me semble que l'article 6.11.9 contient la réponse:

CLK_LOCAL_MEM_FENCE – La fonction de barrière sera à fleur de tout les variables stockées dans la mémoire locale ou de la file d'attente d'un mémoire de clôture afin de s'assurer classement correct des opérations de mémoire à la mémoire locale.

CLK_GLOBAL_MEM_FENCE – La barrière de la fonction de file d'attente d'un mémoire en clôture de afin d'assurer le bon ordre des opérations de mémoire à la mémoire globale. Cela peut être utile lorsque le travail-éléments, par exemple, écrire pour le tampon ou l'image de la mémoire des objets et que vous souhaitez lire les données mises à jour.

Donc, à ma connaissance, vous devez utiliser CLK_LOCAL_MEM_FENCE lors de l'écriture et de la lecture à l' __local de l'espace mémoire, et CLK_GLOBAL_MEM_FENCE lors de l'écriture et readin à l' __global d'espace mémoire.

Je n'ai pas testé si c'est plus lentement, mais la plupart du temps, quand j'ai besoin d'une barrière et j'ai un doute à ce sujet, l'espace mémoire est affectée, j'ai simplement utiliser une combinaison des deux, c'est à dire:

barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE);

De cette façon, vous ne devez pas avoir de mémoire de lecture\par écrit de la commande de problème (tant que vous êtes sûr que tous les fils dans le groupe passe à travers la barrière, mais vous êtes au courant de cela).

Espérons que cela aide.

32voto

mfa Points 2742

Faire revivre un vieux-ish thread ici. J'ai eu un peu de mal avec barrière() me.

Concernant votre problème de blocage, l'une des causes potentielles pourrait être si votre mur est à l'intérieur d'un état. J'ai lu que lors de l'utilisation de la barrière, TOUS les éléments de travail dans le groupe doit être en mesure d'atteindre cet enseignement, ou vous accrocher votre noyau résultant généralement d'un crash.

if(someCondition){
  //do stuff
  barrier(CLK_LOCAL_MEM_FENCE);
  //more stuff
}else{
  //other stuff
}

Ma compréhension est que, si un ou plusieurs éléments de travail satisfait someCondition, TOUS les éléments de travail doivent satisfaire à cette condition, ou il y aura certains qui permettra de sauter la barrière. Les obstacles attendre jusqu'à ce que TOUS les éléments de travail en arriver à ce point. Pour corriger le code ci-dessus, j'ai besoin de restructurer un peu:

if(someCondition){
  //do stuff
}
barrier(CLK_LOCAL_MEM_FENCE);
if(someCondition){
  //more stuff
}else{
  //other stuff
}

Maintenant, tous les éléments de travail permettra d'atteindre la barrière.

Je ne sais pas dans quelle mesure cela s'applique à boucles; si un élément de travail des sauts à partir d'une boucle for, est-il frappé d'obstacles? Je ne suis pas sûr.

Mise à JOUR: j'ai réussi à écraser un peu ocl programmes avec une barrière dans une boucle for. Assurez-vous que tous les éléments de travail à la sortie de la boucle for dans le même temps - ou, mieux encore, mettre la barrière de l'extérieur de la boucle.

(source: Calcul Hétérogène avec OpenCL Chapitre 5, p90-91)

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