MPI 高斯消元

高斯消元 解方程组的预备工作 将矩阵化为上三角

不分主从线程 每个线程负责一个方程

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
typedef struct{
	float value;
	int rank;
} MD;
int main(int argc,char *argv[]) {	
	int self,size;
	MPI_Status s;
	//equivalents
	float equs[][3]={{1,2,3},
				{2,3,4}};
	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD,&self);
	MPI_Comm_size(MPI_COMM_WORLD,&size);
	float *equivalent=(float*)malloc((size+1)*sizeof(float));
	float *recv=(float*)malloc((size+1)*sizeof(float));
	int marked=0;
	MD me,max;
	//distribute
	if(0==self) {
		for(int i=0;i<size+1;++i) {
			equivalent[i]=equs[0][i];
		}
		for(int i=1;i<size;++i) {
			MPI_Ssend(equs[i],size+1,MPI_FLOAT,i,0,MPI_COMM_WORLD);
		}
	} else {
		MPI_Recv(equivalent,size+1,MPI_FLOAT,0,0,MPI_COMM_WORLD,&s);
	}
	//pivot
	for(int i=0;i<size;++i) {
		if(0==marked) {
			me.value=equivalent[i];
		} else {
			me.value=0;
		}
		me.rank=self;
		MPI_Allreduce(&me,&max,1,MPI_FLOAT_INT,MPI_MAXLOC,MPI_COMM_WORLD);
		if(self==max.rank) {
			for(int i=0;i<size+1;++i) {
				recv[i]=equivalent[i];
			}
			marked=1;
		}
		MPI_Bcast(recv,size+1,MPI_FLOAT,max.rank,MPI_COMM_WORLD);
		if(0==marked) {
			float ratio=equivalent[i]/recv[i];
			for(int j=i;j<size+1;++j) {
				equivalent[j]-=recv[j]*ratio;
			}
		}
	}
	printf("%d %f %f %f \n",self,equivalent[0],equivalent[1],equivalent[2]);
	free(recv);
	free(equivalent);
	MPI_Finalize();
	return 0;
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值