我有一个代码:
#include <stdio.h>
#include <omp.h>
static void func()
{
char t[30];
sprintf(t,"%d %d\n",omp_get_num_threads(),omp_get_thread_num());
write(1,t,strlen(t));
write(1,"checkpoint 1\n",13);
#pragma omp barrier
write(1,"checkpoint 2\n",13);
#pragma omp barrier
write(1,"checkpoint 3\n",13);
#pragma omp barrier
write(1,"checkpoint 4\n",13);
}
int main()
{
int i;
#pragma omp parallel for
for(i=0;i<2;i++)
{
func();
}
}
和输出:
8 1
8 0
checkpoint 1
checkpoint 1
checkpoint 2
checkpoint 2
[here my program blocks].
如果我将2改为8,则可行。但我希望在我的for循环中有2个。
如何在循环之前不使用omp_set_num_threads(2)使我的代码正常工作? (当我把它放进去时它也有效)
答案 0 :(得分:2)
障碍用于同步团队中的所有线程。所有到达的线程将被阻塞,直到所有线程都到达屏障。然后,只有这样,他们才能继续。
因此,为了让您的程序终止,所有线程在其生命中必须达到相同数量的障碍。如果一个线程比其他线程有更多的障碍,那么该线程永远不能通过它的额外障碍因为它将等待其他线程 - 这将永远不会到达那里因为它们没有那个额外的障碍。
你在函数func
中有一个障碍,它在你的并行循环的每次迭代中执行一次。由于OpenMP将这些迭代分配给线程,因此并非所有迭代都可以接收相同数量的迭代(在您的情况下,对于每个线程,线程数为2时,它们会收到相同的数字 - 一次迭代,这就是你的程序终止的原因)。不等数量的障碍阻碍了你的计划。
确保仅在您知道所有线程将经常执行它的地方放置障碍。