用MPI求解梯形积分(上)

用MPI求解梯形积分(上)

版本一:(固定a,b,n值,使用MPI6个基本函数)

#include<stdio.h>
#include<mpi.h>


double f(double x){
 return x*x;
}


double Trap(double left_side,double right_side,int local_count,double h){
int i;
double estimate,temp;
double left1,right1;
left1=f(left_side);
right1=f(right_side);
estimate=(right1+left1)/2.0;
for(i=1;i<local_count;i++){
temp=left_side+i*h;
temp=f(temp);
estimate+=temp;
}
estimate=estimate*h;
return estimate;
}


int main(int argc,char *argv[]){
int n=1024,local_n;
int rank,size;
double a=0.0,b=3.0,h;
double local_a,local_b;
double local_sum,total_sum;
int q;
h=(b-a)/n;


MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);


local_n=n/size;
local_a=a+rank*local_n*h;
local_b=local_a+local_n*h;


        local_sum=Trap(local_a,local_b,local_n,h);
if(rank!=0){
        MPI_Send(&local_sum,1,MPI_DOUBLE,0,99,MPI_COMM_WORLD);
}else{
        total_sum=local_sum;
        for(q=1;q<size;q++){
        MPI_Recv(&local_sum,1,MPI_DOUBLE,q,99,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
        total_sum+=local_sum;
}
}


if(rank==0){
        printf("with a=%f b=%f n=%d ,the total_sum=%f ",a,b,n,total_sum);
}


MPI_Finalize();

}




版本二:(可从键盘键入a,b,n,使用MPI6个基本函数)
#include<stdio.h>
#include<mpi.h>


