Функция printf не работает в ядре OpenCL

Привет, я пытаюсь отладить код ядра OpenCL на PS3. Вот код:

#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable

int offset() {
    return 'A' - 'a';
}

__kernel void tKernel(__global unsigned char *in, __global unsigned char *out) {    
    size_t i;
    printf(“var”);
    for (i = 0; i < 10; i++)
        out[i] = in[i] + offset();
}

В IBM OpenCL_guide.pdf в разделе 4.3.3 на стр. 18 описано ядро ​​отладки с методом printf. Поэтому я добавляю функцию printf в свое ядро ​​и пытаюсь протестировать ее. Но компиляция OpenCL дала мне эту ошибку:

"IBM_OpenCL_kernel.cl", строка 9.15: 1506-766 (S). Имя универсального символа "?" не находится в допустимом диапазоне для идентификатора.

Я также экспортировал переменную LD_LIBRARY_PATH. Может ли кто-нибудь иметь эту проблему?

2 ответа

Я не знаю о реализации IBM, но printf() - это нестандартная функция OpenCL. На платформе AMD вы должны включить расширение через:

#pragma OPENCL EXTENSION cl_amd_printf : enable

до того, как printf() будет работать. Возможно, расширение должно быть включено и на платформе IBM?

(Обновление) На этой странице можно использовать имя расширения, которое может быть cl_intel_printf, поэтому попробуйте:

#pragma OPENCL EXTENSION cl_intel_printf : enable

Кажется, что ваша реализация OpenCL не поддерживает printf, или, возможно, вы используете аппаратное устройство вместо эмулируемого.

По моему мнению, вам не следует использовать printf вообще, это не достаточно острый инструмент, чтобы дать ответы с более сложными аппаратно-зависимыми проблемами. Попробуйте использовать дополнительный аргумент aka '__global float* output'. Заполните его внутри ядра чем-то вроде if (something_happened) { output[get_global_id(0)] = the_value_you_need_to_debug; } это поможет вам диагностировать любую возможную проблему, и этот подход не зависит от платформы

Функция printf не поддерживается при сборке в системе. Вы можете использовать его только в программной и аппаратной эмуляции.

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