我有一个 struct Primitive,它具有以下定义:
typedef struct Primitive {
float m[12];
float invm[12];
enum PrimitiveType type;
int rayDensity;
float util1;
float util2;
} Primitive;
我在一个常量内存缓冲区中将这些结构的数组传递给我的内核:
__constant Primitive *objects;
作为优化练习的一部分,我想看看将结构加载到本地内存中,所以我的内核有这样的代码:
__kernel void test(int n_objects, __constant Primitives *objects) {
local Primitive pFrom, pTo;
for(int i = 0; i < n_objects; i++) {
pFrom = objects[i];
}
}
当我运行它时,我得到一个编译错误说:
ptxas application ptx input, line 42; error: State space mismatch between instruction and address in instruction 'ld'
作为一个实验,我尝试首先将结构复制到私有变量,然后复制到局部变量,如下所示:
__kernel void test(int n_objects, __constant Primitives *objects) {
Primitive pF, Pt;
local Primitive pFrom, pTo;
for(int i = 0; i < n_objects; i++) {
pF = objects[i]
pFrom = pF;
}
}
现在可以编译并运行,但是似乎该对象没有被深度复制到局部变量 pFrom 中。
请注意,我的代码示例纯粹是示例,为简洁起见,我删除了所有内容。当我直接从常量全局内存中使用原始结构时,我的代码也可以正常工作。
有谁知道我在这里缺少什么,肯定是深度复制或 OpenCL 地址空间的一些基本原理。