【发布时间】:2015-08-23 14:39:59
【问题描述】:
我有一个代码:
#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].
如果我将 for 中的 2 更改为 8,它会起作用。但我想在我的 for 循环中有 2 个。
如何在循环前不使用 omp_set_num_threads(2) 使我的代码正常工作? (当我放这个时它也有效)
【问题讨论】:
-
OpenMP 障碍在团队中的线程中是全局的。您不能只让 N 个线程中的两个在屏障上同步。这就是当您将线程数显式设置为两个时它起作用的原因。