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