#include #include int main(int argc,char *argv[]) { int size,rank; int s; int cnt = 1; int local_val[8] = {2,3,5,3,3,2,5,8}; int l_val,t_val=0; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); l_val = local_val[rank]; MPI_Barrier(MPI_COMM_WORLD); s = size; while(s>0) { // printf("%d %d\n",rank,s); if((rank+cnt) < size) { MPI_Send(&l_val,1,MPI_INT,rank+cnt,0,MPI_COMM_WORLD); } if((rank-cnt)>=0) { MPI_Recv(&t_val,1,MPI_INT,rank-cnt,0,MPI_COMM_WORLD,&status); } MPI_Barrier(MPI_COMM_WORLD); l_val = l_val + t_val; t_val = 0; MPI_Barrier(MPI_COMM_WORLD); cnt = cnt*2; s = s/2; } // printf("Out of the loop %d\n",rank); printf("%d %d\n",rank,l_val); MPI_Finalize(); return 0; }