2017-05-17 23 views
1

當創建一個新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。

預先感謝您。

回答

0

爲什麼不他們之間只是替代?即使你犯從多個線程命令緩衝區,該工作應大致均勻地分佈:

device = devices[taskIndex % devices.count] 

此外,一定要避免創建CIContext S表示每一個操作;那些代價很高,所以你應該保留一個上下文列表(每個設備一個)。

請注意,如果你做任何你自己的金屬工作(而不是僅僅核心圖像過濾),你需要爲每個設備的命令隊列,並且要使用需要的任何資源由其各自的設備分配(資源不能由MTLDevice s共享)。

+0

沃倫您好,感謝您的評論。不幸的是,我不能追蹤'taskIndex',因爲這是一個命令行應用程序,只有在任務進入時纔會執行。換句話說,它只能「活」到〜200ms。關於'CIContext',我只在一開始就創建一個,並且在這個環境下處理所有的操作。 – Pono

+0

有趣。我想知道是否可以通過命令行傳遞推薦的設備索引並以此方式驅動它。 – warrenm