8

我正在使用 Khronos Group 的cl.hpp为 OpenCL 1.2 和 nVidia 的 openCL 库编写一个小型的 hello world OpenCL 程序。我拥有的驱动程序和 ICD 支持 OpenCL 1.1。由于 nVidia 端还不支持 1.2,我在 OpenCL 1.2 所需的功能上遇到了一些错误。

另一方面,OpenCL 1.2 的 cl.hpp 有一个标志,CL_VERSION_1_1准确地说,是在 1.1 模式下运行标头,但它不起作用。有人有类似的经验或解决方案吗?

注意: 1.1 版的 cl.hpp 可以工作,但在编译期间会产生许多警告。这就是我尝试使用 1.2 版本的原因。

4

5 回答 5

8

不幸的是,NVIDIA 分发了旧版本的 OpenCL ICD(将 API 调用分派到相应驱动程序的库)。您最好的选择是

  • 获取更新版本的 ICD(如果您使用的是 Linux,这是 libOpenCL.so,您可以在 AMD 的 APP SDK 中找到更新的副本)。不利的一面是,如果您分发编译后的代码,它还需要 1.2 ICD。
  • 使用 OpenCL 1.1 头文件,但可以使用最新的 cl.hpp。它应该(理论上)检测到它正在与 OpenCL 1.1 标头组合并禁用所有 OpenCL 1.2 代码(尽管没有经过太多测试)。使用最新的 cl.hpp 的好处是有很多 bug 修复不会向后移植到 cl.hpp 的 1.1 版本。
  • 你可以这样做:

    #include <CL/cl.h>
    #undef CL_VERSION_1_2
    #include <CL/cl.hpp>
    

    我刚刚在我的代码中实现了它,它似乎可以解决问题。

于 2013-10-22T14:28:49.493 回答
6

您可以定义标志 CL_USE_DEPRECATED_OPENCL_1_1_APIS 这将使 1.2 hpp 文件 1.1 兼容。

#define CL_USE_DEPRECATED_OPENCL_1_1_APIS

这就是我在 NVIDIA 和 AMD 上所做的。奇迹般有效

于 2013-10-18T12:26:58.687 回答
4

我受够了下载 Intel、Nvidia 和 AMD 的几个 GB OpenCL SDK 的不同问题:

  • 英特尔需要注册并拥有临时许可证。
  • Nvidia SDK 不支持 OpenCL 2.0,无论如何您都必须下载 cl.hpp。
  • AMDscl.hpp文件定义了可能与 MSVC 的 min 和 max 宏冲突的 min 和 max 宏(我花了太多时间来弄清楚如何使用 eg 来解决这个问题NOMINMAX)。标头甚至与 Khronos 定义的标头不同(没有最小/最大问题)。

因此,我按照此SO 答案的建议从 Khronos 下载了源代码并包含在内,并自己编译了该OpenCL.lib文件。包含和 OpenCL.lib 文件是几 MB。这比 Intel/Nvidia/AMD SDK 中所有额外的东西要小得多!我可以在我的项目中包含 OpenCL 包含和 OpenCL.lib 文件,而不再需要告诉其他人下载 SDK。

Khronos 注册表中的 OpenCL 2.0 包含有一个新的 C++ 绑定文件cl2.hpp。查看此文件,我确定使用 OpenCL 2.0 支持已弃用功能的正确方法是这样的。

#define CL_HPP_MINIMUM_OPENCL_VERSION 110
#define CL_HPP_TARGET_OPENCL_VERSION 120
#define CL_HPP_CL_1_2_DEFAULT_BUILD
#include "CL/cl2.hpp"

这是因为 cl2.hpp 文件有这个代码

#if CL_HPP_MINIMUM_OPENCL_VERSION <= 100 && !defined(CL_USE_DEPRECATED_OPENCL_1_0_APIS)
# define CL_USE_DEPRECATED_OPENCL_1_0_APIS
#endif
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 110 && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
# define CL_USE_DEPRECATED_OPENCL_1_1_APIS
#endif
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 120 && !defined(CL_USE_DEPRECATED_OPENCL_1_2_APIS)
# define CL_USE_DEPRECATED_OPENCL_1_2_APIS
#endif
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 200 && !defined(CL_USE_DEPRECATED_OPENCL_2_0_APIS)
# define CL_USE_DEPRECATED_OPENCL_2_0_APIS
#endif

请注意,您不再需要(也不应该)<CL/opencl.h>再包含。

最后,#include "CL/cl2.hpp"为了让我的代码与Boost/Compute一起工作,我必须添加

#undef CL_VERSION_2_0

我自己的 OpenCL 代码没有这个就可以工作,但 Boost/Compute 不行。看来我不是唯一一个有这个问题的人。我的 GPU 不支持 OpenCL 2.0。

于 2015-10-08T14:00:25.903 回答
1

看起来唯一的方法是在使用支持 1.1 的设备时使用 OpenCL 1.1 标头。

于 2013-10-17T12:52:38.893 回答
1

您可以调用可以设置 clBuildProgram 的选项如下

const char options[] = "-cl-std=CL1.1";

clBuildProgram( program, 1, &devices, options, NULL, NULL );

无论您的设备支持哪个版本,这都会强制编译器使用 OpenCL 1.1

于 2014-09-04T15:28:17.360 回答