我应该如何在OpenCL中启用cl_khr_fp64?

时间:2015-04-14 07:45:25

标签: double opencl gpu gpgpu

我试图让double精确度在我的OpenCL内核中运行,但我在启用cl_khr_fp64时遇到了问题。如果我将#pragma OPENCL EXTENSION cl_khr_fp64 : enable放在我的内核文件的顶部并定义变量double u = 5.0;,那么它会定义它并允许我在+-*/u。但是如果我尝试执行任何数学函数,例如double u = exp(5.0);,它会抛出一个错误,它无法找到类型exp的重载double函数。我发现的一些奇怪的事情是,如果我检查cl_khr_fp64是否通过

定义
#ifdef cl_khr_fp64
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
#elif defined(cl_amd_fp64)
#pragma OPENCL EXTENSION cl_amd_fp64 : enable
#else
#error "Double precision floating point not supported by OpenCL implementation."
#endif

然后它抛出了不支持双精度的错误。如果我只是说要启用它,那么它会被启用,但如果我检查它是否能启用,那么就说它不能。

我已经检查了我的卡片上的附加信息并列出了cl_khr_fp64,我还使用CL_DEVICE_DOUBLE_FP_CONFIG检查了clGetDeviceInfo,然后返回63.我使用了使用AMD FirePro D700的Yosemite上的MacPro。我想知道我是否在错误的地方或其他地方启用了cl_khr_fp64。我的mykernel.cl文件的内容如下。它只是对Apple' hello_world'的修改。 OpenCL Xcode项目。编写的代码工作正常,但如果我将行从double u = (5.0);更改为double u = exp(5.0);则无法正常工作。最终我想在double变量上使用数学函数。任何帮助将不胜感激!

#pragma OPENCL EXTENSION cl_khr_fp64 : enable

__kernel void square5(global double* input, global double* output, double mul,int nv)
{
    size_t i = get_global_id(0);
    double u = (5.0);
    float left = u/1.2;
    if(i==0) {
        output[i] = mul*pow((float)u,left)*input[i]*input[i];
    } else if (i==nv-1) {
        output[i] = mul*u*input[i]*input[i];
    } else {
        output[i] = 0.25*mul*u*(input[i-1] + input[i+1])*(input[i-1] + input[i+1]);
    }
}

1 个答案:

答案 0 :(得分:3)

Double Precision是OpenCL 1.2中的核心可选功能(应该是您的设备在OS X下支持的版本)。这意味着如果设备支持扩展,则无需启用扩展即可使用它。但是,启用扩展不应该产生任何负面影响。

你没有做错任何事情,所以这可能是Apple的OpenCL实施中的一个错误。对于支持双精度的设备,相同的代码(使用exp()函数)在我的Macbook上编译得很好。因此,如果您的设备明确报告它支持双精度,那么您应该在Apple's Bug Reporting System中提交错误。