如何在Opencl内核中的本地地址空间中传递数组

时间:2017-04-21 12:21:48

标签: c opencl

我想将一个数组传递给本地地址空间中的OpenCL内核。但我得到CL_invalid_VALUE

int a[]={1,2,3,4,5};

我们不需要创建缓冲区来传递本地地址空间中的数据。所以:

clSetKernelArg(kernel, 21, sizeof(int)*5,a);

在内核中

__kernel void abc(__local int *a)
{} 

如果我将__local更改为__global,一切正常。请告诉我怎么做。

1 个答案:

答案 0 :(得分:1)

您无法从主机向本地内存传递任何内容。

在内核参数中指定本地指针的目的是在运行时指定本地缓冲区的大小。然后在clSetKernelArg调用中,第3个参数是大小,第4个参数必须为NULL。Documentation

假设您正在使用GPU,您可以将其传递给常量内存,如果它始终相同,则初始化内核中的本地内存,或者只是将其传递给全局内存,然后将其加载到内核中,最好使用{{ 3}}