void Get_input(int size,int rank,float* a_p,float* b_p,int* n_p){


int dest;
if(rank==0){
        printf("Please Enter a,b,n: ");
        scanf("%f%f%d",a_p,b_p,n_p);
for(dest=1;dest<size;dest++){
        MPI_Send(a_p,1,MPI_FLOAT,dest,99,MPI_COMM_WORLD);
        MPI_Send(b_p,1,MPI_FLOAT,dest,99,MPI_COMM_WORLD);
        MPI_Send(n_p,1,MPI_INT,dest,99,MPI_COMM_WORLD);
}}
else{
        MPI_Recv(a_p,1,MPI_FLOAT,0,99,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
        MPI_Recv(b_p,1,MPI_FLOAT,0,99,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
        MPI_Recv(n_p,1,MPI_INT,0,99,MPI_COMM_WORLD,MPI_STATUS_IGNORE);


}
}


float f(float x){
        return x*x;
}


float Trap(float left_side,float right_side,int local_count,float h){
int i;
float right,left;
float estimate,temp;
left=f(left_side);
right=f(right_side);
estimate=(left+right)/2.0;
for(i=1;i<local_count;i++){
temp=left_side+i*h;
temp=f(temp);
estimate+=temp;
}
estimate=estimate*h;
return estimate;
}


int main(int argc,char*argv[]){


int n,local_n;
int rank,size;
int q;
float a,b,h;
float local_a,local_b;
float local_sum,total_sum;


MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
Get_input(size,rank,&a,&b,&n);
h=(b-a)/n;
local_n=n/size;
local_a=a+rank*local_n*h;
local_b=local_a+local_n*h;
local_sum=Trap(local_a,local_b,local_n,h);
if(rank!=0){
        MPI_Send(&local_sum,1,MPI_FLOAT,0,99,MPI_COMM_WORLD);
}else{
        total_sum=local_sum;
        for(q=1;q<size;q++){
        MPI_Recv(&local_sum,1,MPI_FLOAT,q,99,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
        total_sum+=local_sum;}
}


if(rank==0){
        printf("With a=%f b=%f n=%d Total_sum=%f ",a,b,n,total_sum);
}


MPI_Finalize();


}




版本三:(使用MPI_Reduce函数)
#include<stdio.h>
#include<mpi.h>


void Get_input(int size,int rank,float* a_p,float* b_p,int* n_p ){
int dest;
if(rank==0){
        printf("Please Enter a,b,n: ");
        scanf("%f%f%d",a_p,b_p,n_p);
        for(dest=1;dest<size;dest++){
        MPI_Send(a_p,1,MPI_FLOAT,dest,99,MPI_COMM_WORLD);
        MPI_Send(b_p,1,MPI_FLOAT,dest,99,MPI_COMM_WORLD);
        MPI_Send(n_p,1,MPI_FLOAT,dest,99,MPI_COMM_WORLD);
}
}else{
        MPI_Recv(a_p,1,MPI_FLOAT,0,99,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
        MPI_Recv(b_p,1,MPI_FLOAT,0,99,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
        MPI_Recv(n_p,1,MPI_FLOAT,0,99,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
}


}


float f(float x){
        return x*x;
}


float Trap(float left_side,float right_side,int local_count,float h){
int i;
float estimate,temp;
float left,right;


left=f(left_side);
right=f(right_side);
estimate=(left+right)/2.0;


for(i=1;i<local_count;i++){
temp=left_side+i*h;
temp=f(temp);
estimate+=temp;
}
estimate=estimate*h;
return estimate;
}


int main(int argc,char *argv[]){


int n,local_n;
int size,rank;
float a,b,h;
float local_a,local_b;
float local_sum,total_sum=0.0;


MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);


Get_input(size,rank,&a,&b,&n);


h=(b-a)/n;
local_n=n/size;
local_a=a+rank*local_n*h;
local_b=local_a+local_n*h;


local_sum=Trap(local_a,local_b,local_n,h);


MPI_Reduce(&local_sum,&total_sum,1,MPI_FLOAT,MPI_SUM,0,MPI_COMM_WORLD);
if(rank==0){
        printf("With a=%f b=%f n=%d Total_sum=%f ",a,b,n,total_sum);
}
MPI_Finalize();
}


版本四:(使用MPI_Allreduce函数)
#include<stdio.h>
#include<mpi.h>


void Get_input(int size,int rank,float* a_p,float* b_p,int* n_p){
int dest;
if(rank==0){
        printf("Please Enter a,b,n: ");
        scanf("%f%f%d",a_p,b_p,n_p);
        for(dest=1;dest<size;dest++){
        MPI_Send(a_p,1,MPI_FLOAT,dest,99,MPI_COMM_WORLD);
        MPI_Send(b_p,1,MPI_FLOAT,dest,99,MPI_COMM_WORLD);
        MPI_Send(n_p,1,MPI_FLOAT,dest,99,MPI_COMM_WORLD);}
}else{
        MPI_Recv(a_p,1,MPI_FLOAT,0,99,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
        MPI_Recv(b_p,1,MPI_FLOAT,0,99,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
        MPI_Recv(n_p,1,MPI_FLOAT,0,99,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
}


}
float f(float x){
return x*x;
}


float Trap(float left_side,float right_side,int local_count,float h){
int i;
float estimate,temp;
float right,left;


left=f(left_side);
right=f(right_side);
estimate=(left+right)/2.0;


for(i=1;i<local_count;i++){
temp=left_side+i*h;
temp=f(temp);
estimate+=temp;
}
estimate*=h;
return estimate;
}


int main(int argc,char* argv[]){
int n,local_n;
int size,rank;
float a,b,h;
float local_a,local_b;
float local_sum,total_sum;


MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);


Get_input(size,rank,&a,&b,&n);
h=(b-a)/n;
local_n=n/size;
local_a=a+rank*local_n*h;
local_b=local_a+local_n*h;
local_sum=Trap(local_a,local_b,local_n,h);


MPI_Allreduce(&local_sum,&total_sum,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);


if(rank==1){
        printf("With a=%f b=%f n=%d Total_sum=%f ",a,b,n,total_sum);
}


MPI_Finalize();


}


版本:(使用MPI_Bcast函数)
#include<stdio.h>
#include<mpi.h>


void Get_input(int size,int rank,float* a_p,float* b_p,int* n_p){


if(rank==0){
        printf("Please Enter a,b,n: ");
        scanf("%f%f%d",a_p,b_p,n_p);
}
MPI_Bcast(a_p,1,MPI_FLOAT,0,MPI_COMM_WORLD);
MPI_Bcast(b_p,1,MPI_FLOAT,0,MPI_COMM_WORLD);
MPI_Bcast(n_p,1,MPI_FLOAT,0,MPI_COMM_WORLD);


}


float f(float x){
return x*x;
}


float Trap(float left_side,float right_side,int local_count,float h){


int i;
float estimate,temp;
float right,left;
float local_sum,total_sum;


right=f(right_side);
left=f(left_side);
estimate=(right+left)/2.0;
for(i=1;i<local_count;i++){
temp=left_side+i*h;
temp=f(temp);
estimate+=temp;
}
estimate*=h;
return estimate;
}


int main(int argc,char*argv[]){
int n,local_n;
int size,rank;
float a,b,h;
float local_a,local_b;
float local_sum,total_sum;


MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
Get_input(size,rank,&a,&b,&n);
h=(b-a)/n;
local_n=n/size;
local_a=a+rank*local_n*h;
local_b=local_a+local_n*h;
local_sum=Trap(local_a,local_b,local_n,h);
MPI_Allreduce(&local_sum,&total_sum,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
if(rank==1){
        printf("With a=%f b=%f n=%d Total_sum=%f ",a,b,n,total_sum);
}
MPI_Finalize();

}

版本六:(使用派生数据类型)

#include<stdio.h>
#include<mpi.h>


void Build_mpi_type(float* a_p,float* b_p,int* n_p,MPI_Datatype* input_mpi_t_p)
{
int array_of_blocklengths[3]={1,1,1};
MPI_Datatype array_of_types[3]={MPI_FLOAT,MPI_FLOAT,MPI_INT};
MPI_Aint a_addr,b_addr,n_addr;
MPI_Aint array_of_displacement[3]={0};
MPI_Get_address(a_p,&a_addr);
MPI_Get_address(b_p,&b_addr);
MPI_Get_address(n_p,&n_addr);
array_of_displacement[1]=b_addr-a_addr;
array_of_displacement[2]=n_addr-a_addr;
MPI_Type_create_struct(3,array_of_blocklengths,array_of_displacement,array_of_types,input_mpi_t_p);
MPI_Type_commit(input_mpi_t_p);
}


void Get_input(int size,int rank,float* a_p,float* b_p,int* n_p)
{
        MPI_Datatype input_mpi_t;
        Build_mpi_type(a_p,b_p,n_p,&input_mpi_t);
        if(rank==0){
printf("Please Enter a,b,n: ");
scanf("%f%f%d",a_p,b_p,n_p);
}
MPI_Bcast(a_p,1,input_mpi_t,0,MPI_COMM_WORLD);
MPI_Type_free(&input_mpi_t);
}


float f(float x){
return x*x;
}


float Trap(float left_side,float right_side,int local_count,float h){
int i;
float right,left;
float estimate,temp;


left=f(left_side);
right=f(right_side);
estimate=(left+right)/2.0;
for(i=1;i<local_count;i++){
temp=left_side+i*h;
temp=f(temp);
estimate+=temp;
}
estimate*=h;
return estimate;
}


int main(int argc,char* argv[]){
        int rank,size;
        int n,local_n;
        float a,b,h;
        float local_a,local_b;
        float local_sum,total_sum;


MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
Get_input(size,rank,&a,&b,&n);
h=(b-a)/n;
local_n=n/size;
local_a=a+rank*local_n*h;
local_b=local_a+local_n*h;
local_sum=Trap(local_a,local_b,local_n,h);
MPI_Allreduce(&local_sum,&total_sum,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD);
if(rank==1){
        printf("With a=%f b=%f n=%d Total_sum=%f ",a,b,n,total_sum);
}
MPI_Finalize();


}


待续。。。

原文地址:https://www.cnblogs.com/qysqys/p/5078709.html