Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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++;编码准确吗?_C++_C_Benchmarking - Fatal编程技术网

C++ 如何为C/C++;编码准确吗?

C++ 如何为C/C++;编码准确吗?,c++,c,benchmarking,C++,C,Benchmarking,我问的是关于,在我的回答中,我首先得到了循环前后的时间,并打印出了它们的差异,但作为@cigien答案的更新,我似乎没有预热代码,从而错误地进行了基准测试 代码的预热是什么?我认为这里发生的事情是字符串首先被移动到缓存,这使得下面循环的基准测试结果彼此接近。在我以前的回答中,第一个基准测试结果比其他结果慢,因为将字符串移动到缓存需要更多的时间,我想,我是对的吗?如果不是,预热对代码实际做了什么?如果可能的话,一般来说,除了预热以获得更准确的结果之外,我还应该做些什么?或者如何正确地为C++代码做

我问的是关于,在我的回答中,我首先得到了循环前后的时间,并打印出了它们的差异,但作为
@cigien
答案的更新,我似乎没有预热代码,从而错误地进行了基准测试


代码的预热是什么?我认为这里发生的事情是字符串首先被移动到缓存,这使得下面循环的基准测试结果彼此接近。在我以前的回答中,第一个基准测试结果比其他结果慢,因为将字符串移动到缓存需要更多的时间,我想,我是对的吗?如果不是,预热对代码实际做了什么?如果可能的话,一般来说,除了预热以获得更准确的结果之外,我还应该做些什么?或者如何正确地为C++代码做基准测试(如果可能的话也可以是C)?< /P> < P> >给你一个预热的例子,我最近已经对一些NVIDIA CUDA内核调用进行了测试:

执行速度似乎会随着时间的推移而提高,可能是因为GPU频率可变(以节省电源和冷却时间)等原因

有时较慢的调用对下一个调用的影响更大,因此基准可能会产生误导

如果您需要对这些要点感到安全,我建议您:

  • 首先保留所有动态内存(如向量)
  • 在测量之前,制作一个for循环,多次执行相同的工作
  • 这意味着在循环之前只初始化一次输入数据(特别是随机数据),并在循环内每次复制它们以确保执行相同的工作
  • 如果使用缓存处理复杂对象,我建议您将它们打包到一个结构中,并为此结构创建一个数组(使用相同的构造或克隆技术),以确保对循环中相同的起始数据执行相同的工作
  • 如果经常交替进行两次调用,并且假设行为差异的影响会相互抵消,例如在模拟连续数据(如位置)时,可以避免执行for循环和复制数据
关于测量工具,我一直面临不同机器上高分辨率时钟的问题,比如持续时间的不一致性。相反,windows QueryPerformanceCounter非常好

我希望这有帮助

编辑


我忘了补充一点,正如在评论中所说的那样,编译器优化行为可能很烦人。我发现的最简单的方法是根据预热和测量数据中的一些非平凡操作来增加变量,以便尽可能多地强制顺序计算。

为了给您一个预热示例,我最近对一些nvidia cuda内核调用进行了基准测试:

执行速度似乎会随着时间的推移而提高,可能是因为GPU频率可变(以节省电源和冷却时间)等原因

有时较慢的调用对下一个调用的影响更大,因此基准可能会产生误导

如果您需要对这些要点感到安全,我建议您:

  • 首先保留所有动态内存(如向量)
  • 在测量之前,制作一个for循环,多次执行相同的工作
  • 这意味着在循环之前只初始化一次输入数据(特别是随机数据),并在循环内每次复制它们以确保执行相同的工作
  • 如果使用缓存处理复杂对象,我建议您将它们打包到一个结构中,并为此结构创建一个数组(使用相同的构造或克隆技术),以确保对循环中相同的起始数据执行相同的工作
  • 如果经常交替进行两次调用,并且假设行为差异的影响会相互抵消,例如在模拟连续数据(如位置)时,可以避免执行for循环和复制数据
关于测量工具,我一直面临不同机器上高分辨率时钟的问题,比如持续时间的不一致性。相反,windows QueryPerformanceCounter非常好

我希望这有帮助

编辑


我忘了补充一点,正如在评论中所说的那样,编译器优化行为可能很烦人。我发现的最简单的方法是根据预热和测量数据中的一些非平凡操作来增加一个变量,以便尽可能地强制顺序计算。

是的,预热正在填充缓存。但对于您的问题,很难在优化的系统上进行基准测试。比较同一系统上的不同代码以进行比较。基本上是好的enough@RoQuOTriX所谓优化系统,你是指不同的计算机运行相同的预优化/预热代码进行基准测试?我指的是优化系统,具有超线程的处理器、微指令、具有不同优先级的操作系统、流水线,对性能的影响如此之大,以至于你无法影响。但是,如果您保持在同一个系统上,它应该是相同的:覆盖了预热解决的许多特定陷阱(延迟分配导致的页面错误、首次访问某些内存时TLB/缓存未命中、分支预测失误)。也相关:。布蒂斯,热身正在填满缓存。但对于您的问题,很难在优化的系统上进行基准测试。比较同一系统上的不同代码以进行比较。基本上是好的enough@RoQuOTriX所谓优化系统,你是指不同的计算机运行相同的预优化/预热代码进行基准测试?我指的是优化系统,具有超线程的处理器、微指令、具有不同优先级的操作系统、流水线,对性能的影响如此之大,以至于你无法影响。但是如果你保持在同一个系统中,它应该是相同的:co