使用带变量的算术表达式时 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 成员)所以这还不够。