@@ -4673,8 +4673,8 @@ PREFIX(get_by_ref) (caf_token_t token, int image_index,
46734673 size = 1 ;
46744674 while (riter )
46754675 {
4676- dprint ("caf_ref = %p, offset = %zd, remote_mem = %p, global_win(data, desc)) = (%d, %d)\n" ,
4677- riter , data_offset , remote_memptr , access_data_through_global_win ,
4676+ dprint ("caf_ref = %p, type = %d, offset = %zd, remote_mem = %p, global_win(data, desc)) = (%d, %d)\n" ,
4677+ riter , riter -> type , data_offset , remote_memptr , access_data_through_global_win ,
46784678 access_desc_through_global_win );
46794679 switch (riter -> type )
46804680 {
@@ -4996,7 +4996,7 @@ case kind: \
49964996 delta = riter -> u .a .dim [i ].v .nvec ;
49974997#define KINDCASE (kind , type ) \
49984998case kind: \
4999- remote_memptr += \
4999+ data_offset += \
50005000 ((type *)riter->u.a.dim[i].v.vector)[0] * riter->item_size; \
50015001 break
50025002
@@ -5026,15 +5026,14 @@ case kind: \
50265026 riter -> u .a .dim [i ].s .stride ,
50275027 riter -> u .a .dim [i ].s .start ,
50285028 riter -> u .a .dim [i ].s .end );
5029- remote_memptr += riter -> u .a .dim [i ].s .start
5030- * riter -> u .a .dim [i ].s .stride
5031- * riter -> item_size ;
5029+ data_offset += riter -> u .a .dim [i ].s .start
5030+ * riter -> u .a .dim [i ].s .stride
5031+ * riter -> item_size ;
50325032 break ;
50335033 case CAF_ARR_REF_SINGLE :
50345034 delta = 1 ;
5035- remote_memptr += riter -> u .a .dim [i ].s .start
5036- * riter -> u .a .dim [i ].s .stride
5037- * riter -> item_size ;
5035+ data_offset += riter -> u .a .dim [i ].s .start
5036+ * riter -> item_size ;
50385037 break ;
50395038 case CAF_ARR_REF_OPEN_END :
50405039 /* This and OPEN_START are mapped to a RANGE and therefore can
@@ -8491,3 +8490,73 @@ void PREFIX(sync_team) (caf_team_t *team , int unused __attribute__((unused)))
84918490
84928491 int ierr = MPI_Barrier (* tmp_comm ); chk_err (ierr );
84938492}
8493+
8494+ extern void _gfortran_random_seed_i4 (int32_t * size , gfc_dim1_descriptor_t * put ,
8495+ gfc_dim1_descriptor_t * get );
8496+
8497+ void PREFIX (random_init ) (bool repeatable , bool image_distinct )
8498+ {
8499+ static gfc_dim1_descriptor_t rand_seed ;
8500+ static bool rep_needs_init = true, arr_needs_init = true;
8501+ static int32_t seed_size ;
8502+
8503+ if (arr_needs_init )
8504+ {
8505+ _gfortran_random_seed_i4 (& seed_size , NULL , NULL );
8506+ memset (& rand_seed , 0 , sizeof (gfc_dim1_descriptor_t ));
8507+ rand_seed .base .base_addr = malloc (seed_size * sizeof (int32_t )); // because using seed_i4
8508+ rand_seed .base .offset = -1 ;
8509+ rand_seed .base .dtype .elem_len = sizeof (int32_t );
8510+ rand_seed .base .dtype .rank = 1 ;
8511+ rand_seed .base .dtype .type = BT_INTEGER ;
8512+ rand_seed .base .span = 0 ;
8513+ rand_seed .dim [0 ].lower_bound = 1 ;
8514+ rand_seed .dim [0 ]._ubound = seed_size ;
8515+ rand_seed .dim [0 ]._stride = 1 ;
8516+
8517+ arr_needs_init = false;
8518+ }
8519+
8520+ if (repeatable )
8521+ {
8522+ if (rep_needs_init )
8523+ {
8524+ int32_t lcg_seed = 57911963 ;
8525+ if (image_distinct )
8526+ {
8527+ lcg_seed *= caf_this_image ;
8528+ }
8529+ int32_t * curr = rand_seed .base .base_addr ;
8530+ for (int i = 0 ; i < seed_size ; ++ i )
8531+ {
8532+ const int32_t a = 16087 ;
8533+ const int32_t m = INT32_MAX ;
8534+ const int32_t q = 127773 ;
8535+ const int32_t r = 2836 ;
8536+ lcg_seed = a * (lcg_seed % q ) - r * (lcg_seed / q );
8537+ if (lcg_seed <= 0 ) lcg_seed += m ;
8538+ * curr = lcg_seed ;
8539+ ++ curr ;
8540+ }
8541+ rep_needs_init = false;
8542+ }
8543+ _gfortran_random_seed_i4 (NULL , & rand_seed , NULL );
8544+ }
8545+ else if (image_distinct )
8546+ {
8547+ _gfortran_random_seed_i4 (NULL , NULL , NULL );
8548+ }
8549+ else
8550+ {
8551+ if (caf_this_image == 0 )
8552+ {
8553+ _gfortran_random_seed_i4 (NULL , NULL , & rand_seed );
8554+ MPI_Bcast (rand_seed .base .base_addr , seed_size , MPI_INT32_T , 0 , CAF_COMM_WORLD );
8555+ }
8556+ else
8557+ {
8558+ MPI_Bcast (rand_seed .base .base_addr , seed_size , MPI_INT32_T , 0 , CAF_COMM_WORLD );
8559+ _gfortran_random_seed_i4 (NULL , & rand_seed , NULL );
8560+ }
8561+ }
8562+ }
0 commit comments