【MPI编程实现梯形积分法】

    技术2022-07-10  99

    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

    Processed: 0.015, SQL: 9