2016-10-22 353 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当双打不可用时使用浮点数。