我受够了下载 Intel、Nvidia 和 AMD 的几个 GB OpenCL SDK 的不同问题:
- 英特尔需要注册并拥有临时许可证。
- Nvidia SDK 不支持 OpenCL 2.0,无论如何您都必须下载 cl.hpp。
- AMDs
cl.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。