MPI并行求积分
2022-05-16 本文已影响0人
吃核桃用手夹
#include<stdio.h>
#include<mpi.h>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
double Trap(double left_endpt, double right_endpt, int trap_count, double base_1en);
double f(double x);
int main(int argc, char* argv[]) {
int done = 0, my_rank, comm_sz, n = 10000000, local_n;
double a = 0.0, b = 1.0, h, local_a, local_b;
double local_int, total_int;
int source;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
double startwtime = 0.0, endwtime;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);//进程号
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);//进程总数
MPI_Get_processor_name(processor_name, &namelen);//获取处理器名称
fprintf(stderr, "Process %d of %d on %s \n",my_rank, comm_sz, processor_name);
while (!done) {
if (my_rank == 0) {
fprintf(stdout, "Enter the number of intervals: (0 quits) ");
fflush(stdout);
if (scanf_s("%d", &n) != 1) {
fprintf(stdout, "No number entered; quitting\n");
n = 0;
}
startwtime = MPI_Wtime();
}
if (n == 0)
{
done = 1;
}
else {
h = (b - a) / n; /* h is the same for a11 processes */ //间距
local_n = n / comm_sz; /* So is the number of trapezoids */ //
local_a = a + my_rank * local_n * h;
local_b = local_a + local_n * h;
local_int = Trap(local_a, local_b, local_n, h);
//printf("localdata my_rank:%d comm_sz:%d processor_name:%s\n", my_rank, comm_sz, processor_name);
//printf("localVar local_n:%d local_a:%f local_b:%f local_int:%f \n\n", local_n, local_a, local_b, local_int);
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("With n = %d trapezoids, our estimate\n", n);
printf("of the integral from %f to %f = %.15e\n", a, b, total_int);
endwtime = MPI_Wtime();
printf("wall clock time = %f\n", endwtime - startwtime);
}
}
}
MPI_Finalize();
return 0;
}/* main */
double Trap(
double left_endpt,
double right_endpt,
int trap_count,
double base_1en) {
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_1en;
estimate += f(x);
}
estimate = estimate * base_1en;
return estimate;
}/*Trap*/
double f(double x) {
return x * x;
}
image.png
image.png
image.png
image.png