У меня есть проект, который я создал на Mac Pro, используя двойной тип данных, и он отлично работает. Теперь я перевел свой проект на MacBook Air, и он начал давать мнеOpenCL double precision not working
Exception
ERROR: clBuildProgram(-11)
ошибка. Теперь причина в том, что мой MacBook Air не поддерживает двойной тип точности с OpenCL. Но, наоборот, я нашел это: ошибка ядра OpenCL на Mac OSx. Я применил метод в ответ, как это:
cl_device_fp_config cfg;
clGetDeviceInfo(devicesIds[0], CL_DEVICE_DOUBLE_FP_CONFIG, sizeof(cfg), &cfg, NULL); // 0 is for the device number I guess?
printf("Double FP config = %llu\n", cfg);
И он объяснил, что, если результат равен 0, то это означает, что двойная точность не поддерживается. Но я получаю этот результат:
Double FP config = 63
Я также попробовал этот метод:
if (!cfg) {
printf("Double precision not supported \n\n");
} else {
printf("Following double precision features supported:\n");
if(cfg & CL_FP_INF_NAN)
printf(" INF and NaN values\n");
if(cfg & CL_FP_DENORM)
printf(" Denormalized numbers\n");
if(cfg & CL_FP_ROUND_TO_NEAREST)
printf(" Round To Nearest Even mode\n");
if(cfg & CL_FP_ROUND_TO_INF)
printf(" Round To Infinity mode\n");
if(cfg & CL_FP_ROUND_TO_ZERO)
printf(" Round To Zero mode\n");
if(cfg & CL_FP_FMA)
printf(" Floating-point multiply-and-add operation\n\n");
}
И я получил следующие результаты:
Double FP config = 63
Following double precision features supported:
INF and NaN values
Denormalized numbers
Round To Nearest Even mode
Round To Infinity mode
Round To Zero mode
Floating-point multiply-and-add operation
Что здесь происходит? Поддерживает ли моя система двойную точность с OpenCL или нет? Если да, как мне его включить и использовать? Если нет, то каковы мои альтернативы? Теперь я очень смущен. Прежде всего, я не знаю, поддерживает ли MacBook Air двойную точность или нет? По-видимому, это не так. Но с выходом, похоже, так оно и есть.
Если он не поддерживает двойную точность, то что мне делать? Должен ли я изменить все в своем проекте на плавающие значения? ИЛИ, если это так, то как мне включить его? Потому что я следовал за множеством учебников и примеров, и никто из них не работал. например https://streamcomputing.eu/blog/2013-10-17/writing-opencl-code-single-double-precision/, но ни один из них, похоже, не работает.
EDIT:
Откуда вы знаете, что причина -11 другими словами 'CL_BUILD_PROGRAM_FAILURE' заключается в том, что устройство не поддерживает парные? Отправьте свой журнал сборки CL. Вы можете получить его с помощью 'clGetProgramBuildInfo'. – maZZZu
Потому что, когда я использовал очень минимальное ядро без двойников, он работал отлично. Но как только я ввел двойное в ядро, он дал мне эту ошибку. Не беспокойтесь, мое исследование того, почему двойники не работают, основано на твердых наблюдениях. Я застрял здесь в этой проблеме уже несколько недель. –
Не зная, какое устройство 0 находится в вашей системе, трудно понять, является ли это ошибкой в драйверах или нет. Также, пожалуйста, предоставьте журнал построения - вы можете использовать функцию 'clGetProgramBuildInfo'. Если бы вы могли опубликовать код своего минимального ядра, это также поможет. – chippies