Сбой присвоения переменной OpenCL при использовании арифметических выражений с переменной

** Здравствуйте, я пытаюсь закодировать ядро, используя 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" Если я пытаюсь присвоить значение, а не выражение, то это работает. Я использую OpenCL 1.2 CUDA в Ubuntu

2 ответа

Решение

Я думаю, что это может быть неопределенным поведением; если вам нужно сослаться на одну и ту же память как два разных типа, используйте тип объединения. Обратите внимание, что uint16 - это вектор из 16 uints, а не ushort (16-разрядное целое число без знака), и его необходимо соответствующим образом выровнять. value2 гарантируется выравнивание только на 4-байтовой границе (из-за uint члены структуры), так что этого будет недостаточно.

Я использую OpenCL 1.0 на FPGA SDK от Intel для 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, я думаю, что ваша проблема, возможно, связана с выравниванием. На странице 239 вы можете найти атрибуты выравнивания для структур.

Я отредактирую этот ответ, когда углублюсь в это дело, так что следите за обновлениями и не стесняйтесь редактировать.

Другие вопросы по тегам