java openmp,openmp中的并行循环

I'm trying to parallelize a very simple for-loop, but this is my first attempt at using openMP in a long time. I'm getting baffled by the run times. Here is my code:

#include

#include

using namespace std;

int main ()

{

int n=400000, m=1000;

double x=0,y=0;

double s=0;

vector< double > shifts(n,0);

#pragma omp parallel for

for (int j=0; j

double r=0.0;

for (int i=0; i < m; i++){

double rand_g1 = cos(i/double(m));

double rand_g2 = sin(i/double(m));

x += rand_g1;

y += rand_g2;

r += sqrt(rand_g1*rand_g1 + rand_g2*rand_g2);

}

shifts[j] = r / m;

}

cout << *std::max_element( shifts.begin(), shifts.end() ) << endl;

}

I compile it with

g++ -O3 testMP.cc -o testMP -I /opt/boost_1_48_0/include

that is, no "-fopenmp", and I get these timings:

real 0m18.417s

user 0m18.357s

sys 0m0.004s

when I do use "-fopenmp",

g++ -O3 -fopenmp testMP.cc -o testMP -I /opt/boost_1_48_0/include

I get these numbers for the times:

real 0m6.853s

user 0m52.007s

sys 0m0.008s

which doesn't make sense to me. How using eight cores can only result in just 3-fold

increase of performance? Am I coding the loop correctly?

解决方案

You should make use of the OpenMP reduction clause for x and y:

#pragma omp parallel for reduction(+:x,y)

for (int j=0; j

double r=0.0;

for (int i=0; i < m; i++){

double rand_g1 = cos(i/double(m));

double rand_g2 = sin(i/double(m));

x += rand_g1;

y += rand_g2;

r += sqrt(rand_g1*rand_g1 + rand_g2*rand_g2);

}

shifts[j] = r / m;

}

With reduction each thread accumulates its own partial sum in x and y and in the end all partial values are summed together in order to obtain the final values.

Serial version:

25.05s user 0.01s system 99% cpu 25.059 total

OpenMP version w/ OMP_NUM_THREADS=16:

24.76s user 0.02s system 1590% cpu 1.559 total

See - superlinear speed-up :)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值