我受夠了支持與英特爾,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。 –