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

时间:2011-10-12 13:58:13

标签: opencl

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

3 个答案:

答案 0 :(得分: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]);
}

答案 1 :(得分:6)

OpenCL 2.0 spec增加了动态参与派的新功能。

6.13.17 Enqueuing Kernels 
OpenCL 2.0 allows a kernel to independently enqueue to the same device, without host 
interaction. ...

在下面的示例中,my_func_B在设备上输入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);});
 ...
}

答案 2 :(得分:3)

如果我正确理解你的问题,你想要从内核中对缓冲区进行单独的完整传递。我认为这不可能来自内核,因此您必须为“内部”传递创建代码作为单独的内核,并且还要与主机代码分开调用该内核。该内核的输出不必读回主机内存,但可以在内核调用之间保留在设备内存中。