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

时间:2012-01-29 14:18:40

标签: c++ gcc

我正在尝试微调我们正在使用的一些基准代码,并且想知道是否有一种方法可以明确地与GCC通信如何订购某些代码。例如,给定这些代码块:

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

    目前我在Timer函数中使用__sync_synchronize来发出完整的内存栅栏。我希望,除了作为围栏外,还要标记此功能以防止重新排序。

    __sync_synchronize的电话是否足够?从逻辑上讲,根据标准文本,C ++ 11 fence命令是否也足够了?

2 个答案:

答案 0 :(得分:2)

如果Start-Timer是函数调用且Stop-Timer是另一个函数调用,则优化器几乎没有机会移动Body或从Pre溢出材料或Post进入Body

Pre的所有副作用必须在调用Start-Timer函数之前完成(那里有一个序列点)。 Stop-Timer的所有副作用必须在执行Post之前完成(那里也有一个序列点)。因此,编译器必须使用生成的代码使Start-TimerStop-Timer的代码可见,溢出材料,并且我不相信即使这样也可以这样做。

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

答案 1 :(得分:0)

制作两个版本的代码:一个包含您要测量的实际代码,一个包含存根。测量两者。减去。然后,我想,你不必关心GCC做什么。