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的缩减
变量。通过在此处搜索,您将找到足够的内容开始。我不会说可能需要,尽管这是一种解决问题的方法。我不会说可能需要,尽管这是一种解决问题的方法。