我不明白为什么在这段代码中只有线程0的n = 1,而其他的n = 0且共享n :
int main()
{
int n, tid;
#pragma omp parallel shared(n) private(tid)
{
tid = omp_get_thread_num();
n = 0;
if (tid == 0)
{
n++;
}
printf("I'am %d, this is my n: %d\n", tid, n);
}
return 0;
}
输出:
I'am 5, this is my n: 0
I'am 7, this is my n: 0
I'am 0, this is my n: 1
I'am 2, this is my n: 0
I'am 4, this is my n: 0
I'am 3, this is my n: 0
I'am 6, this is my n: 0
I'am 1, this is my n: 0
我是OMP库的新手。我正在通过ssh在一个有8个节点的集群上工作,这可能是个问题吗?
谢谢。
答案 0 :(得分:1)
您实际上正在通过每个线程将categoryName
重置为零。在打印之前,只有n
的帖子会增加tid==0
。即使在这里,您也可能会遇到要打印的程序
我是0,这是我的n:0
而不是预期的
我是0,这是我的n:1
因为你制作了一个所谓的race condition。
如果您打算仅在运行时开始时将n
初始化为零,则需要提前初始化n
,例如在开始并行部分之前:
n
但请注意,打印列表中n = 0;
#pragma omp parallel shared(n) private(tid)
{
tid = omp_get_thread_num();
if (tid == 0)
{
n++;
}
printf("I'am %d, this is my n: %d\n", tid, n);
}
的状态将再次稍微随机,因为您永远无法确定线程0何时将n
的值增加到等于1。 / p>
答案 1 :(得分:0)
最后这应该是让每个线程打印出来的代码" n = 1":
int main()
{
int n=0, t;
#pragma omp parallel shared(n) private(t)
{
t = omp_get_thread_num();
if (t == 0)
{
n++;
}
#pragma omp barrier
printf("Sono %d e ho n = %d\n", t, n);
}
return 0;
}
感谢fuesika。