簡體   English   中英

如何在運行時檢測默認的GPU?

[英]How to detect the default GPU at Runtime?

我這里有一個奇怪的問題,我有很多困難要找出答案。

我有一個C ++ 3D引擎,並且正在使用OpenCL進行優化和OpenGL互操作性。

在我的機器上,我安裝了兩個GPU,分別是GTX 960和AMD R9 280X。

一切運行正常,包括對GPU和CPU的檢測以及圖形互操作性都按預期運行得非常快。

但是,始終在一台機器上,我們的系統上有一個默認的GPU(這是在Windows上設置的,具體取決於我們安裝驅動程序的順序)。

因此,當我開始讀取所有設備並在嘗試創建互操作性上下文時檢測到GPU時,我遇到了一種奇怪的情況:

當我將AMD作為默認GPU時:對於NVIDIA設備,OpenCL向我返回一條錯誤消息,通知它不可能創建CL上下文(因為不是默認GPU),並且當我為AMD GPU創建OpenGL上下文時上下文已正確創建。

當我將NVIDIA作為默認GPU時:對於NVIDIA設備,將正確創建上下文,但是當我嘗試創建AMD上下文時,反而會向我返回錯誤,系統崩潰!

因此,我的主要問題是如何在運行時檢測默認GPU以創建互操作性上下文,僅針對默認GPU,因為AMD崩潰了,而是返回錯誤...(因為有錯誤,我可以設置一個標志來通知默認GPU在這個結果上...)。

任何人都知道如何使用C ++在運行時檢測默認GPU?

親切的問候。

一種技術是向OpenGL詢問設備名稱,然后使用它來選擇OpenCL設備。 注意:您可能會在比較之前將其簡化為枚舉,因為字符串不匹配(例如AMD與ATI)。

您很可能會同時混合兩個GPU的內容。 例如,使用默認GPU中的設備為非默認GPU創建了上下文。 在將Khronos C ++綁定用於OpenCL時,您可能會遇到這類問題。 無論未明確創建並設置為非默認GPU的默認值,包裝程序都會使用默認GPU為您創建任何內容。

其他C ++包裝器可能會遇到類似的問題。 如果不看源代碼,很難說些什么。

最終,經過大量測試,其工作正常且非常快!!!

基本上我有兩個組成部分:

01)OpenGL組件

02)OpenCL組件

因此,在OpenGL組件中,我從創建的圖形上下文中提取了GPU供應商(因為GL上下文是在系統上創建的第一件事,因此可以在Window中渲染圖形)。

初始化之后,我開始對傳遞給它的OpenCL組件(由OpenGL收集的供應商)進行初始化,因為它是系統上注冊的默認GPU卡。

在設備初始化期間,我放置了一個標記,用於標記用於OpenGL互操作的默認GPU,因此,對於所有其他設備,將創建正常的執行上下文,而對於默認的GPU設備,將創建互操作上下文。

之后,當我請求內核執行時,我將使用它的組件名稱傳遞給它,如果該組件是常規組件,則使用CPU和用於異構計算的Second GPU設備,如果此調用來自3D組件,則GPU用於OpenGL互操作!!!

絕對酷!!!

我測試了將默認GPU從NVIDIA轉換為AMD以及將AMD轉換為NVIDIA的方法,並且非常可愛!!!

我進行了測試,將“數學和物理”組件指向第二個GPU,將“ 3D圖形”組件指向默認的GPU,我取得了不錯的成績!

該軟件現在像Monster Dragster一樣運行!!!

非常感謝你的幫助!

親切的問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM