Назначение переменной 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


person Lehrling    schedule 18.06.2018    source источник


Ответы (2)


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

person pmdj    schedule 19.06.2018

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

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

person lil' wing    schedule 18.06.2018