防止GCC在基准代码中移动代码
Prevent code being moved by GCC in benchmark code
我正在尝试对我们正在使用的一些基准代码进行微调,并想知道是否有一种方法可以明确地与GCC沟通如何排序某些代码位。例如,给定以下代码块:
- Pre
- 启动计时器
- 车身
- 停止计时器
- Post
我想告诉GCC,每个块必须按照上述顺序保存,而不会有任何指令泄漏到另一个块中。理想情况下,计时器将只测量步骤3,然而,出于实际原因,至少测量步骤3和最多测量步骤2-4就足够了。我只是想确保我注意到测量了步骤1或5的任何部分。
目前,我在Timer函数中使用__sync_synchronize
来发布全内存围栏。我希望,除了作为一个围栏之外,这个功能还被标记为防止重新排序。
呼叫__sync_synchronize
是否足够?同样从逻辑上讲,根据标准文本,C++11 fence命令是否也足够?
如果Start-Timer
是函数调用,而Stop-Timer
是另一个函数调用,则优化器几乎没有机会移动Body
,或者将材料从Pre
或Post
溢出到Body
。
Pre
的所有副作用必须在调用Start-Timer
函数之前完成(那里有一个序列点)。Stop-Timer
的所有副作用必须在执行Post
之前完成(那里也有一个序列点)。因此,编译器必须让Start-Timer
和Stop-Timer
的代码与生成的代码一起对monkey可见,从而泄露材料,即使在那时,我也不相信它能做到这一点。
总之,如果您使用函数调用来启动和停止计时器,我认为您不必担心。
制作两个版本的代码:一个是要测量的真实代码,另一个是存根。测量两者。减那么,我认为,你不必关心GCC做什么。
相关文章:
- 可以使用移动语义更改或改进此C++代码吗?
- 是否可以避免在以下代码中复制/移动构造函数的需要?
- 为什么在我的代码中调用复制构造函数而不是移动构造函数?
- C++具有移动和复制构造函数的类中的代码重复
- 初始化不可移动对象数组:为什么这样的代码无法在 GCC 上编译?
- 将代码移动到函数中时,DLL "myApp.exe"中找不到序号错误0xC0000138
- 在将其尺寸较大的向量移动到容量较小的向量之前,是否可以通过使用Reserve()来提高代码性能
- 将代码移动到 Opencv cv::P arallelLoopBody
- 移动返回对象的构造函数会中断C++98 代码?
- 从旧的 C 样式指针移动到C++智能指针,代码几乎没有变化
- 源引擎 - 移动代码:什么是"wishspeed"?
- 如何在c++中将代码片段移动到不同的文件中
- 使用代码移动光标并打开文件夹
- C++ - 国际象棋主教移动代码错误
- 我可以将C++代码(或用C++编写的库)与混合移动应用程序代码混合使用吗
- 将代码移动到另一个标头后出现重定义错误
- 将代码移动到头文件
- Arduino代码:移动位似乎将数据类型从int更改为long
- ICC 未执行循环不变代码移动
- 当我所做的只是将循环代码移动到函数中时,代码运行速度会慢10倍