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

时间:2013-08-19 07:17:54

标签: c++ c algorithm sorting benchmarking

有没有快速/简单的方法(至少粗略估计)?

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

5 个答案:

答案 0 :(得分:25)

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

如果你想做你的实际做的,那么运行你自己的代码并测量它的性能。

然而,请记住,现代CPU是非常复杂的野兽,它们的性能取决于多种因素,并且您很少能够接近最大化CPU,并理解为什么< / em>,或者究竟是什么让你的代码保持不变需要对硬件有一个相当透彻的了解。 (我通常的经验法则是,如果你获得理论峰值FLOPS的持续30-40%,那么你的表现非常好)

答案 1 :(得分:7)

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

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

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

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

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

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

答案 2 :(得分:3)

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

正确的实施可以产生巨大的差异。您可以查看有关cache-friendly code

的问题

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:1)

您可以在Linux中使用Perf工具。易于使用。

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

性能统计-d <exename>

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