@@ -4673,8 +4673,8 @@ PREFIX(get_by_ref) (caf_token_t token, int image_index,
4673
4673
size = 1 ;
4674
4674
while (riter )
4675
4675
{
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 ,
4678
4678
access_desc_through_global_win );
4679
4679
switch (riter -> type )
4680
4680
{
@@ -4996,7 +4996,7 @@ case kind: \
4996
4996
delta = riter -> u .a .dim [i ].v .nvec ;
4997
4997
#define KINDCASE (kind , type ) \
4998
4998
case kind: \
4999
- remote_memptr += \
4999
+ data_offset += \
5000
5000
((type *)riter->u.a.dim[i].v.vector)[0] * riter->item_size; \
5001
5001
break
5002
5002
@@ -5026,15 +5026,14 @@ case kind: \
5026
5026
riter -> u .a .dim [i ].s .stride ,
5027
5027
riter -> u .a .dim [i ].s .start ,
5028
5028
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 ;
5032
5032
break ;
5033
5033
case CAF_ARR_REF_SINGLE :
5034
5034
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 ;
5038
5037
break ;
5039
5038
case CAF_ARR_REF_OPEN_END :
5040
5039
/* 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)))
8491
8490
8492
8491
int ierr = MPI_Barrier (* tmp_comm ); chk_err (ierr );
8493
8492
}
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