我正在尝试微调一些我们正在使用的基准代码,我想知道是否有一种方法可以明确地与GCC沟通,如何对某些代码进行排序。例如,给定这些代码块:
我想告诉GCC,每个区块必须保持上述顺序,不得有任何指令泄漏到另一个区块。理想情况下,计时器只测量步骤3,然而,出于实际原因,测量至少第3步和大多数步骤2-4就足够了。我只想确定我在测量第一步或第五步的任何部分。
目前,我在计时器函数中使用一个__sync_synchronize来发出一个完整的内存围栏。我希望,除了作为一个围栏,这一功能被标记,以防止重新排序。
这个对__sync_synchronize的调用足够了吗?同样,从逻辑上讲,根据标准的文本,C++11 fence命令也足够了吗?
发布于 2012-01-29 14:29:49
如果Start-Timer是一个函数调用,而Stop-Timer是另一个函数调用,那么优化器几乎没有机会移动Body,或者将材料从Pre或Post泄漏到Body中。
Pre的所有副作用必须在调用Start-Timer函数之前完成(这里有一个序列点)。Stop-Timer的所有副作用必须在执行Post之前完成(也有一个序列点)。所以编译器必须让Start-Timer和Stop-Timer的代码对猴子来说是可见的,并在生成的代码中溢出信息,而且我也不相信它能够做到这一点。
因此,总之,如果使用函数调用来启动和停止计时器,我不认为您需要担心它。
https://stackoverflow.com/questions/9053849
复制相似问题