//http://blog.csdn.net/pouloghost/article/details/7913342
//oct 9 2016
//jaccobi
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
//broadcast x
void bcastx(float *xs,int size) {
for(int i=0;i<size;++i) {
MPI_Bcast(&xs[i],1,MPI_FLOAT,i,MPI_COMM_WORLD);
}
}
//while condition
static inline int condition(int send) {
int recv=0;
MPI_Allreduce(&send,&recv,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD);
return recv;
}
int main(int argc,char *argv[]) {
float equs[][3]={{2,1,3},
{3,2,4}};
//threshold
float thd=0.1;
int self,size;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&self);
MPI_Comm_size(MPI_COMM_WORLD,&size);
//store every x
float *xs=(float*)malloc(size*sizeof(float));
float nx;
//init
for(int i=0;i<size;++i) {
xs[i]=0;
}
int con=1;
while(0!=condition(con)) {
nx=equs[self][size];
//calculate only use the correspond equivalent
for(int i=0;i<size;++i) {
if(self!=i) {
nx-=equs[self][i]*xs[i];
}
}
nx/=equs[self][self];
//get the positive different
float diff=nx-xs[self];
if(diff<0) {
diff*=-1;
}
//update local x
xs[self]=nx;
//loop condition
con=diff>thd?1:0;
//update all xs
bcastx(xs,size);
}
printf("%d,%f \n",self,nx);
free(xs);
MPI_Finalize();
return 0;
}
matrix6
最新推荐文章于 2022-03-17 18:20:40 发布