我正在嘗試在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.h
和icd_dispatch.c
中的條件編譯的一些細微更改可以省略相關函數並刪除相關性(因爲Linux構建已經必須發生這種情況),實際上它看起來像過去可能已經支持的那樣 - 有預處理器符號cl_khr_d3d10_sharing
和cl_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_INIT
和PINIT_ONCE
都由頭文件提供。
MSDN文檔IMO沒有很好地解釋這一點。它不是必需的(在Vista之前它甚至不存在),它與DLL的安全初始化有關,大概是在多線程環境中。
不幸的是,如果我真的不明白它的作用,那麼我不能實施一種解決方法,因爲它不在那裏。
顯然,這個Windows API並不特定於OpenCL,所以大概這是其他人遇到的其他項目的問題。那麼有沒有一個標準的解決方法呢?
或者失敗了,有人可以解釋什麼是特別是由「同步一次性初始化」?對不起,如果這是一個愚蠢的問題,我沒有太多的多線程經驗,我認爲一次初始化就是這樣,不管是同步還是異步 - 只要第二個線程不能重新輸入初始化,你不想再次初始化,所以沒有什麼可以同步或異步地完成。
或者這是否意味着如果另一個線程試圖調用初始化,它會等待已經運行的初始化完成,然後它會失敗(或者可能會成功而不重新執行初始化)?
我不確定opencl標記是否合適,因爲上下文而決定包含它,如果那是錯誤的,那很抱歉。
只要我發佈了這個問題,[此MSDN頁面](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363808(v = vs.85).aspx)被移出我的盲點。哎呀。如果沒有更好的答案出現,我會添加一個基於此。 – Steve314
你爲什麼不直接聲明自己的API函數和標識符? –
@HarryJohnston - 我不知道如何定義標識符(類型應該是什麼等),並猜測可能值得向Khronos和/或MinGW提交一些更改,我真的不知道什麼是法律問題只是從Microsoft頭文件(我目前沒有)或MSDN上的某處(假設他們在某處)複製這些定義。但它仍然是一種選擇。 – Steve314