Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何测试计算机每秒可以执行多少指令?_C++_C_Algorithm_Sorting_Benchmarking - Fatal编程技术网

C++ 如何测试计算机每秒可以执行多少指令?

C++ 如何测试计算机每秒可以执行多少指令?,c++,c,algorithm,sorting,benchmarking,C++,C,Algorithm,Sorting,Benchmarking,是否有一种快速/简单的方法(至少粗略估计) 我正在对算法进行基准测试,我想知道我的计算机执行指令的绝对速度并将其与我的渐近分析进行比较会很酷。现代CPU是流水线指令处理,因此没有常数 不过,您可以在算法开始和结束时读取CPU的滴答数。我认为这是通过这种测量所能达到的最低水平 注意:有很多问题,为什么这不是100%准确,我可以提到几个,但我相信社区将能够添加到列表中: -操作系统抢占您的进程 -缓存未命中(algo在第一次运行时速度较慢,如果随后运行则速度较快) -在较旧的CPU上,CPU时钟对

是否有一种快速/简单的方法(至少粗略估计)


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

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

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

注意:有很多问题,为什么这不是100%准确,我可以提到几个,但我相信社区将能够添加到列表中: -操作系统抢占您的进程 -缓存未命中(algo在第一次运行时速度较慢,如果随后运行则速度较快)
-在较旧的CPU上,CPU时钟对CPU频率不是不变的。如果您想知道CPU可以做什么,请参阅文档。您的CPU供应商指定所有指令的延迟和吞吐量,以及各种其他信息(每个周期可发出或失效的指令数、缓存延迟等)。基于此,您可以计算理论峰值吞吐量

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

但是,请记住,现代CPU是非常复杂的野兽,它们的性能取决于各种各样的因素,您将很难接近CPU的最大化,理解为什么或者到底是什么阻碍了您的代码需要对硬件有相当透彻的了解。(我通常的经验法则是,如果你持续获得30-40%的理论峰值失败,你会做得很好)

这是一个典型的例子,“理论上,理论和实践是一样的,但实际上它们不是”

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

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

如果一次将数据和指令推送到所有可用的执行单元中,则只能获得(接近)理论吞吐量——这意味着拥有正确的指令组合,当然还有缓存中的所有代码和数据

因此,理论上,我们可以通过编写非常聪明的代码,在处理器中塞满指令,使其发挥最大的作用。实际上,这很快就变成了一项艰巨的任务


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

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


正确的实施可以带来巨大的不同。您可能想查看关于的这个问题。

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

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

性能统计-d


有关更多信息,请访问或

不,确实没有(简单的方法)。问题相当简单:计算机可以执行的指令数量(很大程度上)取决于这些指令的混合和顺序。获得一个结果意味着任何事情通常都涉及到一些著名基准测试的结果——但有意义的基准测试通常相当复杂。即使这样,你也必须小心——数字往往意味着比预期的少。@DanielKO Whetstone基准测试最初是用Algol编写的,基于1970年左右从英国国家物理实验室收集的统计数据,但仅使用四元素数组来测试数组访问。然后它被翻译成Fortran。Dhrystone基于类似的原理,使用不同的语言,用Ada编写,但翻译成C。大约30年前,当我第一次研究它时,我认为Whetstone是过时和不现实的。@DanielKO重点是,四元素数组和访问它们的循环可以以不适用于较大数组的方式进行优化,这四个是Whetstone中唯一的数组大小。虽然我查阅了维基百科的日期,但我早在维基百科存在之前就知道了惠斯通的历史。“这个30年的基准仍然被广泛使用,因此它是最接近“粗略估计”的基准。”。我是否遗漏了一条重要的信息,这条信息会使结论看起来合乎逻辑如果您采用原始的Dhrystone基准测试和比较