2016-10-22 77 views
0

因此,我有一個項目,我使用雙數據類型在Mac Pro上創建,它的工作原理非常完美。現在我將我的項目移至MacBook Air並開始給我OpenCL雙精度不工作

Exception 
ERROR: clBuildProgram(-11) 

錯誤。現在原因是我的MacBook Air不支持OpenCL的雙精度類型。但恰恰相反,我發現這個:Mac OSx上的OpenCL內核錯誤。我在這樣的答案中採用的方法:

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/但他們都沒有工作。

編輯:

+0

你怎麼知道-11換句話說'CL_BUILD_PROGRAM_FAILURE'的原因是設備不支持雙打?請發佈您的CL構建日誌。你可以用'clGetProgramBuildInfo'獲取它。 – maZZZu

+0

因爲當我使用一個非常小的內核而沒有雙打時,它工作得很完美。但是一旦我在內核中引入了一個double,它就給了我這個錯誤。不要擔心我爲什麼雙打不工作的研究是基於堅實的觀察。現在我一直在這個問題上陷入困境。 –

+0

不知道您的系統上有哪些設備0,很難知道這是否是驅動程序中的錯誤。另外,請提供構建日誌 - 您可以使用函數'clGetProgramBuildInfo'。如果你可以發佈最小內核的代碼,那也有幫助。 – chippies

回答

1

不幸double的支持是「可選」在OpenCL,一些設備支持和一些不...
如果設備支持double則設備擴展(CL_DEVICE_EXTENSIONS)將包含cl_khr_fp64cl_khr_fp64

有一些示例內核代碼here當雙打不可用時使用浮點數。