因此,我有一个项目,我使用双数据类型在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/但他们都没有工作。
编辑:
你怎么知道-11换句话说'CL_BUILD_PROGRAM_FAILURE'的原因是设备不支持双打?请发布您的CL构建日志。你可以用'clGetProgramBuildInfo'获取它。 – maZZZu
因为当我使用一个非常小的内核而没有双打时,它工作得很完美。但是一旦我在内核中引入了一个double,它就给了我这个错误。不要担心我为什么双打不工作的研究是基于坚实的观察。现在我一直在这个问题上陷入困境。 –
不知道您的系统上有哪些设备0,很难知道这是否是驱动程序中的错误。另外,请提供构建日志 - 您可以使用函数'clGetProgramBuildInfo'。如果你可以发布最小内核的代码,那也有帮助。 – chippies