**您好,我正在尝试使用 opencl 编写内核代码。但是我坚持在内核函数中出现一个奇怪的错误。 流程或多或少是这样的:
__kernel function1() {
struct mytype;
function2(&mytype);
}
function2(struct *mytype) {
uchar *ptr = mytype->value2;
function3(ptr);
}
function3(byte* ptr) {
uint16 v1 = 10;
uint16* ptr2 = (uint16*) ptr;
*ptr2 = v1 >> 8;
}
struct mytype {
uchar value1[8];
uchar value2[8];
uint key[52];
uint bufleft;
}
执行分配时代码失败:
*ptr2 = v1 >> 8;
但是我收到的唯一消息是"clFlush((:CL_UNKNOWN_ERROR" 如果我尝试分配一个值而不是一个表达式,那么它就可以工作。 我在 Ubuntu 中使用 OpenCL 1.2 CUDA
我认为这可能是未定义的行为;如果您需要引用与 2 种不同类型相同的内存,请使用联合类型。请注意,uint16 是 16 个 uint 的向量,而不是 ushort(16 位无符号整数(,需要相应地对齐。value2
只能保证在 4 字节边界上对齐(因为结构的成员uint
(,所以这还不够。
我在英特尔的 FPGA SDK for OpenCL(仿真器(上运行 OpenCL 1.0。我不得不调整您的代码才能编译,我希望不会更改一些重要的东西。
`struct mytype {
uchar value1[8];
uchar value2[8];
uint key[52];
uint bufleft;
};
void function3(char* ptr) { //I used uchar * ptr too just for kicks, same result
uint16 v1 = 10;
uint16* ptr2 = (uint16*) ptr;
*ptr2 = v1 >> 8;
}
void function2(struct mytype * a) {
uchar *ptr = a->value2;
function3(ptr);
}
__kernel void function1() {
struct mytype b;
function2(&b);
}
它运行平稳,没有运行时错误,即使我确保使用 -O0。因此,我找不到确切的解决方案,但是在仔细阅读了OpenCL 1.2规范之后,我相信您的问题可能与对齐有关。在第 239 页上,您可以找到结构的对齐属性。
当我深入研究此事时,我将编辑此答案,因此请继续关注并随时编辑。