当我使用没有reduction(+ : sum)
功能的OpenMP时,OpenMP版本可以正常工作。
#include <iostream>
#include <omp.h>
using namespace std;
int sum = 0;
void summation()
{
sum = sum + 1;
}
int main()
{
int i,sum;
#pragma omp parallel for reduction (+ : sum)
for(i = 0; i < 1000000000; i++)
summation();
#pragma omp parallel for reduction (+ : sum)
for(i = 0; i < 1000000000; i++)
summation();
#pragma omp parallel for reduction (+ : sum)
for(i = 0; i < 1000000000; i++)
summation();
std::cerr << "Sum is=" << sum << std::endl;
}
但是当我在全局变量上调用函数summation
时,OpenMP版本比顺序版本花费的时间更多。
我想知道相同的原因和应该做出的改变。
答案 0 :(得分:0)
summation
函数不使用您要减少的OMP共享变量。解决它:
#include <iostream>
#include <omp.h>
void summation(int& sum) { sum++; }
int main()
{
int sum;
#pragma omp parallel for reduction (+ : sum)
for(int i = 0; i < 1000000000; ++i)
summation(sum);
std::cerr << "Sum is=" << sum << '\n';
}
答案 1 :(得分:0)
同步对这一个变量的访问所花费的时间将超过您使用多个核心所获得的时间 - 它们将无休止地相互等待,因为只有一个变量且只有一个核心可以访问它一次。这种设计不具备并发性,您支付的所有同步只会增加运行时间。