我受够了支持与英特尔,Nvidia和AMD下载几个GB的OpenCL SDK有不同的问题:
- Intel需要注册并有临时许可证。
- Nvidia SDK不支持OpenCL 2.0,无论如何您必须下载cl.hpp。
- AMDs
cl.hpp
文件定义了可能与MSVC的最小和最大宏冲突的最小和最大宏(我花了太多时间来计算如何使用例如NOMINMAX
来解决这个问题)。头文件与Khronos定义的头文件不一样(不存在最小/最大问题)。
所以,我下载的源代码,并从Khronos的包括由该SO answer的建议和编制的OpenCL.lib
文件自己。包含和OpenCL.lib文件是几MB。这比Intel/Nvidia/AMD SDK中所有额外的东西要小得多!我可以在我的项目中包含OpenCL includes和OpenCL.lib文件,而不必再告诉其他人下载SDK。
来自Khronos registry的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代码工作没有这一点,但升压/计算没有。 It appears I'm not the only one having this issue。我的GPU不支持OpenCL 2.0。
我有同样的问题,只是使用1.1头。将其复制到cuda/include/CL目录并永久保存。看来Nvidia绝不会支持OpenCL 1.2。奇怪的是,1.1头文件对我没有任何警告。 CentOS 6.2与gcc 4.8.1。 –