diff --git a/gridding.c b/gridding.c index 76d1e88bd80255e5fc16b495458c51d0512dc14c..170e69344d4f5ade108218e5ae0a08299263b1cb 100644 --- a/gridding.c +++ b/gridding.c @@ -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)); - MPI_Barrier(MPI_COMM_WORLD); - if(Me.Rank[myHOST] == 0) - reduce(isector, 1<<(++Me.Ntasks[myHOST])); + + reduce( isector ); // here the reduce is performed within every host + + + // here thre reduce is performed among hosts + MPI_Barrier(MPI_COMM_WORLD); 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 - memcpy(grid, Me.swins[Me.Rank[myHOST]].ptr+isector*sizeof(gridss), sizeof(grid)); + + MPI_Reduce(grid, grid, size_of_grid, MPI_DOUBLE,MPI_SUM,target_rank,*Me.COMM[HOSTS]); + + // 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); @@ -387,21 +398,28 @@ void write_grided_data() } -void reduce(int sector, int max_level) -{ - for(int i = 0; i < max_level; i++) - { - int threshold = 1 << (i+1); - if( Me.Rank[myHOST] % threshold == 0) + + void reduce( int sector ) + { + + int max_level = 0; + while( (1<< (++max_level) ) < Me.Ntasks[myHOST] ); + + for(int l = 0; l < max_level; l++) + { + int threshold = 1 << (1+l); + + if( Me.Rank[myHOST] % threshold == 0) { - int local = Me.Rank[myHOST]+ (1<