Commit b1daf988 authored by Nandhana Sakhtivel's avatar Nandhana Sakhtivel
Browse files

NUMA awarness

parent 624fdbdb
Loading
Loading
Loading
Loading
+41 −6
Original line number Diff line number Diff line
@@ -248,10 +248,15 @@ 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_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);
@@ -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<end; i++)
    {
        if(i != target)
        {
             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);
             }
        }
     }
    //if(rank == target_rank)
    //   memcpy(grid, Me.swins[target_rank].ptr+isector*sizeof(gridss), sizeof(grid));    

}
+3 −0
Original line number Diff line number Diff line
@@ -32,6 +32,9 @@ void init(int index)

   #ifdef USE_MPI
   	init_numa( rank, size, &MYMPI_COMM_WORLD, &Me );

        if(rank == 0)
    	    printf("\nTask %d sees %d topology levels\n", rank, Me.MAXl);
   #endif

   clock_gettime(CLOCK_MONOTONIC, &begin);
+2 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ 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);


/* fourier_transform.c */