计数在OpenMP中无法正常工作

时间:2016-05-25 12:29:47

标签: c openmp c89

我有功能

void collatz(int startNumber, int endNumber, int* iter, int nThreads)
{
    int i, n, counter;
    int isodd; /* 1 if n is odd, 0 if even */
    #pragma omp parallel for
    for (i = startNumber; i <= endNumber; i++)
    {
        counter = 0;
        n = i;
        omp_set_num_threads(nThreads);
        while (n > 1)
        {
            isodd = n%2;
            if (isodd)
                n = 3*n+1;
            else
                n/=2;
            counter++;
        }
        iter[i - startNumber] = counter;
    }
}

运行序列时可以正常工作(即在没有OpenMP的情况下进行编译或注释掉#pragma omp parallel foromp_set_num_threads(nThreads);)。但是,并行版本会产生错误的结果,我认为这是因为counter变量需要在每个for循环的开头设置为零,并且可能另一个线程可以使用非归零的{{1}价值。但即使我使用counter,问题仍然存在。我错过了什么?

我将程序编译为C89。

1 个答案:

答案 0 :(得分:2)

在OpenMP并行区域内,您要为counternisodd标量变量分配值。因此,默认情况下,它们不能只是shared。你需要特别注意它们。

快速分析表明,由于它们的值仅在并行区域内有意义且仅对当前线程有意义,因此很明显它们需要声明为private

private( counter, n, isodd )指令中添加#pragma omp parallel子句可以解决问题。