使用带变量的算术表达式时 OpenCL 变量赋值失败
OpenCL variable assignment fails when using arithmetic expressions with variable
**您好,我正在尝试使用 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
我是 运行 OpenCL 1.0,用于 Intel 的 FPGA SDK for OpenCL(模拟器)。我必须调整你的代码才能编译,我希望没有改变一些重要的东西。
`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 后,我相信您的问题可能与对齐有关。在第 239 页,您可以找到结构的对齐属性。
随着我对此事的深入研究,我将编辑此答案,敬请期待并随时编辑。
我认为这可能是未定义的行为;如果您需要引用与 2 种不同类型相同的内存,请使用联合类型。请注意,uint16 是 16 个 uint 的向量,而不是 ushort(16 位无符号整数),需要相应地对齐。 value2
仅保证在 4 字节边界上对齐(因为结构的 uint
成员)所以这还不够。
**您好,我正在尝试使用 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我是 运行 OpenCL 1.0,用于 Intel 的 FPGA SDK for OpenCL(模拟器)。我必须调整你的代码才能编译,我希望没有改变一些重要的东西。
`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 后,我相信您的问题可能与对齐有关。在第 239 页,您可以找到结构的对齐属性。
随着我对此事的深入研究,我将编辑此答案,敬请期待并随时编辑。
我认为这可能是未定义的行为;如果您需要引用与 2 种不同类型相同的内存,请使用联合类型。请注意,uint16 是 16 个 uint 的向量,而不是 ushort(16 位无符号整数),需要相应地对齐。 value2
仅保证在 4 字节边界上对齐(因为结构的 uint
成员)所以这还不够。