OpenCL:无法将整数传递给常量内存

时间:2014-12-12 03:29:36

标签: opencl

我写了一个这样的内核

kernel void computeLayerOutput_Rolled(global Layer* restrict layers, constant int* restrict netSpec, __constant const int layer1)

但是在创建内核时发生cl::Error,错误信息是

:29:123: error: invalid address space for argument to __kernel function
kernel void computeLayerOutput_Rolled(global Layer* restrict layers, constant int* restrict netSpec, __constant const int layer1)
                                                                                                                          ^
:29:123: error: parameter may not be qualified with an address space

terminate called after throwing an instance of 'cl::Error'
  what():  clCreateKernel

当我删除__constant layer1限定符时,一切正常,但我不想将其放入私有内存,因为它可能占用每个工作项中的寄存器。传递一个只有一个元素的数组似乎也不是一个非常优雅的解决方案。

我只是想知道有没有其他方法可以解决它?

2 个答案:

答案 0 :(得分:3)

规范说(标签我的):

  

(1)a中函数参数的通用地址空间名称   程序或函数的局部变量是__private。所有论点   __kernel函数应位于__private地址空间。

     

(2)声明为类型指针的__kernel函数参数只能指向以下地址空间之一:__global__local   或__constant

换句话说,在内核参数中只能将指针限定为__constantlayer1不是指针,因此它不能是__constant

  

我不想把它放入私人记忆中,因为它可能会占用每个工作项中的记录。

layer1 已经已经使用寄存器,因为它在私有内存中已经:如quote(1)所示,内核函数的所有参数在__private地址空间中,可以映射到寄存器。

澄清一下,在撰写constant int* restrict netSpec时,请不要混淆:

  • 指针的地址空间 (参数netSpec位于__private地址空间)
  • 指针对象的地址空间netSpec指向__constant地址空间的内容

答案 1 :(得分:1)

我遇到了同样的问题'不久前。我已经习惯了CUDA C / C ++处理常量内存的方式,并试图找到一种解决方案,以便在OpenCL中获得相同的便利。长话短说,我没找到。如果你想要恒定的记忆,你可以做两件事:

  1. 按照建议传入指向常量地址空间的指针,或
  2. 使用#defines并重新编译
  3. 非解决方案非常漂亮,但他们做了应该做的事情。

    但是,如果传递一个整数的唯一问题是担心更高的寄存器使用率而不是你可以继续,只提供每个值的整数。如果指针的大小为32位,则单个整数值将占用与常量存储器指针一样多的寄存器。