2016-10-22 17 views
0

У меня есть проект, который я создал на 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:

+0

Откуда вы знаете, что причина -11 другими словами 'CL_BUILD_PROGRAM_FAILURE' заключается в том, что устройство не поддерживает парные? Отправьте свой журнал сборки CL. Вы можете получить его с помощью 'clGetProgramBuildInfo'. – maZZZu

+0

Потому что, когда я использовал очень минимальное ядро ​​без двойников, он работал отлично. Но как только я ввел двойное в ядро, он дал мне эту ошибку. Не беспокойтесь, мое исследование того, почему двойники не работают, основано на твердых наблюдениях. Я застрял здесь в этой проблеме уже несколько недель. –

+0

Не зная, какое устройство 0 находится в вашей системе, трудно понять, является ли это ошибкой в ​​драйверах или нет. Также, пожалуйста, предоставьте журнал построения - вы можете использовать функцию 'clGetProgramBuildInfo'. Если бы вы могли опубликовать код своего минимального ядра, это также поможет. – chippies

ответ

1

К сожалению, поддержка double является «факультативным» в OpenCL, некоторые устройства поддерживают его, а некоторые нет ...
Если устройство поддерживает double то расширение устройств (CL_DEVICE_EXTENSIONS) будет содержать cl_khr_fp64 или cl_khr_fp64.

Существует пример кода ядра here, чтобы использовать поплавки, когда парные разряды недоступны.

 Смежные вопросы

  • Нет связанных вопросов^_^