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

1,115 阅读4分钟

本系列文章是对 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 一致:

此时 GPU 并没有用光全部 650W。Vega 64 实际只需要 295W。多余的功率,是为了超频后 GPU 用的,此外,还可以通过 Thunderbolt 3 给你的 Mac 充电。最后,没错,Vega 64 也几乎和显卡盒一样宽一样重,名符其实的怪兽!

只要你通过 Thunderbolt 3 把 eGPU 连接到 Mac 上,并启动显卡盒的电源,在菜单栏上就会看到新的 eGPU 图标:

在活动监视器中,如果你打开 GPU 历史视图,你会看到列出的所有 GPU -- 集成的,断开的,或外置的:

在系统信息应用中,在图形/显示下面,你也会看到所有的 GPU,以及一些基本信息:

如果你在游戏或需要 GPU 的应用上右键单击,显示简介,你会看到“优先使用外置 GPU”选项:

我安装了 Geekbench 4 就跑了一下基准测试。试用版允许你运行基准测试并在线储存结果,并且只允许你运行 OpenCL 测试。完整版则允许 Dropbox 集成,本地保存结果,还有运行 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,等等:

下次见!