Loading allvars.h +0 −2 Original line number Diff line number Diff line Loading @@ -30,8 +30,6 @@ #include "numa.h" #include "numa.h" extern struct io { FILE * pFile; Loading gridding.c +19 −27 Original line number Diff line number Diff line #include <stdio.h> #include <math.h> #include "allvars.h" #include "proto.h" Loading Loading @@ -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]); 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); Loading Loading @@ -384,32 +387,21 @@ void write_grided_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) void reduce(int sector, int max_level) { for(int i =mid; i<end; i++) for(int i = 0; i < max_level; i++) { if(i != target) int threshold = 1 << (i+1); if( Me.Rank[myHOST] % threshold == 0) { int local = Me.Rank[myHOST]+ (1<<i); for(int j=0; j<size_of_grid; j++) { *((double*)Me.swins[target].ptr+sector*sizeof(gridss)+j) += *((double*)Me.swins[i].ptr+sector*sizeof(gridss)+j); //printf("value = %lf, rank = %d\n", *((double*)Me.swins[target].ptr+isector*sizeof(gridss)+j), rank); *((double*)Me.swins[Me.Rank[myHOST]].ptr+sector*sizeof(gridss)+j) += *((double*)Me.swins[local].ptr+sector*sizeof(gridss)+j); } } } //if(rank == target_rank) // memcpy(grid, Me.swins[target_rank].ptr+isector*sizeof(gridss), sizeof(grid)); } proto.h +1 −2 Original line number Diff line number Diff line Loading @@ -23,8 +23,7 @@ void gridding(); void initialize_array(); void gridding_data(); void write_grided_data(); void reduce(int target, int sector, int begin, int end); void accumulate(int target, int sector, int begin, int mid, int end); void reduce(int sector, int max_level); /* fourier_transform.c */ Loading Loading
allvars.h +0 −2 Original line number Diff line number Diff line Loading @@ -30,8 +30,6 @@ #include "numa.h" #include "numa.h" extern struct io { FILE * pFile; Loading
gridding.c +19 −27 Original line number Diff line number Diff line #include <stdio.h> #include <math.h> #include "allvars.h" #include "proto.h" Loading Loading @@ -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]); 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); Loading Loading @@ -384,32 +387,21 @@ void write_grided_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) void reduce(int sector, int max_level) { for(int i =mid; i<end; i++) for(int i = 0; i < max_level; i++) { if(i != target) int threshold = 1 << (i+1); if( Me.Rank[myHOST] % threshold == 0) { int local = Me.Rank[myHOST]+ (1<<i); for(int j=0; j<size_of_grid; j++) { *((double*)Me.swins[target].ptr+sector*sizeof(gridss)+j) += *((double*)Me.swins[i].ptr+sector*sizeof(gridss)+j); //printf("value = %lf, rank = %d\n", *((double*)Me.swins[target].ptr+isector*sizeof(gridss)+j), rank); *((double*)Me.swins[Me.Rank[myHOST]].ptr+sector*sizeof(gridss)+j) += *((double*)Me.swins[local].ptr+sector*sizeof(gridss)+j); } } } //if(rank == target_rank) // memcpy(grid, Me.swins[target_rank].ptr+isector*sizeof(gridss), sizeof(grid)); }
proto.h +1 −2 Original line number Diff line number Diff line Loading @@ -23,8 +23,7 @@ void gridding(); void initialize_array(); void gridding_data(); void write_grided_data(); void reduce(int target, int sector, int begin, int end); void accumulate(int target, int sector, int begin, int mid, int end); void reduce(int sector, int max_level); /* fourier_transform.c */ Loading