MPI编程实现梯形积分法
1.1问题描述1.2算法实现1.3结果实现与分析1.4源码实现
1.1问题描述
实现课件中的梯形积分法的MPI编程熟悉并掌握MPI编程方法,规模自行设定,可探讨不同规模对不同实现方式的影响。实验环境:联想笔记本,集成开发环境:Visual Studio
1.2算法实现
每个进程都分配执行Trap函数后,0号进程接收其他进程发送来的数据做求和运算。 执行函数Trap()
1.3结果实现与分析
使用MPI派发任务,进程执行速度快,结果准确,数据越大也不大影响程序的运行速度,相比pthread多线程和openmp执行效率更高。pthread编程需要定义全局变量,MPI则不需要共享变量,不用考虑数据共享大问题,使用send和recv处理数据,更具高效性。
1.4源码实现
#include<stdio.h>
#include<mpi.h>
#include<iostream>
using namespace std
;
double f(double x
) {
double temp
= 0.0;
temp
= sqrt(x
);
return temp
;
}
double Trap(double left_endpt
, double right_endpt
, int trap_count
, double base_len
)
{
double estimate
, x
;
int i
;
estimate
= (f(left_endpt
) + f(right_endpt
)) / 2.0;
for (i
= 1; i
<= trap_count
- 1; i
++) {
x
= left_endpt
+ i
* base_len
;
estimate
+= f(x
);
}
estimate
= estimate
* base_len
;
return estimate
;
}
int main(int argc
, char* argv
[]) {
MPI_Init(&argc
, &argv
);
int my_rank
, comm_sz
, n
=20, local_n
;
double a
= 1.0, b
= 1000.0, h
, local_a
, local_b
;
double local_int
, total_int
;
int source
;
MPI_Comm_rank(MPI_COMM_WORLD
, &my_rank
);
MPI_Comm_size(MPI_COMM_WORLD
, &comm_sz
);
h
= (b
- a
) / n
;
local_n
= n
/ comm_sz
;
local_a
= a
+ double(my_rank
* local_n
* h
);
local_b
= local_a
+ local_n
* h
;
local_int
= Trap(local_a
, local_b
, local_n
, h
);
if (my_rank
!= 0) {
MPI_Send(&local_int
, 1, MPI_DOUBLE
, 0, 0, MPI_COMM_WORLD
);
}
else {
total_int
= local_int
;
for (source
= 1; source
< comm_sz
; source
++) {
MPI_Recv(&local_int
, 1, MPI_DOUBLE
, source
, 0, MPI_COMM_WORLD
, MPI_STATUS_IGNORE
);
total_int
+= local_int
;
}
}
if (my_rank
== 0) {
printf("n = %d \n", n
);
printf("from %f to %f = %.15e\n", a
, b
, total_int
);
}
MPI_Finalize();
return 0;
}
我是一只努力飞的菜鸟,大家一起加油吧。 如有错误,请指出,大家一起进步哦! 2020/06/30