@@ -599,14 +599,26 @@ PREFIX (register) (size_t size, caf_register_t type, caf_token_t *token,
599
599
mpi_token -> desc = NULL ;
600
600
601
601
#if MPI_VERSION >= 3
602
- if (type ! = CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY )
602
+ if (type = = CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY )
603
603
{
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 );
606
615
CAF_Win_lock_all (* p );
607
616
}
608
617
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
+ }
610
622
#else // MPI_VERSION
611
623
MPI_Alloc_mem (actual_size , MPI_INFO_NULL , & mem );
612
624
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
825
837
p = TOKEN (* token );
826
838
CAF_Win_unlock_all (* p );
827
839
#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
+ }
841
856
#else
842
857
MPI_Win_free (p );
843
858
#endif
@@ -2968,12 +2983,125 @@ PREFIX(sendget_by_ref) (caf_token_t dst_token, int dst_image_index,
2968
2983
error_stop (1 );
2969
2984
}
2970
2985
2971
-
2972
2986
int
2973
2987
PREFIX (is_present ) (caf_token_t token , int image_index , caf_reference_t * refs )
2974
2988
{
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
+ }
2977
3105
}
2978
3106
#endif
2979
3107
0 commit comments