MPI 并行解方程

基本算法 逐步缩小函数值异号的范围 最后逼近最终解

所有线程计算中地位相同 计算范围与self号相应的区段值 把x较小值做为解 只支持单个解

lx做为计算范围和终止条件 最后 由主线程显示结果

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

#define END 999999
#define CON 1
#define RES 2
//calculation values
#define OST 0.000001
#define IL 0.5
#define IH 1.5
#define THD 0.0001
float func(float x) {
	//any function
	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;//end point value
	float res=END;
	float *data=(float *)malloc(size*sizeof(float));//for gather
	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) {
			//continue calculation
		} else {
			if(0==lv) {
				//end and mark to pass low to root
				res=lx;
			} else if(0==hv) {
				//end and mark to pass high to root
				res=hx;
			} else {
				//wait for a new lx hx
			}
			lx=END;
		}
		//gather all lx
		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) {//all ends
			if(END!=res) {//send res to root
				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) {//show result
		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;
}


你可能感兴趣的:(算法,float)