@@ -599,14 +599,26 @@ PREFIX (register) (size_t size, caf_register_t type, caf_token_t *token,
599599 mpi_token -> desc = NULL ;
600600
601601#if MPI_VERSION >= 3
602- if (type ! = CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY )
602+ if (type = = CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY )
603603 {
604- // Note, MPI_Win_allocate implicitly synchronizes.
605- MPI_Win_allocate (actual_size , 1 , MPI_INFO_NULL , CAF_COMM_WORLD , & mem , p );
604+ MPI_Win_create_dynamic (MPI_INFO_NULL , CAF_COMM_WORLD , p );
605+ fprintf (stderr , "%d/%d: Register win = %p\n" , caf_this_image , caf_num_images ,
606+ * p );
607+ // CAF_Win_lock_all (*p);
608+ }
609+ else if (type == CAF_REGTYPE_COARRAY_ALLOC_ALLOCATE_ONLY )
610+ {
611+ mem = malloc (actual_size );
612+ MPI_Win_attach (* p , mem , actual_size );
613+ fprintf (stderr , "%d/%d: Attach mem to win = %p\n" , caf_this_image , caf_num_images ,
614+ * p );
606615 CAF_Win_lock_all (* p );
607616 }
608617 else
609- mem = NULL ;
618+ {
619+ MPI_Win_allocate (actual_size , 1 , MPI_INFO_NULL , CAF_COMM_WORLD , & mem , p );
620+ CAF_Win_lock_all (* p );
621+ }
610622#else // MPI_VERSION
611623 MPI_Alloc_mem (actual_size , MPI_INFO_NULL , & mem );
612624 MPI_Win_create (mem , actual_size , 1 , MPI_INFO_NULL , CAF_COMM_WORLD , p );
@@ -825,19 +837,22 @@ PREFIX (deregister) (caf_token_t *token, int *stat, char *errmsg, int errmsg_len
825837 p = TOKEN (* token );
826838 CAF_Win_unlock_all (* p );
827839#ifdef GCC_GE_7
828- mpi_caf_token_t * mpi_token = * (mpi_caf_token_t * * )token ;
829- if (mpi_token -> local_memptr )
830- {
831- MPI_Win_free (p );
832- mpi_token -> local_memptr = NULL ;
833- }
834- if ((* (mpi_caf_token_t * * )token )-> desc
835- && type != CAF_DEREGTYPE_COARRAY_DEALLOCATE_ONLY )
836- {
837- CAF_Win_unlock_all (* (mpi_token -> desc ));
838- MPI_Win_free (mpi_token -> desc );
839- free (mpi_token -> desc );
840- }
840+ mpi_caf_token_t * mpi_token = * (mpi_caf_token_t * * )token ;
841+ if (mpi_token -> local_memptr )
842+ {
843+ if (type != CAF_DEREGTYPE_COARRAY_DEALLOCATE_ONLY )
844+ MPI_Win_free (p );
845+ else
846+ MPI_Win_detach (* p , mpi_token -> local_memptr );
847+ mpi_token -> local_memptr = NULL ;
848+ }
849+ if ((* (mpi_caf_token_t * * )token )-> desc
850+ && type != CAF_DEREGTYPE_COARRAY_DEALLOCATE_ONLY )
851+ {
852+ CAF_Win_unlock_all (* (mpi_token -> desc ));
853+ MPI_Win_free (mpi_token -> desc );
854+ free (mpi_token -> desc );
855+ }
841856#else
842857 MPI_Win_free (p );
843858#endif
@@ -2968,12 +2983,125 @@ PREFIX(sendget_by_ref) (caf_token_t dst_token, int dst_image_index,
29682983 error_stop (1 );
29692984}
29702985
2971-
29722986int
29732987PREFIX (is_present ) (caf_token_t token , int image_index , caf_reference_t * refs )
29742988{
2975- fprintf (stderr , "COARRAY ERROR: caf_is_present() not implemented yet " );
2976- error_stop (1 );
2989+ const char unsupportedRefType [] = "Unsupported ref-type in caf_is_present()." ;
2990+ MPI_Errhandler oldErr ;
2991+ mpi_caf_token_t * mpi_token = (mpi_caf_token_t * )token ;
2992+ size_t i ;
2993+ ptrdiff_t offset = 0 ;
2994+ void * local_memptr = mpi_token -> local_memptr ;
2995+ gfc_descriptor_t * src ;
2996+ gfc_max_dim_descriptor_t src_desc_data , primary_src_desc_data ;
2997+ caf_reference_t * riter = refs ;
2998+ enum { COMP_REF , ARR_REF } last_ref ;
2999+
3000+ GET_REMOTE_DESC (mpi_token , src , primary_src_desc_data , image_index - 1 );
3001+ while (riter )
3002+ {
3003+ switch (riter -> type )
3004+ {
3005+ case CAF_REF_COMPONENT :
3006+ if (riter -> u .c .caf_token_offset )
3007+ {
3008+ mpi_token = * (mpi_caf_token_t * * )
3009+ (local_memptr + riter -> u .c .caf_token_offset );
3010+ local_memptr = mpi_token -> local_memptr ;
3011+ GET_REMOTE_DESC (mpi_token , src , src_desc_data , image_index - 1 );
3012+ offset = 0 ;
3013+ }
3014+ else
3015+ {
3016+ local_memptr += riter -> u .c .offset ;
3017+ src = (gfc_descriptor_t * )local_memptr ;
3018+ offset += riter -> u .c .offset ;
3019+ }
3020+ last_ref = COMP_REF ;
3021+ break ;
3022+ case CAF_REF_ARRAY :
3023+ for (i = 0 ; riter -> u .a .mode [i ] != CAF_ARR_REF_NONE ; ++ i )
3024+ {
3025+ switch (riter -> u .a .mode [i ])
3026+ {
3027+ case CAF_ARR_REF_FULL :
3028+ /* The memptr stays unchanged when ref'ing the first element
3029+ in a dimension. */
3030+ break ;
3031+ case CAF_ARR_REF_SINGLE :
3032+ local_memptr += (riter -> u .a .dim [i ].s .start
3033+ - src -> dim [i ].lower_bound )
3034+ * src -> dim [i ]._stride
3035+ * riter -> item_size ;
3036+ break ;
3037+ case CAF_ARR_REF_VECTOR :
3038+ case CAF_ARR_REF_RANGE :
3039+ case CAF_ARR_REF_OPEN_END :
3040+ case CAF_ARR_REF_OPEN_START :
3041+ /* Intentionally fall through, because these are not suported
3042+ * here. */
3043+ default :
3044+ caf_runtime_error (unsupportedRefType , NULL , NULL , 0 );
3045+ return false;
3046+ }
3047+ }
3048+ last_ref = ARR_REF ;
3049+ break ;
3050+ case CAF_REF_STATIC_ARRAY :
3051+ for (i = 0 ; riter -> u .a .mode [i ] != CAF_ARR_REF_NONE ; ++ i )
3052+ {
3053+ switch (riter -> u .a .mode [i ])
3054+ {
3055+ case CAF_ARR_REF_FULL :
3056+ /* The memptr stays unchanged when ref'ing the first element
3057+ in a dimension. */
3058+ break ;
3059+ case CAF_ARR_REF_SINGLE :
3060+ local_memptr += riter -> u .a .dim [i ].s .start
3061+ * riter -> u .a .dim [i ].s .stride
3062+ * riter -> item_size ;
3063+ break ;
3064+ case CAF_ARR_REF_VECTOR :
3065+ case CAF_ARR_REF_RANGE :
3066+ case CAF_ARR_REF_OPEN_END :
3067+ case CAF_ARR_REF_OPEN_START :
3068+ default :
3069+ caf_runtime_error (unsupportedRefType , NULL , NULL , 0 );
3070+ return false;
3071+ }
3072+ }
3073+ last_ref = COMP_REF ;
3074+ break ;
3075+ default :
3076+ caf_runtime_error (unsupportedRefType , NULL , NULL , 0 );
3077+ return false;
3078+ }
3079+ riter = riter -> next ;
3080+ }
3081+
3082+ if (last_ref == COMP_REF )
3083+ {
3084+ MPI_Win win = * TOKEN (mpi_token );
3085+ char dummy ;
3086+ char errmsg [200 ];
3087+ int ierr , len ;
3088+ len = 200 ;
3089+
3090+ MPI_Win_get_errhandler (win , & oldErr );
3091+ MPI_Win_set_errhandler (win , MPI_ERRORS_RETURN );
3092+
3093+ ierr = MPI_Get (& dummy , 1 , MPI_BYTE , image_index - 1 , offset , 1 , MPI_BYTE ,
3094+ win );
3095+ MPI_Error_string (ierr , errmsg , & len );
3096+ fprintf (stderr , "%d/%d: caf_is_present(): offset = %d, ierr =%d, %s\n" , caf_this_image ,
3097+ caf_num_images , offset , ierr , errmsg );
3098+ MPI_Win_set_errhandler (win , oldErr );
3099+ return ierr == MPI_SUCCESS ;
3100+ }
3101+ else
3102+ {
3103+ return src -> base_addr != NULL ;
3104+ }
29773105}
29783106#endif
29793107
0 commit comments