From b1daf9884290140180ad9aaefc83478bcd0bdefe Mon Sep 17 00:00:00 2001 From: nandhanas Date: Mon, 21 Mar 2022 12:20:49 +0100 Subject: [PATCH] NUMA awarness --- gridding.c | 47 +++++++++++++++++++++++++++++++++++++++++------ init.c | 3 +++ proto.h | 2 ++ 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/gridding.c b/gridding.c index de4cc6e..1e34d60 100644 --- a/gridding.c +++ b/gridding.c @@ -91,7 +91,7 @@ void initialize_array(){ void gridding_data(){ double shift = (double)(dx*yaxis); - + // Open the MPI Memory Window for the slab #ifdef USE_MPI MPI_Win_create(grid, size_of_grid*sizeof(double), sizeof(double), MPI_INFO_NULL, MPI_COMM_WORLD, &slabwin); @@ -248,11 +248,16 @@ void gridding_data(){ #ifdef ONE_SIDE printf("One Side communication active\n"); - memcpy(Me.win.ptr, gridss, size_of_grid); - 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); - //MPI_Put(gridss,size_of_grid,MPI_DOUBLE,target_rank,0,size_of_grid,MPI_DOUBLE,slabwin); + // 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); + 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.MAXl > myHOST) && (Me.Rank[HOSTS] != -1)) + MPI_Reduce(grid,grid,size_of_grid,MPI_DOUBLE,MPI_SUM,target_rank,*Me.COMM[HOSTS]); + //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); #endif //ONE_SIDE @@ -378,3 +383,33 @@ void write_grided_data() #endif //WRITE_DATA } + +void reduce(int target, int sector, int begin, int end) +{ + 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); +} + + +void accumulate(int target, int sector, int begin, int mid, int end) +{ + + for(int i =mid; i