Функция printf не работает в ядре OpenCL - PullRequest
4 голосов
/ 25 апреля 2011

Привет, я пытаюсь отладить код ядра 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 ]

8 голосов
/ 27 апреля 2011

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

#pragma OPENCL EXTENSION cl_amd_printf : enable

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

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

#pragma OPENCL EXTENSION cl_intel_printf : enable
6 голосов
/ 26 апреля 2011

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

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

...