使用带变量的算术表达式时,OpenCL变量赋值失败

时间:2018-06-18 21:13:22

标签: opencl gpu nvidia hashcat

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

答案 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,您可以找到结构的对齐属性。

我会在深入研究这个问题时编辑这个答案,敬请期待并随意编辑。