diff --git a/allvars.h b/allvars.h index 7610de5555887b11c955280e10ca783e073ae6ef..2f66fc12b14ddf063a573cbf284f6aab6f4bc02b 100644 --- a/allvars.h +++ b/allvars.h @@ -30,8 +30,6 @@ #include "numa.h" -#include "numa.h" - extern struct io { FILE * pFile; diff --git a/gridding.c b/gridding.c index 1e34d604495b9398fe3e00d1af214e39353128b8..76d1e88bd80255e5fc16b495458c51d0512dc14c 100644 --- a/gridding.c +++ b/gridding.c @@ -1,4 +1,5 @@ #include +#include #include "allvars.h" #include "proto.h" @@ -253,10 +254,12 @@ void gridding_data(){ // MPI_Win_unlock(target_rank,slabwin); memcpy(Me.win.ptr+isector*sizeof(gridss), gridss, sizeof(gridss)); MPI_Barrier(MPI_COMM_WORLD); - printf("rank %d\n", rank); - reduce(target_rank, isector, 0, size-1); + 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]); + MPI_Reduce(grid,grid,size_of_grid,MPI_DOUBLE,MPI_SUM,target_rank,*Me.COMM[HOSTS]); + else + 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); @@ -384,32 +387,21 @@ void write_grided_data() } -void reduce(int target, int sector, int begin, int end) +void reduce(int sector, int max_level) { - if(begin >= end) - return; - int mid = (begin+end)/2; - reduce(target, sector, begin, mid); - reduce(target, sector, mid+1, end); - accumulate(target, sector, begin, mid, end); + for(int i = 0; i < max_level; i++) + { + int threshold = 1 << (i+1); + if( Me.Rank[myHOST] % threshold == 0) + { + int local = Me.Rank[myHOST]+ (1<