我有功能
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 for
和omp_set_num_threads(nThreads);
)。但是,并行版本会产生错误的结果,我认为这是因为counter
变量需要在每个for循环的开头设置为零,并且可能另一个线程可以使用非归零的{{1}价值。但即使我使用counter
,问题仍然存在。我错过了什么?
我将程序编译为C89。
答案 0 :(得分:2)
在OpenMP并行区域内,您要为counter
,n
和isodd
标量变量分配值。因此,默认情况下,它们不能只是shared
。你需要特别注意它们。
快速分析表明,由于它们的值仅在并行区域内有意义且仅对当前线程有意义,因此很明显它们需要声明为private
。
在private( counter, n, isodd )
指令中添加#pragma omp parallel
子句可以解决问题。