我在这里的一篇文章中看到我们可以从OpenCL内核调用一个函数。但在我的情况下,我需要并行化复杂的函数(由所有可用的线程运行),所以我是否必须将该函数作为内核并直接调用它,就像来自主内核的函数一样?或者这种情况可能的解决办法?提前致谢
答案 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)
如果我正确理解你的问题,你想要从内核中对缓冲区进行单独的完整传递。我认为这不可能来自内核,因此您必须为“内部”传递创建代码作为单独的内核,并且还要与主机代码分开调用该内核。该内核的输出不必读回主机内存,但可以在内核调用之间保留在设备内存中。