From 19c1352fa9456ebf41efd5c31be6323558c3f662 Mon Sep 17 00:00:00 2001 From: Luca Tornatore Date: Wed, 30 Mar 2022 14:48:37 +0200 Subject: [PATCH] updated reduce routine --- gridding.c | 54 ++++++++++++++++++++++++++++++++++++------------------ proto.h | 2 +- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/gridding.c b/gridding.c index 76d1e88..170e693 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<