當創建一個新CIContext與金屬設備中的一個必須提供設備(GPU)的使用方法:如何挑選GPU處理正確的金屬設備上的Mac Pro
let context = CIContext(
mtlDevice: device
)
在我的MacBook Pro的發展目的,我總是挑同屏與MTLCreateSystemDefaultDevice()
方法相關的設備:
guard
let device:MTLDevice = MTLCreateSystemDefaultDevice()
else {
exit(EXIT_FAILURE)
}
但是在Mac Pro電腦將在生產無頭模式下使用也有,我可以針對兩顆GPU卡。爲了讓所有可用的設備可以使用MTLCopyAllDevices()
方法,這給我的Mac Pro以下的輸出:
[
<MTLDebugDevice: 0x103305450> -> <BronzeMtlDevice: 0x10480a200>
name = AMD Radeon HD - FirePro D700
<MTLDebugDevice: 0x103307730> -> <BronzeMtlDevice: 0x104814800>
name = AMD Radeon HD - FirePro D700
]
此的Mac Pro將在很大程度上與數百每秒,每一次小任務中使用的新任務到達在我需要選擇任務將被處理的GPU設備。
現在的問題是 - 從上面的陣列選擇一個隨機器是個好主意:
let devices = MTLCopyAllDevices() // get all available devices
let rand = Int(arc4random_uniform(UInt32(devices.count))) // random index
let device = devices[rand] // randomly selected GPU to use
let context = CIContext(
mtlDevice: device
)
由於在Mac Pro的兩個相等的GPU設備,始終瞄準一個將是資源的浪費。 Logic告訴我,通過上面的代碼,兩個GPU都會被同樣使用,但也許我錯了,MacOS提供了一些抽象層,可以智能地選擇在執行時不太利用的GPU。
預先感謝您。
沃倫您好,感謝您的評論。不幸的是,我不能追蹤'taskIndex',因爲這是一個命令行應用程序,只有在任務進入時纔會執行。換句話說,它只能「活」到〜200ms。關於'CIContext',我只在一開始就創建一個,並且在這個環境下處理所有的操作。 – Pono
有趣。我想知道是否可以通過命令行傳遞推薦的設備索引並以此方式驅動它。 – warrenm