【发布时间】:2015-04-14 07:45:25
【问题描述】:
我正在尝试使 double 精度在我的 OpenCL 内核中工作,但我在启用 cl_khr_fp64 时遇到问题。如果我将#pragma OPENCL EXTENSION cl_khr_fp64 : enable 放在内核文件的顶部并定义一个变量double u = 5.0;,那么它会定义它并允许我在u 上使用+-*/。但是如果我尝试做任何数学函数,例如double u = exp(5.0);,它会抛出一个错误,它找不到double 类型的重载exp 函数。我发现有些奇怪的是,如果我检查 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 已列出,我还使用clGetDeviceInfo 检查了CL_DEVICE_DOUBLE_FP_CONFIG,它返回 63。我在 Yosemite 上使用 MacPro 和 AMD FirePro D700。我想知道我是否在错误的地方启用了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]);
}
}
【问题讨论】:
-
我遇到了完全相同的问题...在 Sierra 和 Yosemite 上。你解决了吗?