Commit 19c1352f authored by Luca Tornatore's avatar Luca Tornatore
Browse files

updated reduce routine

parent 5f3d8132
Loading
Loading
Loading
Loading
+36 −18
Original line number Diff line number Diff line
@@ -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));
       
       reduce( isector );      // here the reduce is performed within every host 


                                  // here thre reduce is performed among hosts
       MPI_Barrier(MPI_COMM_WORLD);       
       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

       // 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,20 +398,27 @@ void write_grided_data()

}

void reduce(int sector, int max_level)

 void reduce( int sector )
 {
   for(int i = 0; i < max_level; i++)

   int max_level = 0;
   while( (1<< (++max_level) ) < Me.Ntasks[myHOST] );

   for(int l = 0; l < max_level; l++)
     {
         int threshold = 1 << (i+1);
       int threshold = 1 << (1+l);
       
       if( Me.Rank[myHOST] % threshold == 0)
         {
         	int local = Me.Rank[myHOST]+ (1<<i);
	   int target = Me.Rank[myHOST] + (1<<l);
	   for(int j = 0; j < size_of_grid; j++)
         	{
	 		*((double*)Me.swins[Me.Rank[myHOST]].ptr+sector*sizeof(gridss)+j) += *((double*)Me.swins[local].ptr+sector*sizeof(gridss)+j);
         	}  
	     *((double*)Me.swins[Me.Rank[myHOST]].ptr+sector*sizeof(gridss)+j) +=
	       *((double*)Me.swins[target].ptr+sector*sizeof(gridss)+j);
         }
   }
   
   return;
 }


+1 −1
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ void gridding();
void initialize_array();
void gridding_data();
void write_grided_data();
void reduce(int sector, int max_level);
void reduce( int );


/* fourier_transform.c */