OpenCL est-il possible d'appeler une autre fonction à partir d'un noyau?
Je suis en train de suivre un tutoriel trouve ici: http://opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201
Le noyau ont été répertoriées de cette, qui calcule la somme de deux nombres et la stocke dans la variable de sortie:
__kernel void vector_add_gpu (__global const float* src_a,
__global const float* src_b,
__global float* res,
const int num)
{
/* get_global_id(0) returns the ID of the thread in execution.
As many threads are launched at the same time, executing the same kernel,
each one will receive a different ID, and consequently perform a different computation.*/
const int idx = get_global_id(0);
/* Now each work-item asks itself: "is my ID inside the vector's range?"
If the answer is YES, the work-item performs the corresponding computation*/
if (idx < num)
res[idx] = src_a[idx] + src_b[idx];
}
1) supposons par exemple que l'opération est beaucoup plus complexe qu'une sommation - quelque chose qui justifie sa propre fonction. Appelons ça de la ComplexOp(in1, in2, out). Comment pourrais-je aller sur la mise en œuvre de cette fonction telle que vector_add_gpu() peut faire appel et de l'utiliser? Pouvez-vous donner un exemple de code?
2) Maintenant, nous allons prendre l'exemple à l'extrême, et maintenant, je veux appeler une fonction générique qui fonctionne sur les deux nombres. Comment pourrais-je le configurer de sorte que le noyau peut être passé d'un pointeur sur cette fonction et l'appel en tant que de besoin?
OriginalL'auteur Adam S | 2011-08-25
Vous devez vous connecter pour publier un commentaire.
Oui c'est possible. Vous avez juste à rappeler que OpenCL est basé sur C99 avec quelques mises en garde. Vous pouvez créer d'autres fonctions, soit à l'intérieur d'un même noyau de fichier ou dans un autre fichier et simplement l'inclure dans le début. Fonctions auxiliaires ne doivent pas être déclarés en ligne cependant, gardez à l'esprit que OpenCL va inline fonctions lorsqu'il est appelé. Les pointeurs ne sont pas disponibles à utiliser lors de l'appel de fonctions auxiliaires.
Exemple
Au sein d'une opencl noyau pointeurs ne peut pas être utilisé n'importe où dans un noyau ou lors de l'appel d'une fonction à partir d'un noyau. Les pointeurs sont une de ces mises en garde. Une raison pour laquelle vous n'avez pas besoin de pointeur passe est que les fonctions sont toujours incorporé au lieu de livraison à une autre adresse mémoire.
OriginalL'auteur Edward Carmack
Vous pouvez avoir les fonctions auxiliaires pour une utilisation dans le noyau, voir OpenCL défini par l'utilisateur des fonctions inline . Vous ne pouvez pas passer des pointeurs de fonction dans le noyau.
OriginalL'auteur Adam S.