2017-04-21 75 views
0

我想在本地地址空间中将数组传递给OpenCL内核。但我得到CL_invalid_VALUE如何在Opencl内核的本地地址空间中传递数组

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

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

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

内核

__kernel void abc(__local int *a) 
{} 

如果我改变__local__global,一切工作正常。请告诉我如何做到这一点。

+1

首先,将'sizeof(int)* 5'替换为'sizeof(a)' – tilz0R

+1

我并不熟悉opencl,但如果指向内存的性质和位置确实相关,那么你还没有提供足够的信息来确定这一点。与往常一样,我们期待[mcve],如果您提供一个有用答案,您的机会将大大提高。 –

回答

1

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

在内核参数中使用本地指针的目的是在运行时分析本地缓冲区的大小。然后在clSetKernelArg调用第三个参数是大小和第四个参数必须为NULL。 Documentation

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

+0

但是我们可以将数据从主机传递到私有内存。还有一本书名为“[Aaftab Munshi,Benedict Gaster,Timothy Mattson”,页码为“Opencl Programming Guide”)。 - 134,它们表明可以将元素从主机传递到本地内存。 – anil

+0

我已经编辑了答案,希望能够清除您的任何疑惑。 – Jovasa

相关问题