不幸的是,如果您有多个平台,并且它们支持不同的 OpenCL 版本,那么只制作 ifdef 语句将不起作用。比如安装在 CPU 上的 POCL 支持 2.0,所以你需要有 2.0 的 OpenCL 头文件,但大多数 GPU 和开源驱动程序只支持 OpenCL 1.1 或 1.2。
最好的选择似乎是获取 OpenCL 平台版本信息,并以此为基础调用什么命令。不幸的是,它是一个 char[],所以可能必须将它解析出来。
这是一个如何获取平台信息字符串的示例。
clGetPlatformInfo(platforms[platform_indexFinger], CL_PLATFORM_VERSION, INFO_LENGTH, &platformInfo, &realSize);
版本信息通常采用以下形式:“OpenCL 1.2 implementation name”
这是我用来诊断当前opencl编号的一个小函数
浮动诊断OpenCLnumber(cl_platform_id平台){
#define VERSION_LENGTH 64
字符完整版本[VERSION_LENGTH];
size_t 实际尺寸 = 0;
clGetPlatformInfo(平台,CL_PLATFORM_VERSION,VERSION_LENGTH,
&complete_version, &realSize);
字符版本[4];
版本[3] = 0;
memcpy(版本, &complete_version[7], 3);
// printf("V %s %f\n", version, version_float);
float version_float = atof(version);
返回版本浮动;
}
然后可以像这样使用它,例如与为 2.0 修改的命令队列功能一起使用
float version_float = 诊断OpenCLnumber(platform_id);
if (version_float >= 2.0) {
command_waiting_line =
clCreateCommandQueueWithProperties(context, device_id, 0, &return_number);
别的 {
#pragma GCC 诊断推送
#pragma GCC 诊断忽略“-Wdeprecated-declarations”
command_waiting_line =
clCreateCommandQueue(context, device_id, 0, &return_number);
#pragma GCC 诊断弹出
}