计算苹果M1处理器的周期和说明

2021-03-26 19:47:16

当基准测试软件时,我们经常首先测量过去的时间。如果您是基准测试数据带宽或延迟,则是正确的衡量标准。但是,如果您正在基准测试任务,在您避免磁盘和网络访问,并且您只访问几页存储器的位置,那么经过的时间通常不是理想的,因为它可以从运行运行时变化太大,它提供太少的信息。

大多数处理器将响应于电源和热约束调整其频率。因此,您通常应该避免使用笔记本电脑。然而,即使您可以获得稳定的措施,也很难从时间测量开始推理代码。处理器在循环中运行,退休说明。他们有分支机构,有时他们会误解这些分支。这些是您想要的措施!

当然,您可以翻译CPU周期中的时间,如果您知道CPU频率。但它可能比听起来更难,因为即使没有物理限制,处理器也可以在测试期间改变其频率。您可以使用可预测的循环测量CPU频率。这有点尴尬。

然后,大多数人都像英特尔VTune或Apple乐器一样转到一个图形工具。这些是功能强大的工具,可以提供花哨的图形显示,运行样本,记录精确的指令计数等。他们还倾向于跨越各种编程语言工作。

这些图形工具使用了处理器供应商在其硅中包含“性能计数器”的事实。您可以准确地讲述两点之间在两点之间执行的指令。

可悲的是,这些工具可能难以定制到您的需求和自动化。值得庆幸的是,Linux内核在大多数处理器上公开性能计数器。因此,如果您为Linux编写代码,则可以轻松地为自己查询性能计数器。因此,您可以将标记放在代码中,并找出这些标记之间花了多少指令或周期。我们经常将这样的代码称为“被录音”。它要求您修改代码,它不会在所有编程语言中使用,但它是精确灵活的。如果您进入容器,它甚至可以在Docker下工作。您可能需要特权访问来使用计数器。当然,您还可以在Windows下从您自己的程序访问性能计数器,但我从未找到任何文档也不找到任何示例。

这些天的主要笔记本电脑是一个带有M1处理器的新Apple MacBook。该臂处理器是显着的。在许多方面,更先进的英特尔处理器。可悲的是,直到最近,我不知道如何为Apple M1授权我的代码。

最近,我博客的一个读者(Duc Tri Nguyen)向我展示了如何从Dougall Johnson的代码启发。 Dougall一直在对Apple的处理器进行有趣的研究。据我所知,它完全没有记录,可以炸毁你的电脑。值得庆幸的是,要访问性能计数器,您需要管理访问权限(轮组)。在实践中,这意味着您可以使用sudo在shell中启动您的录取程序,以便您的程序具有本身,管理权限。

为了说明这种方法,我发布了一个完整的C ++项目,构建了一个仪器的基准。您需要管理访问权限和Apple M1系统。我假设您已安装完整的开发人员套件,其中包含Apple提供的命令行实用程序。

我建议测量最小计数器以及平均计数器。当平均接近最小时,通常会有可靠的结果。最大值在计算基准中不得而不效益。观察到在基准期间采取的措施通常不会分布:它们更好地描述为遵循日志正态分布。

performance_counters agg_min {1e300}; performance_counters agg_avg {0.0}; for(size_t i = 0; i<重复; i + +){ performance_counters start = get_counters(); my_function(); performance_counters结束= get_counters(); performance_counters diff =结束 - 开始; AGG_MIN = AGG_MIN。分钟(差异); agg_avg + = diff; } agg_avg / =重复;

之后,这只是打印结果的问题。我决定在C ++中基于浮点号码解析器。我得到以下输出:

#解析随机数 模型:在间隔中均匀地生成随机数[0.000000,1.000000] 体积:10000浮子 卷= 0.0762939 MB 模型:在间隔中均匀地生成随机数[0.000000,1.000000] 体积:10000浮子 卷= 0.0762939 MB Strtod 375.92指令/浮动(+/- 0.0%) 75.62循环/浮子(+/- 0.1%) 4.97指令/循环 88.93分支/漂浮(+/- 0.0%) 0.6083 MIS。分支/浮动 Fastfloat 162.01指令/浮动(+/- 0.0%) 22.01循环/漂浮(+/- 0.0%) 7.36指令/循环 38.00分支/浮子(+/- 0.0%) 0.0001 mis。分支/浮动 燕麦

正如您所看到的,我获得每个浮点数的平均指令,分支和错误预测的分支。我还获得每周期退休的指令数量。看来在这个基准测试中,Apple M1处理器接近每周期退出的8条指令,当使用Fast_float库解析数字时。这是一个比英特尔处理器上的任何可能的得分高。

您应该注意结果如何精确:最小值和平均周期数几乎相同。 在我的经验中,在笔记本电脑上获得这样一致的数字是非常罕见的。 但这些苹果M1系统似乎显示出显着的变化。 它表明热约束的方式几乎没有。 我通常避免在笔记本电脑上进行基准,但我与这些笔记本电脑进行了例外。 据我所知,Apple记录了这种性能计数器访问。 因此,我的代码应该被怀疑地看待。 这些数字可能不是我接受的东西。 但是,这些数字通常是可信的。 注意:虽然我的代码仅在Apple M1处理器下正常工作,但我相信它可能是固定的,以支持Intel处理器。