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

How to pass a array in local address space in Opencl kernel

我想将数组传递给本地地址 space 中的 OpenCL 内核。但是我得到 CL_invalid_VALUE.

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

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

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

在内核中

__kernel void abc(__local int *a)
{} 

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

您不能将任何内容从主机传递到本地内存。

在内核参数中指定局部指针的目的是为了在运行时指定局部缓冲区的大小。然后在 clSetKernelArg 调用中,第三个参数是大小,第四个参数必须为 NULL。Documentation

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