【问题标题】:How to pass a array in local address space in Opencl kernel如何在 Opencl 内核的本地地址空间中传递一个数组
【发布时间】:2017-04-25 14:57:37
【问题描述】:

我想将一个数组传递给本地地址空间中的 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,一切正常。请告诉我该怎么做。

【问题讨论】:

  • 首先,将sizeof(int)*5 替换为sizeof(a)
  • 我没有跟上 opencl 的速度,但如果指向内存的性质和位置确实相关,那么您没有提供足够的信息来确定这一点。与往常一样,我们希望收到minimal reproducible example,如果您提供一个有用的答案,您获得有用答案的机会将大大提高。

标签: c opencl


【解决方案1】:

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

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

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

【讨论】:

  • 但是我们可以将数据从主机传递到私有内存。还有一本名为“[Aaftab Munshi, Benedict Gaster, Timothy Mattson”的书名为“Opencl Programming guide”,第 1 页。 - 134 ,它们表明可以将元素从主机传递到本地内存。
  • 我已经编辑了答案,希望能消除您的任何困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多