18

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

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

4

5 回答 5

26

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

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

但是,请记住,现代 CPU 是非常复杂的野兽,它们的性能取决于多种因素,您几乎无法接近最大化 CPU,并了解原因或究竟是什么阻碍了您的代码返回需要对硬件有相当透彻的了解。(我通常的经验法则是,如果你能持续获得理论峰值 FLOPS 的 30-40%,你就做得很好)

于 2013-08-19T07:29:27.310 回答
7

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

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

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

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

所以,理论上我们可以通过编写非常聪明的代码来填充处理器的指令,使其最大化。在实践中,这很快就变成了一项艰巨的任务。

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

于 2013-08-19T07:56:14.873 回答
3

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

适当的实施可以产生巨大的影响。您可能想查看这个关于缓存友好代码的问题。

于 2013-08-19T08:28:02.777 回答
1

现代 CPU 是流水线指令处理,因此没有这样的常数。

但是,您可以在算法开始和结束时读出 CPU 滴答数。我认为这是通过这种测量所能达到的最低水平。

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

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

于 2013-08-19T07:23:54.597 回答
1

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

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

性能统计 -d<exename>

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

于 2019-02-21T12:12:22.670 回答