不要在 GCC 中使用 -O3 标志优化特定循环 [关闭]
Posted
技术标签:
【中文标题】不要在 GCC 中使用 -O3 标志优化特定循环 [关闭]【英文标题】:Don't optimize an specific loop using -O3 flag in GCC [closed] 【发布时间】:2013-01-05 19:25:01 【问题描述】:在我的代码中,我使用一个简单的 int 变量(名为 counter)来同步 4 个线程。
这是我的代码的 sn-p:
int counter = 0;
#pragma omp parallel shared(counter) num_threads(4)
while(counter != thread_id)
// What should I put here?
// Actions needed to be performed 'in order'
counter++;
// The rest of the code
我面临的问题是,如果我使用 -O3 优化标志,则编译代码中的 while 循环“消失”...例如,如果我在循环中放置了 printf 行,则会发生 while 和一切工作正常...
我应该在我的 while 循环中放什么,这样 -O3 才不会影响它的行为?
--- 编辑---
抱歉缺少上下文...我需要创建在特定处理器上工作的线程团队,因为我正在使用 NUMA 系统,所以我需要“团队创建”部分以便我可以使用处理器亲和力......请看这个相关的问题: Specific thread order in C using GCC and OMP
【问题讨论】:
您是否正在尝试同步/加入您的线程? OpenMP 已经有结构可以做到这一点。不要试图自己动手;这完全违背了重点! 如果您尝试以这种方式同步线程,我会否决所有告诉您如何操作的答案。 作为一般规则,如果一个循环似乎没有产生任何后果,那么如果它被优化器简单地删除,您应该不会感到惊讶。 对,但是我正在循环中做一些事情......这是一个积极的等待......有没有办法告诉编译器我需要那个循环而不包含一些虚拟函数?跨度> 我对 Oli/Luchian cmets 投了赞成票。为什么?因为他们是对的。 【参考方案1】:如前所述,这是一种糟糕的线程同步方式。由于我不希望我的回答被否决,我将解释您应该使用其他形式的同步。通常,信号量用于计算事物,因此这可能是正确的做法,但由于我们没有您的所有代码,因此没有特别好的方法来判断。
【讨论】:
以上是关于不要在 GCC 中使用 -O3 标志优化特定循环 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章