为了进一步掌握 OpenMP 编程、了解共享存储与消息传递机制编程的区别,掌握 OpenMP、MPI 的基本功能、构成方式、句法、Visual Studio 集成开发环境的使用,并配置环境变量;OpenMP、MPI 并行程序设计方法,了解并行程序的过程及优越性,本文采用 MPI 消息传递机制编程的基本使用和调试方法、性能优化及多核技术的基本概念
一、 目标
在共享存储OpenMP 环境下使用 SPMD(单程序多数据) 并行计算π 的值
二、运行结果
(1)代码实现:
#include <stdio.h>
#include <omp.h>
#include <cmath>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include "PrecisionNum.cpp"
#include "stdint.h"
void openmpPi_spmd() {
time_t start=clock();
PrecisionNum pi(0),dx,one(1),four(4),two(2);
int step=10000;
PrecisionNum bigstep(step);
dx=dx.div(one,bigstep);
int threadNum=4;
PrecisionNum sum[threadNum];
omp_set_num_threads(threadNum); //设置线程数
#pragma omp parallel //并行域开始,每个线程(0和1)都会执行该代码
{
int id;
id = omp_get_thread_num();
PrecisionNum x2;
int i;
cout<<id<<endl;
sum[id];
#pragma omp parallel for shared(pi) private(i,x2)
for( i=id*step/threadNum; i < (id+1)*step/threadNum; i++) {
x2=i+0.5;
x2=x2/bigstep;
x2=x2*x2;
++x2;
x2=four/x2;
x2=x2*dx;
sum[id]=sum[id]+x2;
}
//#pragma omp critical (pi_lock)
// pi=pi+sum;
}
for(int i=0;i<threadNum;++i) {
sum[i].show();
pi = pi + sum[i]; }
time_t finish=clock();
cout<<"spend time:"<<double(finish-start)/CLOCKS_PER_SEC<<"s";
cout<<" OpenMP SPMD Pi:"<<endl;
pi.showAll();
//共2个线程参加计算,其中线程0进行迭代步0~49999,线程1进行迭代步50000~99999.
}
int main(int argc,char* argv[]) {
time_t start=clock();
cout<<"start clock:"<<start<<endl;
openmpPi_spmd();
time_t finish=clock();
cout<<"finish clock:"<<finish<<endl;
cout<<"total time:"<<double(finish-start)/CLOCKS_PER_SEC<<"s"<<endl;
return 0;
}
(2)运行结果截图