从另一个OpenCL内核调用OpenCL内核

Akh*_*Ali 10 opencl

我在这里的一篇文章中看到我们可以从OpenCL内核调用一个函数.但在我的情况下,我需要并行化复杂的函数(由所有可用的线程运行),所以我是否必须将该函数作为内核并直接调用它,就像来自主内核的函数一样?或者这种情况可能的解决办法?提前致谢

sra*_*mij 8

您可以从内核调用辅助函数,它们将以与内核相同的方式进行并行化,将它们想象为内核代码中的内联函数.因此,每个工作项将调用它处理的工作集的辅助函数.

float4 helper_function(float4 input)
{
   return input.x + input.y + input.z + input.w;
}
__kernel kernel_function(const float4* arr, float4* out)
{
  id = get_global_id(0);
  out[id] = helper_function(arr[id]);
}
Run Code Online (Sandbox Code Playgroud)


zr.*_*zr. 6

OpenCL 2.0规范增加了动态并行的新功能.

6.13.17 Enqueuing Kernels 
OpenCL 2.0 allows a kernel to independently enqueue to the same device, without host 
interaction. ...
Run Code Online (Sandbox Code Playgroud)

在下面的示例中,设备上的my_func_B enqueus my_func_A:

kernel void
my_func_A(global int *a, global int *b, global int *c)
{
 ...
}

kernel void
my_func_B(global int *a, global int *b, global int *c)
{
 ndrange_t ndrange;
 // build ndrange information
 ...
 // example – enqueue a kernel as a block
 enqueue_kernel(get_default_queue(), ndrange, ^{my_func_A(a, b, c);});
 ...
}
Run Code Online (Sandbox Code Playgroud)