For loop OpenMP并行程序无法按预期工作

For loop OpenMP并行程序无法按预期工作,for-loop,parallel-processing,openmp,For Loop,Parallel Processing,Openmp,我有一个简单的程序: int index; unsigned int count = 0; #pragma omp parallel for for (index = 0; index < 10000; index++) { count++; } int索引; 无符号整数计数=0; #pragma-omp并行 对于(索引=0;索引

我有一个简单的程序:

int index;
unsigned int count = 0;

#pragma omp parallel for
for (index = 0; index < 10000; index++)
{
    count++;
}
int索引;
无符号整数计数=0;
#pragma-omp并行
对于(索引=0;索引<10000;索引++)
{
计数++;
}
问题是我认为计数应该等于10000。但是,它通常在5000左右。10%左右等于10000


这是怎么回事?

正如评论中所建议的,您需要指示:

int index;
unsigned int count = 0;

#pragma omp parallel for reduction(+:count)
for (index = 0; index < 10000; index++)
{
    count++;
}
int索引;
无符号整数计数=0;
#pragma omp并行减少(+:计数)
对于(索引=0;索引<10000;索引++)
{
计数++;
}

正如评论中所建议的,您需要指令:

int index;
unsigned int count = 0;

#pragma omp parallel for reduction(+:count)
for (index = 0; index < 10000; index++)
{
    count++;
}
int索引;
无符号整数计数=0;
#pragma omp并行减少(+:计数)
对于(索引=0;索引<10000;索引++)
{
计数++;
}

count++
不是一个原子操作感谢添加了
#pragma omp-atomic
之后它工作了,但是,这个循环的性能下降了。有没有办法更快呢?
count++
原子
保护是一条用OpenMP开销编写串行程序的捷径。不要走那条路。相反,学习如何使用OpenMP的
缩减
变量。在这里搜索,您将找到足够的内容开始。计数+++
不是一个原子操作。在添加了
#pragma omp atomic
之后,它工作了,但是,这个循环的性能下降有没有更快的方法?
count++
atomic
保护是一条用OpenMP的开销编写串行程序的捷径。不要走那条路。相反,学习如何使用OpenMP的
缩减
变量。通过在此处搜索,您将找到足够的内容开始。我不会说可能需要,尽管这是一种解决问题的方法。我不会说可能需要,尽管这是一种解决问题的方法。