OpenMP共享变量似乎是私有的

时间:2015-06-13 11:33:18

标签: c parallel-processing openmp

我不明白为什么在这段代码中只有线程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个节点的集群上工作,这可能是个问题吗?

谢谢。

2 个答案:

答案 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。