[MetalKit]45-Using eGPUs with Metal 在 eGPU上使用 Metal

蘋果API搬運工發表於2019-01-03

本系列文章是對 metalkit.org 上面MetalKit內容的全面翻譯和學習.

MetalKit系統文章目錄


對於那些像我一樣需要原生 GPU 效能,卻只有一個膝上型電腦,又不想再買一個桌上型電腦的人來說,解決方案似乎就是外接 GPU(eGPU)。但是 macOS 原來卻並不支援 Nvidia 的 eGPU,只有一大堆 AMD 的 GPU 方案。

在尋找完美 GPU 的過程中,我找到了AMD Radeon RX Vega 64。它是目前的高階 GPU,在消費市場所有 GPU 中效能排行第二。Nvidia GPU 只在 TFLOPS 效能上比它領先一點。

teraflops (TFLOPS) 晶片能夠每秒執行 10 億次浮點運算。TFLOPS 是科學計算,機器學習及其他需要進行張量計算的工作中非常重要的效能。

AMD Radeon RX Vega 64 有 4096 個核心,能夠提供 12 TFLOPS(單精度)計算能力,處於 Nvidia Geforce GTX 1080 ti 有 3584 個核心 (11 TFLOPS)和新的 Nvidia Geforce RTX 2080 ti 有 4352 個核心 (13 TFLOPS) 兩者中間.

當然,eGPU 也能加速圖形應用和遊戲,能讓你連線外接顯示器和 VR 頭顯。要注意的是,eGPU 需要帶有 Thunderbolt 3 介面的 Mac,且系統為macOS High Sierra 10.13.4 及以上。更多資訊可以檢視網頁Use an external graphics processor with your Mac

我直接去買了一個 Razer Core X 外接顯示卡盒,因為 Vega 64 推薦至少 600W 的電源功率,滿足這個要求的盒子並不多。Sonnet eGFX更輕一些,但是卻更貴。Razer Core X 的寬高和 15” Macbook Pro 一致:

[MetalKit]45-Using eGPUs with Metal 在 eGPU上使用 Metal

此時 GPU 並沒有用光全部 650W。Vega 64 實際只需要 295W。多餘的功率,是為了超頻後 GPU 用的,此外,還可以通過 Thunderbolt 3 給你的 Mac 充電。最後,沒錯,Vega 64 也幾乎和顯示卡盒一樣寬一樣重,名符其實的怪獸!

[MetalKit]45-Using eGPUs with Metal 在 eGPU上使用 Metal

只要你通過 Thunderbolt 3 把 eGPU 連線到 Mac 上,並啟動顯示卡盒的電源,在選單欄上就會看到新的 eGPU 圖示:

[MetalKit]45-Using eGPUs with Metal 在 eGPU上使用 Metal

在活動監視器中,如果你開啟 GPU 歷史檢視,你會看到列出的所有 GPU -- 整合的,斷開的,或外接的:

[MetalKit]45-Using eGPUs with Metal 在 eGPU上使用 Metal

在系統資訊應用中,在圖形/顯示下面,你也會看到所有的 GPU,以及一些基本資訊:

[MetalKit]45-Using eGPUs with Metal 在 eGPU上使用 Metal

如果你在遊戲或需要 GPU 的應用上右鍵單擊,顯示簡介,你會看到“優先使用外接 GPU”選項:

[MetalKit]45-Using eGPUs with Metal 在 eGPU上使用 Metal

我安裝了 Geekbench 4 就跑了一下基準測試。試用版允許你執行基準測試並線上儲存結果,並且只允許你執行 OpenCL 測試。完整版則允許 Dropbox 整合,本地儲存結果,還有執行 Metal 測試。

[MetalKit]45-Using eGPUs with Metal 在 eGPU上使用 Metal

執行一個測試,幾分鐘後就會完成:

[MetalKit]45-Using eGPUs with Metal 在 eGPU上使用 Metal

正如期望的那樣,Vega 64 的 Metal 測試得分是最高的。下面是排列好的分數列表:
– Metal on Radeon RX Vega 64 – 137651
– OpenCL on Radeon RX Vega 64 – 135711
– Metal on Radeon Pro 450 - 41602
– OpenCL on Radeon Pro 450 - 41578
– Metal on Intel HD 530 – 21888
– OpenCL on Intel HD 530 – 20878
– OpenCL on quad-core CPU - 13867

下一步,就是在這些 GPU 上執行一些 Metal 程式碼了。在 playground 中新增下面的程式碼塊:

import Metal

let devices = MTLCopyAllDevices()

for device in devices {
    print(device.name)
    print("Is device low power? \(device.isLowPower).")
    print("Is device external? \(device.isRemovable).")
    print("Maximum threads per group: \(device.maxThreadsPerThreadgroup).")
    print("Maximum buffer length: \(Float(device.maxBufferLength) / 1024 / 1024 / 1024) GB.")
}
複製程式碼

執行一下,看到一個簡單的輸出:

AMD Radeon RX Vega 64
Is device low power? false.
Is device external? true.
Maximum threads per group: MTLSize(width: 1024, height: 1024, depth: 1024).
Maximum buffer length: 4.5 GB.

AMD Radeon Pro 450
Is device low power? false.
Is device external? false.
Maximum threads per group: MTLSize(width: 1024, height: 1024, depth: 1024).
Maximum buffer length: 1.5 GB.

Intel(R) HD Graphics 530
Is device low power? true.
Is device external? false.
Maximum threads per group: MTLSize(width: 256, height: 256, depth: 256).
Maximum buffer length: 2.0 GB.
複製程式碼

這樣,你就可以檢視裝置的更多屬性和功能,比如可用記憶體,可程式設計取樣位置支援,光柵順序組支援等等。更多資訊,請檢視 MTLDevice 網頁。

蘋果提供了兩個示例程式碼專案,來幫助你在渲染和計算管線中進行 GPU 管理:

下面是一些有用的網頁資料,關於資源儲存模式,關於多顯示器和多 GPU,關於 GPU 頻寬,關於新增/移除外接 GPU,等等:

下次見!

相關文章