1

**您好,我正在尝试使用 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

4

2 回答 2

2

我认为这可能是未定义的行为;如果您需要将相同的内存引用为两种不同的类型,请使用联合类型。请注意,uint16 是 16 个 uint 的向量,而不是 ushort(16 位无符号整数),需要相应对齐。value2只保证在 4 字节边界上对齐(因为uint结构的成员),所以这还不够。

于 2018-06-19T11:04:39.603 回答
0

我在英特尔的 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 Specification之后,我相信您的问题可能与对齐有关。在第 239 页,您可以找到结构的对齐属性。

随着我对此事的深入研究,我将编辑此答案,因此请继续关注并随时进行编辑。

于 2018-06-18T22:12:24.523 回答