MPI 并行解方程
基本算法 逐步缩小函数值异号的范围 最后逼近最终解
所有线程计算中地位相同 计算范围与self号相应的区段值 把x较小值做为解 只支持单个解
lx做为计算范围和终止条件 最后 由主线程显示结果
-
- #include "mpi.h"
- #include <stdio.h>
#include <stdlib.h>
#define END 999999
#define CON 1
#define RES 2
#define OST 0.000001
#define IL 0.5
#define IH 1.5
#define THD 0.0001
float func(float x) {
return (x*x-1);
}
int main(int argc,char *argv[]) {
int self,size;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&self);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Request r;
MPI_Status s;
float lx=IL,hx=IH;
float res=END;
float *data=(float *)malloc(size*sizeof(float));
while(((hx-lx)/size>THD)&&(END!=lx)) {
res=END;
float step=(hx-lx)/size;
lx=lx+step*(self);
hx=lx+step-OST;
float lv=func(lx);
float hv=func(hx);
if(lv*hv<0) {
} else {
if(0==lv) {
res=lx;
} else if(0==hv) {
res=hx;
} else {
}
lx=END;
}
MPI_Allgather(&lx,1,MPI_FLOAT,data,1,MPI_FLOAT,MPI_COMM_WORLD);
int prc=END;
for(int i=0;i<size;++i) {
if(END!=data[i]) {
prc=i;
lx=data[i];
}
}
if(END==prc) {
if(END!=res) {
MPI_Ssend(&res,1,MPI_FLOAT,0,0,MPI_COMM_WORLD);
}
} else {
MPI_Bcast(&hx,1,MPI_FLOAT,prc,MPI_COMM_WORLD);
}
}
if(0==self) {
if(END==lx) {
MPI_Recv(&lx,1,MPI_FLOAT,MPI_ANY_SOURCE,0,MPI_COMM_WORLD,&s);
for(int i=0;i<size;++i) {
if(END!=data[i]) {
lx=data[i];
}
}
} else {
lx=(hx+lx)/2;
}
printf("result %f \n",lx);
}
free(data);
MPI_Finalize();
return 0;
}
评论暂时关闭