2016-08-27 55 views
1

我正在嘗試在mingw gcc中創建OpenCL ICD Loader - 使用mingw-w64並沒有問題,只是我已經安裝了mingw。我不使用Visual Studio - 我不討厭它,我知道有免費版本,這不是我正在使用的。如何解決在mingw(或mingw-w64)gcc中缺少InitOnceExecuteOnce?

OpenCL ICD Loader不會在mingw gcc中生成。主要原因是由於缺乏DirectX 10和DirectX 11支持。但是所有的ICD Loader所做的都是獲取一個調度表(大概來自OpenCL驅動程序/不管它加載的是什麼),並提供通過調度表調用的函數。 icd_dispatch.hicd_dispatch.c中的條件編譯的一些細微更改可以省略相關函數並刪除相關性(因爲Linux構建已經必須發生這種情況),實際上它看起來像過去可能已經支持的那樣 - 有預處理器符號cl_khr_d3d10_sharingcl_khr_d3d11_sharing已經定義,如果包含相關的頭文件,它們只是沒有被用來有條件地編譯相關的代碼塊。

所以就是這樣,並告訴代碼首先忽略DirectX10和DirectX11功能(我剛剛註釋掉了一些頭文件,儘管這顯然不是真正的解決方案)。但之後還有一個問題...

文件icd_windows.c使用Windows API函數InitOnceExecuteOnce - MSDN docs here。 mingw(我認爲mingw-w64)不支持這個功能 - Kernel32.dll的def文件列出了它,但函數和相關標識符INIT_ONCE,INIT_ONCE_STATIC_INITPINIT_ONCE都由頭文件提供。

MSDN文檔IMO沒有很好地解釋這一點。它不是必需的(在Vista之前它甚至不存在),它與DLL的安全初始化有關,大概是在多線程環境中。

不幸的是,如果我真的不明白它的作用,那麼我不能實施一種解決方法,因爲它不在那裏。

顯然,這個Windows API並不特定於OpenCL,所以大概這是其他人遇到的其他項目的問題。那麼有沒有一個標準的解決方法呢?

或者失敗了,有人可以解釋什麼是特別是由「同步一次性初始化」?對不起,如果這是一個愚蠢的問題,我沒有太多的多線程經驗,我認爲一次初始化就是這樣,不管是同步還是異步 - 只要第二個線程不能重新輸入初始化,你不想再次初始化,所以沒有什麼可以同步或異步地完成。

或者這是否意味着如果另一個線程試圖調用初始化,它會等待已經運行的初始化完成,然後它會失敗(或者可能會成功而不重新執行初始化)?


我不確定opencl標記是否合適,因爲上下文而決定包含它,如果那是錯誤的,那很抱歉。

+0

只要我發佈了這個問題,[此MSDN頁面](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363808(v = vs.85).aspx)被移出我的盲點。哎呀。如果沒有更好的答案出現,我會添加一個基於此。 – Steve314

+1

你爲什麼不直接聲明自己的API函數和標識符? –

+0

@HarryJohnston - 我不知道如何定義標識符(類型應該是什麼等),並猜測可能值得向Khronos和/或MinGW提交一些更改,我真的不知道什麼是法律問題只是從Microsoft頭文件(我目前沒有)或MSDN上的某處(假設他們在某處)複製這些定義。但它仍然是一種選擇。 – Steve314

回答

1

我遇到了同樣的問題。你必須在icd_windows.c的開頭添加以下行,所有的#includes前:

#define _WIN32_WINNT 0x0600 

這與缺少InitOnceExecuteOnce聲明幫助。我也必須修改CMakeLists。txt,在第22行用STATIC代替SHARED,它負責鏈接libOpenCL。我這樣做是因爲鏈接抱怨缺少LD lib目錄下:

add_library (OpenCL STATIC ${OPENCL_ICD_LOADER_SOURCES}) 

做這兩件事情我在建子目錄了libOpenCL.a後。編譯繼續,並失敗了一些其他錯誤,但我忽略了這一點。我使用了創建的lib,併成功地用它來構建簡單的OpenCL應用程序,其中列出了所有可用的平臺,設備及其詳細信息。

+0

恐怕我並不是真正有能力檢查這臺自動櫃員機,所以+1,但不接受,至少現在還沒有。可能有一段時間,對不起。 – Steve314

+0

沒問題:)順便說一句,我還發現我可以直接連接我的應用程序與安裝在Windows中的OpenCL.dll,這足以添加'/ cygdrive/c/Windows/System32/OpenCL.dll(不帶'-l' )作爲鏈接器的另一個參數。 –

相關問題