Сбой присвоения переменной 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 вы можете найти атрибуты выравнивания для структур.
Я отредактирую этот ответ, когда углублюсь в это дело, так что следите за обновлениями и не стесняйтесь редактировать.