如何测试计算机每秒可以执行的指令数量?

问题描述 投票:18回答:5

有没有快速/简单的方法来做到这一点(至少粗略估计)?

我是基准测试算法,我认为知道我的计算机执行指令的绝对速度并将其与我的渐近分析进行比较会很酷。

c++ c algorithm sorting benchmarking
5个回答
25
投票

如果您想知道您的CPU可以做什么,请查看文档。您的CPU供应商指定所有指令的延迟和吞吐量,以及各种其他信息(每个周期可以发出或退出的指令数,缓存延迟等等)。基于此,您可以计算理论峰值吞吐量。

如果您想要执行CPU实际执行的操作,请运行自己的代码并测量其性能。

但是,请记住,现代CPU确实是复杂的动物,它们的性能取决于各种各样的因素,并且你很少能够接近最大化你的CPU,并理解为什么,或者究竟是什么让你的代码返回需要对硬件有一个相当透彻的理解。 (我通常的经验法则是,如果你获得理论峰值FLOPS的持续30-40%,你会做得非常好)


7
投票

这是一个典型的案例“理论上,理论和实践是相同的,在实践中它们不是”。

现代CPU具有非常复杂的逻辑,这意味着所执行的ACTUAL操作数量与您从查看代码或思考问题时的想法不同[除非您的大脑与小行星的大小相同并且知道特定的CPU如何工作]。例如,处理器可以推测性地在分支的一侧或另一侧执行指令,即使它没有完全到达分支 - 如果这是“错误”的一方,那么它将丢弃那些指令的结果 - 但是当然,执行它们需要时间。

指令也不按顺序执行,这意味着很难准确预测何时执行哪条指令。有一些例外。

如果您同时通过所有可用的执行单元推送数据和指令,您将只获得(接近)理论吞吐量 - 这意味着具有正确的指令组合,当然还有缓存中的所有代码和数据。

因此,从理论上讲,我们可以通过编写非常聪明的代码来填充处理器,这些指令可以最大化它。在实践中,这非常非常迅速地变成了一项艰巨的任务。

然而,问题在于测量指令的吞吐量,而在现代CPU上,使用正确的额外软件可以实现这一点。在linux perftool或oprofile上,对于Windows,有英特尔的VTune和AMD的代码分析师。这些将允许您(具有足够的权限)获取处理器中的“性能计数器”,其具有“指令数”,“浮动操作数”,“缓存未命中数”,“分支错误预测”的计数器和许多其他测量处理器性能的测量。因此,给定足够长的运行时间(至少几秒钟,最好是更多),您可以测量处理器执行的实际计数或时钟周期。


3
投票

在实践中,有效的指令数主要取决于内存延迟,这是性能的主要瓶颈。等待数据很糟糕。处理器可以通过缓存,流水线操作和并发等技术稍微缓解这个问题,但问题仍然存在并且只会随着时间的推移而变得更糟。

正确的实施可以产生巨大的差异。您可能想看看有关cache-friendly code的这个问题。


1
投票

现代CPU正在流水线化指令处理,因此没有这样的常量。

但是,您可以在算法开始时和结束时读出CPU滴答数。我认为这与您测量的水平一样低。

http://en.wikipedia.org/wiki/Time_Stamp_Counter

注意:有很多问题为什么这不是100%准确,我可以提到很少,但我相信社区将能够添加到列表中:-OS预先处理您的进程 - 缓存未命中(算法)将在第一次运行得更慢,如果它随后运行得更快) - 在较旧的CPU中,CPU滴答对CPU频率不是不变的


1
投票

您可以在Linux中使用Perf工具。它很容易使用。

要获得有关CPU周期,每个周期的指令(IPC),缓存命中/未命中等的统计信息,只需使用Perf运行程序即可。示例命令是

perf stat -d <exename>

有关更多信息,请访问http://www.brendangregg.com/perf.htmlhttps://perf.wiki.kernel.org/index.php/Tutorial

© www.soinside.com 2019 - 2024. All rights reserved.