【发布时间】: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 投了赞成票。为什么?因为他们是对的。
标签: c++ c optimization gcc openmp