我应该如何在 OpenCL 中启用 cl_khr_fp64?
Posted
技术标签:
【中文标题】我应该如何在 OpenCL 中启用 cl_khr_fp64?【英文标题】:How should I enable cl_khr_fp64 in OpenCL? 【发布时间】: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 上。你解决了吗? 【参考方案1】:双精度是 OpenCL 1.2 中的核心可选功能(应该是您的设备在 OS X 下支持的版本)。这意味着如果设备支持,您不需要启用扩展来使用它。但是,启用扩展程序不会产生任何负面影响。
您没有做错任何事,因此这很可能是 Apple 的 OpenCL 实现中的错误。对于支持双精度的设备,相同的代码(带有exp()
函数)在我的 Macbook 上编译得很好。因此,如果您的设备确实报告它支持双精度,那么您应该在Apple's Bug Reporting System 中提交一个错误。
【讨论】:
:谢谢,这已经困扰我 6 个月了。我确实必须包含#pragma ...
才能定义double u = 5.0;
。如果我不包含该行,则会引发错误“错误:使用'double'类型需要启用 cl_khr_fp64 扩展”。当我尝试在我的 CPU 上运行它时,我也遇到了同样的问题。
你介意分享你用来调用这个内核的主文件吗?我已经在我的 2012 年中期 Macbook Pro 上使用 CPU 进行了尝试,它也有同样的错误。我已经链接了 OpenCL.framework
和 Accelerate.framework
并包含了 <math.h>
但它仍然无法运行。
当然,编译 OpenCL 源文件只是这个简单的命令行程序:gist.github.com/jrprice/abf644ef6032538655bf#file-oclc-c(我使用gcc oclc.c -o oclc -framework OpenCL
编译)。以上是关于我应该如何在 OpenCL 中启用 cl_khr_fp64?的主要内容,如果未能解决你的问题,请参考以下文章
在 Linux 中的多个平台上启用 OpenCL?如何处理 ICD 文件?