2013-10-16 58 views
6

我在使用Khronos Group的cl.hpp編寫了一個小巧的hello world OpenCL程序,用於OpenCL 1.2和nVidia的openCL庫。驅動程序和ICD我支持OpenCL 1.1。由於nVidia方面不支持1.2,我在OpenCL 1.2所需的函數上遇到一些錯誤。無法在1.1版本中使用1.2頭文件編譯OpenCL應用程序

另一方面,OpenCL 1.2的cl.hpp有一個標誌CL_VERSION_1_1,以在1.1模式下運行標題,但它不起作用。任何人都有類似的經驗或解決方案?

注意:版本1.1的cl.hpp工作,但在編譯期間會生成許多警告。這就是我試圖使用1.2版本的原因。

+0

我有同樣的問題,只是使用1.1頭。將其複製到cuda/include/CL目錄並永久保存。看來Nvidia絕不會支持OpenCL 1.2。奇怪的是,1.1頭文件對我沒有任何警告。 CentOS 6.2與gcc 4.8.1。 –

回答

1

看起來像唯一的方法是在使用1.1功能的設備時使用OpenCL 1.1標頭。

+2

我的反應:哦,對於nVidia卡擁有者來說太糟糕了。我更願意使用像OpenCL這樣的開放,可移植,易於理解的技術,而不是像CUDA這樣的死衚衕的專有框架。 – Thomas

6

您可以定義標誌CL_USE_DEPRECATED_OPENCL_1_1_APIS,它將使1.2 hpp文件1.1兼容。

#define CL_USE_DEPRECATED_OPENCL_1_1_APIS 

這就是我在NVIDIA和AMD上所做的。像魅力一樣工作

+0

我會盡快找到我的另一臺電腦,它的來源是。編譯錯誤是關於'clRetainDevice'和'clReleaseDevice',它們都是OpenCL 1.2相關的函數。當我分析代碼時,看起來他們可以被「CL_VERSION_1_1」禁用,但我也會嘗試你建議的國旗。 – bayindirh

+0

不幸的是,設置標誌並沒有阻止頭嘗試鏈接到'clRetainDevice()'和'clReleaseDevice()'。儘管如此,我會進一步調查。 – bayindirh

7

不幸的是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的優點是有很多錯誤修復無法返回到cl.hpp的1.1版本。
  • 你可以這樣做:

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

    我剛剛實施,在我的代碼,它似乎做的伎倆。

+0

您仍然需要按照Erik的回答來定義CL_USE_DEPRECATED_OPENCL_1_1_APIS。 –

+1

很遺憾nVIDIA試圖殺死如此絕望的OpenCL,而不是給予適當的支持。例如,現在他們的工具甚至沒有剖析或記錄OpenCL內核... – DarkZeros

+0

它的工作原理! Nvidia非常沉默,對OpenCL沒有什麼可說的。英特爾將GPU OpenCL支持與MSWIndows結合使用。他們運氣不好!支持OpenCL 2.0的AMD在Linux下是非常有前途的技術,但我還沒有獲得任何卡。 – 42n4

1

可以調用可以設置clBuildProgram的選項如下

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

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

這迫使編譯器使用的OpenCL 1.1無論哪個版本是由您的設備

4

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

+0

肯定會看看。非常感謝! – bayindirh

+2

看到有人像男人一樣真正承擔這一障礙讓人耳目一新! –