C   44

remote memory access rma 1 c

Guest on 1st August 2022 12:39:22 AM

  1.  
  2.                       /*                      */
  3.                       /* MPI-2                */
  4.                       /*                      */
  5.                       /* Remote Memory Access */
  6.                       /*                      */
  7.                       /* Example of MPI_Get() */
  8.                       /*                      */
  9.  
  10.                                         /* Michel Vallieres  */
  11.  
  12. #include <mpi.h>
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <math.h>
  16. #include <string.h>
  17.  
  18. #define  WINDOW_SIZE 1000
  19.  
  20.  
  21. int main( int argc, char *argv[] )
  22. {
  23.   int  myid, world_size;
  24.   char info_data[200];
  25.   char window_buffer[WINDOW_SIZE];
  26.   MPI_Aint size;
  27.   int disp_unit;
  28.   MPI_Info info;
  29.   MPI_Win window;
  30.   int target_disp, target_rank;
  31.  
  32.                                 /* join the MPI virtual machine */
  33.   MPI_Init(&argc, &argv);
  34.   MPI_Comm_rank(MPI_COMM_WORLD, &myid);
  35.   MPI_Comm_size(MPI_COMM_WORLD, &world_size);
  36.  
  37.                                 /* echo some info data */
  38.   strcpy(info_data, "Code ");
  39.   sprintf( info_data + strlen(info_data), " -- myid %d out of %d -- host: ",
  40.                         myid, world_size );
  41.   gethostname(info_data + strlen(info_data), 100);
  42.   sprintf( info_data + strlen(info_data), "\n" );
  43.   fprintf( stderr, "%s",  info_data );
  44.  
  45.                                /* load info data in shared buffer */
  46.                                /* window_buffer[] will form the   */
  47.                                /* basis for the RMA memory window */
  48.   strcpy( window_buffer, "<<<<<<<<<>>>>>>>>>\n" );
  49.   if ( myid != 0 )
  50.     strcpy( window_buffer, info_data );
  51.  
  52.                                /* create an MPI memory window   */
  53.                                /* for Remote Memory Access      */
  54.   disp_unit = sizeof( char );
  55.   size = WINDOW_SIZE * disp_unit;
  56.   MPI_Win_create( window_buffer, size, disp_unit, info,
  57.                      MPI_COMM_WORLD, &window );
  58.  
  59.  
  60.                                /* scan over codes */
  61.   for ( target_rank=1 ; target_rank<world_size ; target_rank++ )
  62.     {
  63.                                /* open RMA epoch during       */
  64.                                /* which RMA access occurs     */
  65.                                /* called by all nodes because */
  66.                                /* of required synchronization */
  67.                                /* between nodes               */
  68.       MPI_Win_fence( 0, window );
  69.  
  70.                                /* process 0 "gets" info from */
  71.                                /* target_rank process        */
  72.                                /* only called by process 0   */
  73.       if ( myid == 0 )
  74.         {
  75.            target_disp = 0;
  76.            MPI_Get( window_buffer, WINDOW_SIZE, MPI_CHAR, target_rank,
  77.                   target_disp, WINDOW_SIZE, MPI_CHAR, window );
  78.         }
  79.                                /* close RMA epoch           */
  80.                                /* blocking call             */
  81.                                /* data transfered once back */
  82.       MPI_Win_fence( 0, window );
  83.  
  84.                                /* echo info from process 0 */
  85.       if ( myid == 0 )
  86.           fprintf( stderr, "Process 0 rreceived from target rank %d \n%s",
  87.                     target_rank, window_buffer  );
  88.     }
  89.  
  90.                                /* free window buffer */
  91.   MPI_Win_free( &window );
  92.                                /* done */
  93.   MPI_Finalize();
  94.   exit(0);
  95. }

Raw Paste


Login or Register to edit or fork this paste. It's free.