防止GCC在基准代码中移动代码

Prevent code being moved by GCC in benchmark code

本文关键字:代码 移动 基准 GCC 防止      更新时间:2023-10-16

我正在尝试对我们正在使用的一些基准代码进行微调,并想知道是否有一种方法可以明确地与GCC沟通如何排序某些代码位。例如,给定以下代码块:

  1. Pre
  2. 启动计时器
  3. 车身
  4. 停止计时器
  5. Post

我想告诉GCC,每个块必须按照上述顺序保存,而不会有任何指令泄漏到另一个块中。理想情况下,计时器将只测量步骤3,然而,出于实际原因,至少测量步骤3和最多测量步骤2-4就足够了。我只是想确保我注意到测量了步骤1或5的任何部分。

目前,我在Timer函数中使用__sync_synchronize来发布全内存围栏。我希望,除了作为一个围栏之外,这个功能还被标记为防止重新排序。

呼叫__sync_synchronize是否足够?同样从逻辑上讲,根据标准文本,C++11 fence命令是否也足够?

如果Start-Timer是函数调用,而Stop-Timer是另一个函数调用,则优化器几乎没有机会移动Body,或者将材料从PrePost溢出到Body

Pre的所有副作用必须在调用Start-Timer函数之前完成(那里有一个序列点)。Stop-Timer的所有副作用必须在执行Post之前完成(那里也有一个序列点)。因此,编译器必须让Start-TimerStop-Timer的代码与生成的代码一起对monkey可见,从而泄露材料,即使在那时,我也不相信它能做到这一点。

总之,如果您使用函数调用来启动和停止计时器,我认为您不必担心。

制作两个版本的代码:一个是要测量的真实代码,另一个是存根。测量两者。减那么,我认为,你不必关心GCC做什么。