我写了一个这样的内核
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
限定符时,一切正常,但我不想将其放入私有内存,因为它可能占用每个工作项中的寄存器。传递一个只有一个元素的数组似乎也不是一个非常优雅的解决方案。
我只是想知道有没有其他方法可以解决它?
答案 0 :(得分:3)
规范说(标签我的):
(1)a中函数参数的通用地址空间名称 程序或函数的局部变量是
__private
。所有论点__kernel
函数应位于__private
地址空间。(2)声明为类型指针的
__kernel
函数参数只能指向以下地址空间之一:__global
,__local
或__constant
。
换句话说,在内核参数中只能将指针限定为__constant
。 layer1
不是指针,因此它不能是__constant
。
我不想把它放入私人记忆中,因为它可能会占用每个工作项中的记录。
layer1
已经已经使用寄存器,因为它在私有内存中已经:如quote(1)所示,内核函数的所有参数在__private
地址空间中,可以映射到寄存器。
澄清一下,在撰写constant int* restrict netSpec
时,请不要混淆:
netSpec
位于__private
地址空间)netSpec
指向__constant
地址空间的内容答案 1 :(得分:1)
我遇到了同样的问题'不久前。我已经习惯了CUDA C / C ++处理常量内存的方式,并试图找到一种解决方案,以便在OpenCL中获得相同的便利。长话短说,我没找到。如果你想要恒定的记忆,你可以做两件事:
非解决方案非常漂亮,但他们做了应该做的事情。
但是,如果传递一个整数的唯一问题是担心更高的寄存器使用率而不是你可以继续,只提供每个值的整数。如果指针的大小为32位,则单个整数值将占用与常量存储器指针一样多的寄存器。