在 CPU 的情況下,(Linux 特定的)sys 呼叫getcpu()或sched_getcpu()可以在程式內部使用以獲取執行它們的內核的 ID。例如,在 4 個處理器系統的情況下,上述呼叫回傳的邏輯索引可以推斷出正在使用 4 個 CPU 中的哪一個(假設每個 CPU 包含 10 個內核,因此如果sched_getcpu()回傳 20,這意味著正在使用 CPU #2,因為內核編號 20 在第三個 CPU 中)。
在 GPU 的情況下,如何實作類似的目標?有沒有辦法從應用程式內部實時查找正在使用哪個?
uj5u.com熱心網友回復:
C 沒有 GPU 的概念。你得到了一個很好的評論,指出使用 OpenGL 獲取一些 GPU 資訊的正確方向,我相信還有其他跨平臺庫。
查看Neofetch的源代碼,它是一個命令列系統資訊工具,其中包括獲取您的 GPU。它使用一系列不同的方法來獲取當前系統上的 GPU,其中一些可能會幫助您指明正確的方向。例如,對于 linux 系統,它使用lspci -mm以下命令獲取 gpu 資訊:
echo $(lspci -mm | awk -F '\"|\" \"|\\(' \
'/"Display|"3D|"VGA/ {
a[$0] = $1 " " $3 " " ($(NF-1) ~ /^$|^Device [[:xdigit:]] $/ ? $4 : $(NF-1))
}
END { for (i in a) {
if (!seen[a[i]] ) {
sub("^[^ ] ", "", a[i]);
print a[i]
}
}}')
這NVIDIA Corporation GP107 [GeForce GTX 1050 Ti]為我的系統回傳。但這不是跨平臺的。如果您想自己做,則必須:
- 為您的應用程式將在其上運行的每個系統實作一種方法
- 失去跨平臺能力
或者簡單地使用上面提到的 OpenGL。
uj5u.com熱心網友回復:
這取決于您用來訪問 GPU 的 API。在 vulkan 下,API 本身提供了查詢可用設備的功能。例如
vkEnumeratePhysicalDevices //< use to iterate over devices
vkGetPhysicalDeviceProperties //< use to determine make/model
vkGetPhysicalDeviceFeatures //< use to determine the capabilities
在 OpenGL 下,這有點困難,因為 API 并沒有真正提供一種很好的健壯方式來迭代連接的 GPU (這很大程度上留給了底層作業系統)。除了glGetString使用 GL_VENDOR 和/或 GL_RENDERER呼叫之外,在創建背景關系之后,這就是您所擁有的全部內容。
對于一般的圖形 API,您通常會先選擇要使用的設備,然后再忘記它。(即您知道正在使用哪個 GPU,因為它是您請求的那個)
因此,例如,在 Windows 上,您將使用 WIn32 API 呼叫EnumDisplayDevices來迭代一堆DISPLAY_DEVICE結構,這會為您提供 GPU 設備的細分。如果您隨后想查詢設備功能,則需要初始化 OpenGL 背景關系(使用正確的設備),并多次呼叫 glGetIntegerv 以查詢實際功能。
可悲的是,在 linux 上這有點棘手。迭代顯示設備在很大程度上取決于您用來初始化 GPU 的底層 API (例如 GLX、SDL、Qt 等)。
因此,例如,在 SDL 中,您將使用SDL_GetRenderDriverInfo,迭代可用設備,然后SDL_CreateRenderer在應用程式啟動時將首選設備索引傳遞給。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/382570.html
