Loading gridding.c +36 −18 Original line number Diff line number Diff line Loading @@ -252,14 +252,25 @@ void gridding_data(){ // MPI_Win_lock(MPI_LOCK_SHARED,target_rank,0,slabwin); // MPI_Accumulate(gridss,size_of_grid,MPI_DOUBLE,target_rank,0,size_of_grid,MPI_DOUBLE,MPI_SUM,slabwin); // MPI_Win_unlock(target_rank,slabwin); // that can be avoided if shared window coincides with gridss memcpy(Me.win.ptr+isector*sizeof(gridss), gridss, sizeof(gridss)); reduce( isector ); // here the reduce is performed within every host // here thre reduce is performed among hosts MPI_Barrier(MPI_COMM_WORLD); if(Me.Rank[myHOST] == 0) reduce(isector, 1<<(++Me.Ntasks[myHOST])); if((Me.MAXl > myHOST) && (Me.Rank[HOSTS] != -1)) MPI_Reduce(grid, grid, size_of_grid, MPI_DOUBLE,MPI_SUM,target_rank,*Me.COMM[HOSTS]); else // that can be avoided if shared window coincides with gridss memcpy(grid, Me.swins[Me.Rank[myHOST]].ptr+isector*sizeof(gridss), sizeof(grid)); //MPI_Put(gridss,size_of_grid,MPI_DOUBLE,target_rank,0,size_of_grid,MPI_DOUBLE,slabwin); #else MPI_Reduce(gridss,grid,size_of_grid,MPI_DOUBLE,MPI_SUM,target_rank,MPI_COMM_WORLD); Loading Loading @@ -387,20 +398,27 @@ void write_grided_data() } void reduce(int sector, int max_level) void reduce( int sector ) { for(int i = 0; i < max_level; i++) int max_level = 0; while( (1<< (++max_level) ) < Me.Ntasks[myHOST] ); for(int l = 0; l < max_level; l++) { int threshold = 1 << (i+1); int threshold = 1 << (1+l); if( Me.Rank[myHOST] % threshold == 0) { int local = Me.Rank[myHOST]+ (1<<i); int target = Me.Rank[myHOST] + (1<<l); for(int j = 0; j < size_of_grid; j++) { *((double*)Me.swins[Me.Rank[myHOST]].ptr+sector*sizeof(gridss)+j) += *((double*)Me.swins[local].ptr+sector*sizeof(gridss)+j); } *((double*)Me.swins[Me.Rank[myHOST]].ptr+sector*sizeof(gridss)+j) += *((double*)Me.swins[target].ptr+sector*sizeof(gridss)+j); } } return; } Loading proto.h +1 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ void gridding(); void initialize_array(); void gridding_data(); void write_grided_data(); void reduce(int sector, int max_level); void reduce( int ); /* fourier_transform.c */ Loading Loading
gridding.c +36 −18 Original line number Diff line number Diff line Loading @@ -252,14 +252,25 @@ void gridding_data(){ // MPI_Win_lock(MPI_LOCK_SHARED,target_rank,0,slabwin); // MPI_Accumulate(gridss,size_of_grid,MPI_DOUBLE,target_rank,0,size_of_grid,MPI_DOUBLE,MPI_SUM,slabwin); // MPI_Win_unlock(target_rank,slabwin); // that can be avoided if shared window coincides with gridss memcpy(Me.win.ptr+isector*sizeof(gridss), gridss, sizeof(gridss)); reduce( isector ); // here the reduce is performed within every host // here thre reduce is performed among hosts MPI_Barrier(MPI_COMM_WORLD); if(Me.Rank[myHOST] == 0) reduce(isector, 1<<(++Me.Ntasks[myHOST])); if((Me.MAXl > myHOST) && (Me.Rank[HOSTS] != -1)) MPI_Reduce(grid, grid, size_of_grid, MPI_DOUBLE,MPI_SUM,target_rank,*Me.COMM[HOSTS]); else // that can be avoided if shared window coincides with gridss memcpy(grid, Me.swins[Me.Rank[myHOST]].ptr+isector*sizeof(gridss), sizeof(grid)); //MPI_Put(gridss,size_of_grid,MPI_DOUBLE,target_rank,0,size_of_grid,MPI_DOUBLE,slabwin); #else MPI_Reduce(gridss,grid,size_of_grid,MPI_DOUBLE,MPI_SUM,target_rank,MPI_COMM_WORLD); Loading Loading @@ -387,20 +398,27 @@ void write_grided_data() } void reduce(int sector, int max_level) void reduce( int sector ) { for(int i = 0; i < max_level; i++) int max_level = 0; while( (1<< (++max_level) ) < Me.Ntasks[myHOST] ); for(int l = 0; l < max_level; l++) { int threshold = 1 << (i+1); int threshold = 1 << (1+l); if( Me.Rank[myHOST] % threshold == 0) { int local = Me.Rank[myHOST]+ (1<<i); int target = Me.Rank[myHOST] + (1<<l); for(int j = 0; j < size_of_grid; j++) { *((double*)Me.swins[Me.Rank[myHOST]].ptr+sector*sizeof(gridss)+j) += *((double*)Me.swins[local].ptr+sector*sizeof(gridss)+j); } *((double*)Me.swins[Me.Rank[myHOST]].ptr+sector*sizeof(gridss)+j) += *((double*)Me.swins[target].ptr+sector*sizeof(gridss)+j); } } return; } Loading
proto.h +1 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ void gridding(); void initialize_array(); void gridding_data(); void write_grided_data(); void reduce(int sector, int max_level); void reduce( int ); /* fourier_transform.c */ Loading