@@ -58,6 +58,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
58
58
/* Define GFC_CAF_CHECK to enable run-time checking. */
59
59
/* #define GFC_CAF_CHECK 1 */
60
60
61
+ #define GCC_GE_7
61
62
62
63
#ifndef EXTRA_DEBUG_OUTPUT
63
64
#define dprint (...)
@@ -1069,15 +1070,19 @@ PREFIX (register) (size_t size, caf_register_t type, caf_token_t *token,
1069
1070
{
1070
1071
/* Create or allocate a slave token. */
1071
1072
mpi_caf_slave_token_t * slave_token ;
1073
+ #ifdef EXTRA_DEBUG_OUTPUT
1072
1074
MPI_Aint mpi_address ;
1075
+ #endif
1073
1076
CAF_Win_unlock_all (global_dynamic_win );
1074
1077
if (type == CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY )
1075
1078
{
1076
1079
* token = calloc (1 , sizeof (mpi_caf_slave_token_t ));
1077
1080
slave_token = (mpi_caf_slave_token_t * )(* token );
1078
1081
MPI_Win_attach (global_dynamic_win , * token ,
1079
1082
sizeof (mpi_caf_slave_token_t ));
1083
+ #ifdef EXTRA_DEBUG_OUTPUT
1080
1084
MPI_Get_address (* token , & mpi_address );
1085
+ #endif
1081
1086
dprint ("%d/%d: Attach slave token %p (mpi-address: %p) to global_dynamic_window = %p\n" ,
1082
1087
caf_this_image , caf_num_images , slave_token , mpi_address ,
1083
1088
global_dynamic_win );
@@ -1096,14 +1101,18 @@ PREFIX (register) (size_t size, caf_register_t type, caf_token_t *token,
1096
1101
mem = malloc (actual_size );
1097
1102
slave_token -> memptr = mem ;
1098
1103
ierr = MPI_Win_attach (global_dynamic_win , mem , actual_size );
1104
+ #ifdef EXTRA_DEBUG_OUTPUT
1099
1105
MPI_Get_address (mem , & mpi_address );
1100
- dprint ("%d/%d: Attach mem %p (mpi-address: %p) to global_dynamic_window = %p on slave_token %p, ierr: %d\n" ,
1106
+ #endif
1107
+ dprint ("%d/%d: Attach mem %p (mpi-address: %p) to global_dynamic_window = %p on slave_token %p, size %d, ierr: %d\n" ,
1101
1108
caf_this_image , caf_num_images , mem , mpi_address ,
1102
- global_dynamic_win , slave_token , ierr );
1109
+ global_dynamic_win , slave_token , actual_size , ierr );
1103
1110
if (desc != NULL && GFC_DESCRIPTOR_RANK (desc ) != 0 )
1104
1111
{
1105
1112
slave_token -> desc = desc ;
1113
+ #ifdef EXTRA_DEBUG_OUTPUT
1106
1114
MPI_Get_address (desc , & mpi_address );
1115
+ #endif
1107
1116
dprint ("%d/%d: Attached descriptor %p (mpi-address: %p) to global_dynamic_window %p at address %p, ierr = %d.\n" ,
1108
1117
caf_this_image , caf_num_images , desc , mpi_address ,
1109
1118
global_dynamic_win , & slave_token -> desc , ierr );
@@ -3773,19 +3782,20 @@ get_data (void *ds, mpi_caf_token_t *token, MPI_Aint offset, int dst_type,
3773
3782
{
3774
3783
size_t k ;
3775
3784
MPI_Win win = token == NULL ? global_dynamic_win : token -> memptr_win ;
3785
+ #ifdef EXTRA_DEBUG_OUTPUT
3786
+ if (token )
3787
+ dprint ("%d/%d: %s() %p = win(%d): %p -> offset: %d of size %d -> %d, dst type %d(%d), src type %d(%d)\n" ,
3788
+ caf_this_image , caf_num_images , __FUNCTION__ , ds , win , (image_index + 1 ),
3789
+ offset , src_size , dst_size , dst_type , dst_kind , src_type , src_kind );
3790
+ else
3791
+ dprint ("%d/%d: %s() %p = global_win(%d) offset: %d (%p) of size %d -> %d, dst type %d(%d), src type %d(%d)\n" ,
3792
+ caf_this_image , caf_num_images , __FUNCTION__ , ds , (image_index + 1 ),
3793
+ offset , offset , src_size , dst_size , dst_type , dst_kind , src_type ,
3794
+ src_kind );
3795
+ #endif
3776
3796
if (dst_type == src_type && dst_kind == src_kind )
3777
3797
{
3778
3798
size_t sz = (dst_size > src_size ? src_size : dst_size ) * num ;
3779
- #ifdef EXTRA_DEBUG_OUTPUT
3780
- if (token )
3781
- dprint ("%d/%d: %s() %p = win: %p -> offset: %d of size %d bytes\n" ,
3782
- caf_this_image , caf_num_images , __FUNCTION__ , ds , win ,
3783
- offset , sz );
3784
- else
3785
- dprint ("%d/%d: %s() %p = global_win offset: %d of size %d bytes\n" ,
3786
- caf_this_image , caf_num_images , __FUNCTION__ , ds ,
3787
- offset , sz );
3788
- #endif
3789
3799
MPI_Get (ds , sz , MPI_BYTE , image_index , offset , sz , MPI_BYTE ,
3790
3800
win );
3791
3801
if ((dst_type == BT_CHARACTER || src_type == BT_CHARACTER )
@@ -3804,6 +3814,8 @@ get_data (void *ds, mpi_caf_token_t *token, MPI_Aint offset, int dst_type,
3804
3814
void * srh = alloca (src_size );
3805
3815
MPI_Get (srh , src_size , MPI_BYTE , image_index , offset ,
3806
3816
src_size , MPI_BYTE , win );
3817
+ /* Get of the data needs to be finished before converting the data. */
3818
+ MPI_Win_flush (image_index , win );
3807
3819
assign_char1_from_char4 (dst_size , src_size , ds , srh );
3808
3820
}
3809
3821
else if (dst_type == BT_CHARACTER )
@@ -3812,14 +3824,23 @@ get_data (void *ds, mpi_caf_token_t *token, MPI_Aint offset, int dst_type,
3812
3824
void * srh = alloca (src_size );
3813
3825
MPI_Get (srh , src_size , MPI_BYTE , image_index , offset ,
3814
3826
src_size , MPI_BYTE , win );
3827
+ /* Get of the data needs to be finished before converting the data. */
3828
+ MPI_Win_flush (image_index , win );
3815
3829
assign_char4_from_char1 (dst_size , src_size , ds , srh );
3816
3830
}
3817
3831
else
3818
3832
{
3819
3833
/* Get the required amount of memory on the stack. */
3820
3834
void * srh = alloca (src_size * num );
3821
- MPI_Get (srh , src_size * num , MPI_BYTE , image_index , offset ,
3822
- src_size * num , MPI_BYTE , win );
3835
+ dprint ("%d/%d: %s() type/kind convert %d items: type %d(%d) -> type %d(%d), local buffer: %p\n" ,
3836
+ caf_this_image , caf_num_images , __FUNCTION__ , num ,
3837
+ src_type , src_kind , dst_type , dst_kind , srh );
3838
+ int ierr = MPI_Get (srh , src_size * num , MPI_BYTE , image_index , offset ,
3839
+ src_size * num , MPI_BYTE , win );
3840
+ /* Get of the data needs to be finished before converting the data. */
3841
+ MPI_Win_flush (image_index , win );
3842
+ dprint ("%d/%d: %s() srh[0] = %d, ierr = %d\n" , caf_this_image , caf_num_images ,
3843
+ __FUNCTION__ , (int )((char * )srh )[0 ], ierr );
3823
3844
for (k = 0 ; k < num ; ++ k )
3824
3845
{
3825
3846
convert_type (ds , dst_type , dst_kind , srh , src_type , src_kind , stat );
@@ -3896,6 +3917,8 @@ get_for_ref (caf_reference_t *ref, size_t *i, size_t dst_index,
3896
3917
switch (ref -> type )
3897
3918
{
3898
3919
case CAF_REF_COMPONENT :
3920
+ dprint ("%d/%d: %s() caf_offset = %d\n" , caf_this_image , caf_num_images ,
3921
+ __FUNCTION__ , ref -> u .c .caf_token_offset );
3899
3922
if (ref -> u .c .caf_token_offset > 0 )
3900
3923
{
3901
3924
sr_byte_offset += ref -> u .c .offset ;
@@ -3909,8 +3932,8 @@ get_for_ref (caf_reference_t *ref, size_t *i, size_t dst_index,
3909
3932
else
3910
3933
{
3911
3934
MPI_Get (& sr , stdptr_size , MPI_BYTE , image_index ,
3912
- MPI_Aint_add (( MPI_Aint ) sr , sr_byte_offset ) ,
3913
- stdptr_size , MPI_BYTE , global_dynamic_win );
3935
+ sr_byte_offset , stdptr_size , MPI_BYTE ,
3936
+ mpi_token -> memptr_win );
3914
3937
sr_global = true;
3915
3938
}
3916
3939
sr_byte_offset = 0 ;
@@ -3919,14 +3942,14 @@ get_for_ref (caf_reference_t *ref, size_t *i, size_t dst_index,
3919
3942
sr_byte_offset += ref -> u .c .offset ;
3920
3943
if (sr_global )
3921
3944
get_data (ds , NULL , MPI_Aint_add ((MPI_Aint )sr , sr_byte_offset ),
3922
- GFC_DESCRIPTOR_TYPE (dst ), GFC_DESCRIPTOR_TYPE (dst ),
3923
- dst_kind , src_kind , dst_size , ref -> item_size , 1 , stat ,
3924
- image_index );
3945
+ GFC_DESCRIPTOR_TYPE (dst ), GFC_DESCRIPTOR_TYPE (dst ),
3946
+ dst_kind , src_kind , dst_size , ref -> item_size , 1 , stat ,
3947
+ image_index );
3925
3948
else
3926
3949
get_data (ds , mpi_token , sr_byte_offset ,
3927
- GFC_DESCRIPTOR_TYPE (dst ), GFC_DESCRIPTOR_TYPE (src ),
3928
- dst_kind , src_kind , dst_size , ref -> item_size , 1 , stat ,
3929
- image_index );
3950
+ GFC_DESCRIPTOR_TYPE (dst ), GFC_DESCRIPTOR_TYPE (src ),
3951
+ dst_kind , src_kind , dst_size , ref -> item_size , 1 , stat ,
3952
+ image_index );
3930
3953
++ (* i );
3931
3954
return ;
3932
3955
case CAF_REF_STATIC_ARRAY :
@@ -3937,18 +3960,18 @@ get_for_ref (caf_reference_t *ref, size_t *i, size_t dst_index,
3937
3960
{
3938
3961
if (sr_global )
3939
3962
get_data (ds + dst_index * dst_size , NULL ,
3940
- MPI_Aint_add ((MPI_Aint )sr , sr_byte_offset ),
3941
- GFC_DESCRIPTOR_TYPE (dst ),
3942
- src_type == -1 ? GFC_DESCRIPTOR_TYPE (src ) : src_type ,
3943
- dst_kind , src_kind , dst_size , ref -> item_size , num ,
3944
- stat , image_index );
3963
+ MPI_Aint_add ((MPI_Aint )sr , sr_byte_offset ),
3964
+ GFC_DESCRIPTOR_TYPE (dst ),
3965
+ src_type == -1 ? GFC_DESCRIPTOR_TYPE (src ) : src_type ,
3966
+ dst_kind , src_kind , dst_size , ref -> item_size , num ,
3967
+ stat , image_index );
3945
3968
else
3946
3969
{
3947
3970
get_data (ds + dst_index * dst_size , mpi_token ,
3948
- sr_byte_offset , GFC_DESCRIPTOR_TYPE (dst ),
3949
- src_type == -1 ? GFC_DESCRIPTOR_TYPE (src ) : src_type ,
3950
- dst_kind , src_kind , dst_size , ref -> item_size , num ,
3951
- stat , image_index );
3971
+ sr_byte_offset , GFC_DESCRIPTOR_TYPE (dst ),
3972
+ src_type == -1 ? GFC_DESCRIPTOR_TYPE (src ) : src_type ,
3973
+ dst_kind , src_kind , dst_size , ref -> item_size , num ,
3974
+ stat , image_index );
3952
3975
}
3953
3976
* i += num ;
3954
3977
return ;
@@ -4334,8 +4357,8 @@ PREFIX (get_by_ref) (caf_token_t token, int image_index,
4334
4357
CAF_Win_lock (MPI_LOCK_SHARED , remote_image , mpi_token -> memptr_win );
4335
4358
while (riter )
4336
4359
{
4337
- dprint ("%d/%d: %s() offset = %d, remote_mem = %p\n" , caf_this_image ,
4338
- caf_num_images , __FUNCTION__ , data_offset , remote_memptr );
4360
+ dprint ("%d/%d: %s() offset = %d, remote_mem = %p, access_data(global_win) = %d \n" , caf_this_image ,
4361
+ caf_num_images , __FUNCTION__ , data_offset , remote_memptr , access_data_through_global_win );
4339
4362
switch (riter -> type )
4340
4363
{
4341
4364
case CAF_REF_COMPONENT :
@@ -4357,6 +4380,8 @@ PREFIX (get_by_ref) (caf_token_t token, int image_index,
4357
4380
data_offset += riter -> u .c .offset ;
4358
4381
MPI_Get (& remote_memptr , stdptr_size , MPI_BYTE , remote_image ,
4359
4382
data_offset , stdptr_size , MPI_BYTE , mpi_token -> memptr_win );
4383
+ dprint ("%d/%d: %s() get(custom_token %p), offset = %d, res. remote_mem = %p\n" , caf_this_image ,
4384
+ caf_num_images , __FUNCTION__ , mpi_token -> memptr_win , data_offset , remote_memptr );
4360
4385
/* All future access is through the global dynamic window. */
4361
4386
access_data_through_global_win = true;
4362
4387
}
@@ -4845,15 +4870,15 @@ put_data (mpi_caf_token_t *token, MPI_Aint offset, void *sr, int dst_type,
4845
4870
{
4846
4871
/* Get the required amount of memory on the stack. */
4847
4872
void * dsh = alloca (dst_size );
4848
- assign_char1_from_char4 (dst_size , src_size , sr , dsh );
4873
+ assign_char1_from_char4 (dst_size , src_size , dsh , sr );
4849
4874
MPI_Put (dsh , dst_size , MPI_BYTE , image_index , offset ,
4850
4875
dst_size , MPI_BYTE , win );
4851
4876
}
4852
4877
else if (dst_type == BT_CHARACTER )
4853
4878
{
4854
4879
/* Get the required amount of memory on the stack. */
4855
4880
void * dsh = alloca (dst_size );
4856
- assign_char4_from_char1 (dst_size , src_size , sr , dsh );
4881
+ assign_char4_from_char1 (dst_size , src_size , dsh , sr );
4857
4882
MPI_Put (dsh , dst_size , MPI_BYTE , image_index , offset ,
4858
4883
dst_size , MPI_BYTE , win );
4859
4884
}
@@ -4864,11 +4889,12 @@ put_data (mpi_caf_token_t *token, MPI_Aint offset, void *sr, int dst_type,
4864
4889
for (k = 0 ; k < num ; ++ k )
4865
4890
{
4866
4891
convert_type (dsh , dst_type , dst_kind , sr , src_type , src_kind , stat );
4867
- sr += dst_size ;
4868
- dsh += src_size ;
4892
+ dsh += dst_size ;
4893
+ sr += src_size ;
4869
4894
}
4870
4895
MPI_Put (dsh , dst_size * num , MPI_BYTE , image_index , offset ,
4871
4896
dst_size * num , MPI_BYTE , win );
4897
+ MPI_Win_flush (image_index , win );
4872
4898
}
4873
4899
}
4874
4900
@@ -4926,7 +4952,7 @@ send_by_ref (caf_reference_t *ref, size_t *i, size_t src_index,
4926
4952
dst_byte_offset += ref -> u .c .offset ;
4927
4953
if (sr_global )
4928
4954
put_data (NULL , MPI_Aint_add ((MPI_Aint )ds , dst_byte_offset ), sr ,
4929
- GFC_DESCRIPTOR_TYPE (dst ), GFC_DESCRIPTOR_TYPE (dst ),
4955
+ GFC_DESCRIPTOR_TYPE (src ), GFC_DESCRIPTOR_TYPE (src ),
4930
4956
dst_kind , src_kind , src_size , ref -> item_size , 1 , stat ,
4931
4957
image_index );
4932
4958
else
0 commit comments