**您好,我正在尝试使用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
答案 0 :(得分:2)
我认为这可能是未定义的行为;如果需要引用与2种不同类型相同的内存,请使用联合类型。请注意,uint16是16 uints的向量,而不是ushort(16位无符号整数),需要相应地对齐。 value2
只能保证在4字节边界上对齐(因为结构的uint
成员)所以这还不够。
答案 1 :(得分:0)
我在英特尔的OpenCL(仿真器)FPGA SDK上运行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 Specification后,我认为您的问题可能与Alignment有关。在页239,您可以找到结构的对齐属性。
我会在深入研究这个问题时编辑这个答案,敬请期待并随意编辑。