@@ -427,6 +427,9 @@ double (*double_by_value)(double, double);
427427#define GFC_DESCRIPTOR_EXTENT (desc , i ) \
428428 ((desc)->dim[i]._ubound + 1 - (desc)->dim[i].lower_bound)
429429
430+ #define sizeof_desc_for_rank (rank ) \
431+ (sizeof(gfc_descriptor_t) + (rank) * sizeof(descriptor_dimension))
432+
430433#define MIN (X , Y ) (((X) < (Y)) ? (X) : (Y))
431434
432435#if defined(NONBLOCKING_PUT ) && !defined(CAF_MPI_LOCK_UNLOCK )
@@ -583,6 +586,21 @@ dump_mem(const char *pre, void *m, const size_t s)
583586#define dump_mem (pre , m , s ) ;
584587#endif
585588
589+ size_t
590+ compute_arr_data_size_sz (const gfc_descriptor_t * desc , size_t sz )
591+ {
592+ for (int i = 0 ; i < GFC_DESCRIPTOR_RANK (desc ); ++ i )
593+ sz *= GFC_DESCRIPTOR_EXTENT (desc , i );
594+
595+ return sz ;
596+ }
597+
598+ size_t
599+ compute_arr_data_size (const gfc_descriptor_t * desc )
600+ {
601+ return compute_arr_data_size_sz (desc , desc -> span );
602+ }
603+
586604size_t
587605handle_getting (ct_msg_t * msg , int cb_image , void * baseptr , void * dst_ptr ,
588606 void * * buffer , int32_t * free_buffer , void * dbase )
@@ -596,9 +614,8 @@ handle_getting(ct_msg_t *msg, int cb_image, void *baseptr, void *dst_ptr,
596614 {
597615 ((gfc_descriptor_t * )dbase )-> base_addr = baseptr ;
598616 src_ptr = dbase ;
599- dbase += sizeof (gfc_descriptor_t )
600- + GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )src_ptr )
601- * sizeof (descriptor_dimension );
617+ dbase += sizeof_desc_for_rank (
618+ GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )src_ptr ));
602619 dprint ("ct: src_desc base: %p, rank: %d, offset: %zd.\n" ,
603620 ((gfc_descriptor_t * )src_ptr )-> base_addr ,
604621 GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )src_ptr ),
@@ -656,10 +673,8 @@ handle_getting(ct_msg_t *msg, int cb_image, void *baseptr, void *dst_ptr,
656673 }
657674 if (msg -> flags & CT_INCLUDE_DESCRIPTOR )
658675 {
659- const size_t desc_size
660- = sizeof (gfc_descriptor_t )
661- + GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )dst_ptr )
662- * sizeof (descriptor_dimension );
676+ const size_t desc_size = sizeof_desc_for_rank (
677+ GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )dst_ptr ));
663678 void * tbuff = malloc (desc_size + send_size );
664679 dprint ("ct: Including dst descriptor: %p, sizeof(desc): %zd, rank: "
665680 "%d, sizeof(buffer): %zd, incoming free_buffer: %b.\n" ,
@@ -704,9 +719,9 @@ handle_get_message(ct_msg_t *msg, void *baseptr)
704719 {
705720 buffer = msg -> data ;
706721 ((gfc_descriptor_t * )buffer )-> base_addr = NULL ;
707- get_data = msg -> data + sizeof ( gfc_descriptor_t )
708- + GFC_DESCRIPTOR_RANK (( gfc_descriptor_t * ) buffer )
709- * sizeof ( descriptor_dimension );
722+ get_data = msg -> data
723+ + sizeof_desc_for_rank (
724+ GFC_DESCRIPTOR_RANK (( gfc_descriptor_t * ) buffer ) );
710725 /* The destination is a descriptor which address is not mutable. */
711726 dst_ptr = buffer ;
712727 }
@@ -748,9 +763,8 @@ handle_is_present_message(ct_msg_t *msg, void *baseptr)
748763 {
749764 ((gfc_descriptor_t * )add_data )-> base_addr = baseptr ;
750765 ptr = add_data ;
751- add_data += sizeof (gfc_descriptor_t )
752- + GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )ptr )
753- * sizeof (descriptor_dimension );
766+ add_data
767+ += sizeof_desc_for_rank (GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )ptr ));
754768 }
755769 else
756770 ptr = baseptr ;
@@ -778,9 +792,8 @@ handle_send_message(ct_msg_t *msg, void *baseptr)
778792 {
779793 src_ptr = add_data ;
780794 ((gfc_descriptor_t * )add_data )-> base_addr = buffer ;
781- add_data += sizeof (gfc_descriptor_t )
782- + GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )src_ptr )
783- * sizeof (descriptor_dimension );
795+ add_data += sizeof_desc_for_rank (
796+ GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )src_ptr ));
784797 dprint ("ct: src_desc base: %p, rank: %d, offset: %td.\n" ,
785798 ((gfc_descriptor_t * )src_ptr )-> base_addr ,
786799 GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )src_ptr ),
@@ -803,9 +816,8 @@ handle_send_message(ct_msg_t *msg, void *baseptr)
803816 {
804817 ((gfc_descriptor_t * )add_data )-> base_addr = baseptr ;
805818 dst_ptr = add_data ;
806- add_data += sizeof (gfc_descriptor_t )
807- + GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )dst_ptr )
808- * sizeof (descriptor_dimension );
819+ add_data += sizeof_desc_for_rank (
820+ GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )dst_ptr ));
809821 dprint ("ct: dst_desc base: %p, rank: %d, offset: %zd.\n" ,
810822 ((gfc_descriptor_t * )dst_ptr )-> base_addr ,
811823 GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )dst_ptr ),
@@ -890,14 +902,12 @@ handle_transfer_message(ct_msg_t *msg, void *baseptr)
890902 {
891903 const gfc_descriptor_t * d = (gfc_descriptor_t * )buffer ;
892904 const int rank = GFC_DESCRIPTOR_RANK (d );
893- size_t desc_size , sz = d -> span ;
894- for (int i = 0 ; i < rank ; ++ i )
895- sz *= GFC_DESCRIPTOR_EXTENT (d , i );
905+ const size_t desc_size = sizeof_desc_for_rank (rank ),
906+ sz = compute_arr_data_size (d );
896907 /* Add the data first. */
897908 send_msg -> transfer_size = sz ;
898909 memcpy (send_msg -> data , ((gfc_descriptor_t * )buffer )-> base_addr , sz );
899910 offset += sz ;
900- desc_size = sizeof (gfc_descriptor_t ) + rank * sizeof (descriptor_dimension );
901911 memcpy (send_msg -> data + offset , buffer , desc_size );
902912 offset += desc_size ;
903913 }
@@ -4795,9 +4805,6 @@ get_data(void *ds, mpi_caf_token_t *token, MPI_Aint offset, int dst_type,
47954805 num = (abs_stride > 1) ? (1 + (num - 1) / abs_stride) : num; \
47964806 } while (0)
47974807
4798- #define sizeof_desc_for_rank (rank ) \
4799- (sizeof(gfc_descriptor_t) + (rank) * sizeof(descriptor_dimension))
4800-
48014808typedef struct gfc_dim1_descriptor_t
48024809{
48034810 gfc_descriptor_t base ;
@@ -5454,14 +5461,11 @@ PREFIX(get_from_remote)(caf_token_t token, const gfc_descriptor_t *opt_src_desc,
54545461 has_src_desc = opt_src_desc ,
54555462 external_call = * TOKEN (token ) != MPI_WIN_NULL ;
54565463 const size_t dst_desc_size
5457- = opt_dst_desc ? sizeof (gfc_descriptor_t )
5458- + GFC_DESCRIPTOR_RANK (opt_dst_desc )
5459- * sizeof (descriptor_dimension )
5464+ = opt_dst_desc ? sizeof_desc_for_rank (GFC_DESCRIPTOR_RANK (opt_dst_desc ))
5465+ : 0 ,
5466+ src_desc_size
5467+ = has_src_desc ? sizeof_desc_for_rank (GFC_DESCRIPTOR_RANK (opt_src_desc ))
54605468 : 0 ,
5461- src_desc_size = has_src_desc ? sizeof (gfc_descriptor_t )
5462- + GFC_DESCRIPTOR_RANK (opt_src_desc )
5463- * sizeof (descriptor_dimension )
5464- : 0 ,
54655469 msg_size
54665470 = sizeof (ct_msg_t ) + dst_desc_size + src_desc_size + get_data_size ;
54675471 struct running_accesses_t * rat ;
@@ -5594,10 +5598,8 @@ PREFIX(get_from_remote)(caf_token_t token, const gfc_descriptor_t *opt_src_desc,
55945598 * opt_dst_charlen = cnt / dst_size ;
55955599 if (dst_incl_desc )
55965600 {
5597- const size_t desc_size
5598- = sizeof (gfc_descriptor_t )
5599- + GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )(* dst_data ))
5600- * sizeof (descriptor_dimension );
5601+ const size_t desc_size = sizeof_desc_for_rank (
5602+ GFC_DESCRIPTOR_RANK ((gfc_descriptor_t * )(* dst_data )));
56015603 dprint ("refitting dst descriptor of size %zd at %p with data %zd at %p "
56025604 "from %d bytes transfered.\n" ,
56035605 desc_size , opt_dst_desc , cnt - desc_size , * dst_data , cnt );
@@ -5766,14 +5768,11 @@ PREFIX(send_to_remote)(caf_token_t token, gfc_descriptor_t *opt_dst_desc,
57665768 const bool dst_incl_desc = opt_dst_desc , has_src_desc = opt_src_desc ,
57675769 external_call = * TOKEN (token ) != MPI_WIN_NULL ;
57685770 const size_t dst_desc_size
5769- = opt_dst_desc ? sizeof (gfc_descriptor_t )
5770- + GFC_DESCRIPTOR_RANK (opt_dst_desc )
5771- * sizeof (descriptor_dimension )
5771+ = opt_dst_desc ? sizeof_desc_for_rank (GFC_DESCRIPTOR_RANK (opt_dst_desc ))
57725772 : 0 ,
5773- src_desc_size = has_src_desc ? sizeof (gfc_descriptor_t )
5774- + GFC_DESCRIPTOR_RANK (opt_src_desc )
5775- * sizeof (descriptor_dimension )
5776- : 0 ;
5773+ src_desc_size
5774+ = has_src_desc ? sizeof_desc_for_rank (GFC_DESCRIPTOR_RANK (opt_src_desc ))
5775+ : 0 ;
57775776 size_t src_size
57785777 = opt_src_charlen ? in_src_size * * opt_src_charlen : in_src_size ,
57795778 msg_size = sizeof (ct_msg_t ) + src_size + dst_desc_size + src_desc_size
@@ -5810,10 +5809,8 @@ PREFIX(send_to_remote)(caf_token_t token, gfc_descriptor_t *opt_dst_desc,
58105809 check_image_health (remote_image , stat );
58115810 if (opt_src_charlen && opt_src_desc )
58125811 {
5813- size_t sz = 1 ;
5812+ const size_t sz = compute_arr_data_size_sz ( opt_src_desc , 1 ) ;
58145813 msg_size -= src_size ;
5815- for (int i = 0 ; i < GFC_DESCRIPTOR_RANK (opt_src_desc ); ++ i )
5816- sz *= GFC_DESCRIPTOR_EXTENT (opt_src_desc , i );
58175814 src_size *= sz ;
58185815 msg_size += src_size ;
58195816 }
@@ -5952,14 +5949,11 @@ PREFIX(transfer_between_remotes)(
59525949 struct transfer_msg_data_t * tmd ;
59535950 const bool has_src_desc = opt_src_desc ;
59545951 const size_t dst_desc_size
5955- = opt_dst_desc ? sizeof (gfc_descriptor_t )
5956- + GFC_DESCRIPTOR_RANK (opt_dst_desc )
5957- * sizeof (descriptor_dimension )
5952+ = opt_dst_desc ? sizeof_desc_for_rank (GFC_DESCRIPTOR_RANK (opt_dst_desc ))
59585953 : 0 ,
5959- src_desc_size = has_src_desc ? sizeof (gfc_descriptor_t )
5960- + GFC_DESCRIPTOR_RANK (opt_src_desc )
5961- * sizeof (descriptor_dimension )
5962- : 0 ;
5954+ src_desc_size
5955+ = has_src_desc ? sizeof_desc_for_rank (GFC_DESCRIPTOR_RANK (opt_src_desc ))
5956+ : 0 ;
59635957 size_t src_size
59645958 = opt_src_charlen ? in_src_size * * opt_src_charlen : in_src_size ,
59655959 dst_msg_size = sizeof (ct_msg_t ) + sizeof (struct transfer_msg_data_t )
@@ -5996,11 +5990,9 @@ PREFIX(transfer_between_remotes)(
59965990
59975991 if (opt_src_charlen && opt_src_desc )
59985992 {
5999- size_t sz = 1 ;
5993+ const size_t sz = compute_arr_data_size_sz ( opt_src_desc , 1 ) ;
60005994 full_msg_size -= src_size ;
60015995 dst_msg_size -= src_size ;
6002- for (int i = 0 ; i < GFC_DESCRIPTOR_RANK (opt_src_desc ); ++ i )
6003- sz *= GFC_DESCRIPTOR_EXTENT (opt_src_desc , i );
60045996 src_size *= sz ;
60055997 full_msg_size += src_size ;
60065998 dst_msg_size += src_size ;
0 commit comments