2016-02-05 42 views
0

我在Windows上使用OpenCL 2.0。我的機器有2個平臺:如何在Windows上禁用已註冊的OpenCL平臺?

  • CUDA GPU(與OpenCL的1.2)
  • 英特爾CPU/GPU(與OpenCL的2.0)

我不想的OpenCL API返回CUDA平臺上所有。根據article,opencl.dll通過查看Windows註冊表來返回註冊的平臺。但是,沒有提及要搜索哪些註冊表項。

如何在Windows上禁用某個OpenCL驅動程序/平臺,以便不會由API返回?

+0

你的目標是什麼?一旦OpenCL API返回兩個平臺,您可以通過查看平臺信息(clGetPlatformInfo()提供供應商名稱)來刪除一個平臺。請詳細說明,如果這種方法不適合你的目的 – ARK

+0

是的,我可以做到這一點,當然這是我現在做的。但是,我正在將代碼作爲團隊的一部分工作,我不想特別更改此案例的代碼,並錯誤地將此代碼提交給其他人(如果我在推送前忘記撤消該更改)。因爲我是迄今爲止與OpenCL 2.0合作的團隊中唯一一個人,所以其他人不希望這樣做。 –

+0

如果您的問題是考慮特定於特定opencl版本的設備/平臺,那麼使用標記爲「CL_DEVICE_OPENCL_C_VERSION」的clGetDeviceInfo()來獲取opencl版本。在你的情況下,使用opencl2.0版本取得設備並繼續。在這種情況下,任何意外登記都不會給您的團隊帶來任何問題。 – ARK

回答

3

正如您所說,OpenCL ICD加載程序從Windows註冊表中獲取可用的OpenCL平臺列表。要防止OpenCL平臺出現在系統上運行的任何OpenCL應用程序中,只需從以下一個或兩個註冊表項中刪除相應的值:

對於64位上的32位機器或64位應用程序位機: HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors

對於64位計算機上的32位應用程序: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Khronos\OpenCL\Vendors

註冊表值的名稱將是完整路徑.dll提供OpenCL運行實現。

在我看來,這是一個相當嚴厲的解決問題的方法。大多數OpenCL應用程序爲用戶提供了手動選擇/覆蓋所需的OpenCL平臺的方法(例如,通過命令行參數,環境變量或甚至GUI(如果適用))。

+0

如果您只想在單個開發機器上隱藏1.2平臺,這是一個合理的解決方案。我建議保存註冊表子樹,以便稍後恢復。正如問題中的註釋所示,如果您希望在所有機器上都發生這種情況,請忽略代碼中的<2.0平臺或設備。 – Dithermaster