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?

Juste un commentaire. C'est OpenCL pas CUDA. Vous n'êtes pas obligé d'utiliser des multiples de groupe de travail de tailles. Je vois très souvent thouse moche " si (idx < num)'. Ce n'est pas nécessaire dans la prise en charge d'OpenCL depuis le groupe de travail de la taille peut être parfaitement définies afin de répondre aux besoins de données à traiter.

OriginalL'auteur Adam S | 2011-08-25