如何在 Apple Silicon 上使用高性能内核

How to utilize the High Performance cores on Apple Silicon

我开发了一个严重依赖多线程的 macOS 应用程序(呼叫中心模拟器)。它在我的 iMac 2019 上运行良好,并且很好地填充了所有内核。在我的测试场景中,它模拟了应用程序。 1.4 米欧。总共 100 次迭代中的电话呼叫,每次迭代作为并行调度队列上的调度项。

现在我买了一个新的 Mac mini 和 M1 Apple Silicon,我很想看看性能在该测试机器上的发展情况。嗯,还不错,但没有我想象的那么好:

System Duration
iMac 2019, Intel 6-core i5, 3.0 GHz, Catalina macOS 10.15.7 19.95 s
Mac mini, M1 8-core, Big Sur macOS 11.2, Rosetta2 26.85 s
Mac mini, M1 8-core, Big Sur macOS 11.2, native ARM 17.07 s

进一步调查,我注意到在模拟开始时,M1 Mac 的所有 8 个内核都已正确填满,但几秒钟后,只有 4 个高效内核被使用。

我已阅读 Apple 文档“使用性能和效率内核优化 Apple Silicon”并仔细检查了迭代的调度队列是否设置正确:

let simQueue = DispatchQueue.global(qos: .userInitiated)

但是没有成功。 运行 几秒钟后,高性能核心显然不再被利用。我什至尝试将 qos 设置为 .userInteracive 来设置队列,但这也无济于事。我还用适当的 qos 标记了派送项目,但这并没有改变任何东西。在我看来,其他应用程序(例如 XCode)确实使用高性能内核的时间更长。

有人知道如何强制 M1 Mac 使用高性能内核吗?

“M1 8核心”真是“M1 4性能+4省电核心”。我预计它的性能会比 Intel 6 核高一点,但不会多。您确实看到了,比 6 个 Intel 内核快 15%,或者大约与 7 个 Intel 内核一样快。当前的 M1 芯片是 低端 处理器。 “比英特尔六核强一点”已经很不错了

你的代码必须在性能核心上运行,否则根本没有机会接近英特尔的性能。在该图中,没有任何内容告诉您使用了哪些内核。

最有可能发生的情况是所有内核都启动 运行,每个内核都试图完成八分之一的工作,大约 8 秒后性能内核完成了它们的工作。然后,节能核心将其工作转移到性能核心。而且您只是将图像误解为只有低性能内核才能完成工作。

我猜想 Apple 出于多种原因更倾向于使用效率核心而不是性能。电池寿命是其中之一,很可能也是热原因。这是一个最初为智能手机和平板电脑设计的 SoC 的大问号。 MacOS 比 OS 重得多 IOS 或 iPad OS。 Apple 很可能认为只有在需要最大吞吐量的情况下才需要性能内核。毫无疑问,我认为包括我自己在内的一些拥有 M1 Mac Mini 的人想要一种方法来调整效率和性能核心之间的这种平衡。总体而言,我更希望所有内核都能够在效率和性能之间切换,例如英特尔的 Speed shift 技术。这可能伴随着 M1 在 Mac Pro 型号和其他 Pro 型号方面的进步。