我正在尝试微调我们正在使用的一些基准代码,并且想知道是否有一种方法可以明确地与GCC通信如何订购某些代码.例如,给定这些代码块:
我想告诉GCC,每个块必须按上述顺序保存,而不会有任何指令泄漏到另一个块中.理想情况下,计时器仅测量步骤3,但是,出于实际原因,至少测量步骤3并且最多步骤2-4就足够了.我只是想确保我记下测量步骤1或5的任何部分.
目前我__sync_synchronize在Timer函数中使用了一个完整的内存栅栏.我希望,除了作为围栏之外,还要标记此功能以防止重新排序.
这个电话是否__sync_synchronize充足?从逻辑上讲,根据标准文本,C++ 11 fence命令是否也足够?
如果 是Start-Timer一个函数调用而Stop-Timer是另一个函数调用,则优化器几乎没有机会移动Body或将材料从 中溢出Pre或Post溢出到 中Body。
所有副作用都Pre必须在调用函数之前完成Start-Timer(那里有一个序列点)。的所有副作用Stop-Timer必须在执行之前完成Post(那里也有一个序列点)。因此,编译器必须拥有对生成的代码进行猴子可见的代码Start-Timer,Stop-Timer从而散布材料,而且我也不相信即使那样它也能做到这一点。
所以,总而言之,如果您使用函数调用来启动和停止计时器,我认为您不必担心它。