@@ -967,6 +967,7 @@ int ompi_osc_rdma_compare_and_swap (const void *origin_addr, const void *compare
967
967
mca_btl_base_registration_handle_t * target_handle ;
968
968
ompi_osc_rdma_sync_t * sync ;
969
969
uint64_t target_address ;
970
+ ptrdiff_t true_lb , true_extent ;
970
971
int ret ;
971
972
972
973
OSC_RDMA_VERBOSE (MCA_BASE_VERBOSE_TRACE , "cswap: 0x%lx, 0x%lx, 0x%lx, %s, %d, %d, %s" ,
@@ -978,7 +979,12 @@ int ompi_osc_rdma_compare_and_swap (const void *origin_addr, const void *compare
978
979
return OMPI_ERR_RMA_SYNC ;
979
980
}
980
981
981
- ret = osc_rdma_get_remote_segment (module , peer , target_disp , dt -> super .size , & target_address , & target_handle );
982
+ ret = ompi_datatype_get_true_extent (dt , & true_lb , & true_extent );
983
+ if (OPAL_UNLIKELY (OMPI_SUCCESS != ret )) {
984
+ return ret ;
985
+ }
986
+
987
+ ret = osc_rdma_get_remote_segment (module , peer , target_disp , true_lb + true_extent , & target_address , & target_handle );
982
988
if (OPAL_UNLIKELY (OPAL_SUCCESS != ret )) {
983
989
return ret ;
984
990
}
@@ -1015,7 +1021,7 @@ int ompi_osc_rdma_rget_accumulate_internal (ompi_osc_rdma_sync_t *sync, const vo
1015
1021
ompi_osc_rdma_module_t * module = sync -> module ;
1016
1022
mca_btl_base_registration_handle_t * target_handle ;
1017
1023
uint64_t target_address ;
1018
- ptrdiff_t lb , extent ;
1024
+ ptrdiff_t lb , origin_extent , target_span ;
1019
1025
int ret ;
1020
1026
1021
1027
/* short-circuit case. note that origin_count may be 0 if op is MPI_NO_OP */
@@ -1027,20 +1033,24 @@ int ompi_osc_rdma_rget_accumulate_internal (ompi_osc_rdma_sync_t *sync, const vo
1027
1033
return OMPI_SUCCESS ;
1028
1034
}
1029
1035
1030
- ( void ) ompi_datatype_get_extent ( origin_datatype , & lb , & extent );
1036
+ target_span = opal_datatype_span ( & target_datatype -> super , target_count , & lb );
1031
1037
1032
- ret = osc_rdma_get_remote_segment (module , peer , target_disp , extent * target_count , & target_address , & target_handle );
1038
+ // a buffer defined by (buf, count, dt)
1039
+ // will have data starting at buf+offset and ending len bytes later:
1040
+ ret = osc_rdma_get_remote_segment (module , peer , target_disp , target_span + lb , & target_address , & target_handle );
1033
1041
if (OPAL_UNLIKELY (OMPI_SUCCESS != ret )) {
1034
1042
return ret ;
1035
1043
}
1036
1044
1037
- if (module -> acc_single_intrinsic && extent <= 8 ) {
1045
+ (void ) ompi_datatype_get_extent (origin_datatype , & lb , & origin_extent );
1046
+
1047
+ if (module -> acc_single_intrinsic && origin_extent <= 8 ) {
1038
1048
if (module -> acc_use_amo && ompi_datatype_is_predefined (origin_datatype )) {
1039
1049
if (NULL == result_addr ) {
1040
- ret = ompi_osc_rdma_acc_single_atomic (sync , origin_addr , origin_datatype , extent , peer , target_address ,
1050
+ ret = ompi_osc_rdma_acc_single_atomic (sync , origin_addr , origin_datatype , origin_extent , peer , target_address ,
1041
1051
target_handle , op , request );
1042
1052
} else {
1043
- ret = ompi_osc_rdma_fetch_and_op_atomic (sync , origin_addr , result_addr , origin_datatype , extent , peer , target_address ,
1053
+ ret = ompi_osc_rdma_fetch_and_op_atomic (sync , origin_addr , result_addr , origin_datatype , origin_extent , peer , target_address ,
1044
1054
target_handle , op , request );
1045
1055
}
1046
1056
@@ -1049,7 +1059,7 @@ int ompi_osc_rdma_rget_accumulate_internal (ompi_osc_rdma_sync_t *sync, const vo
1049
1059
}
1050
1060
}
1051
1061
1052
- ret = ompi_osc_rdma_fetch_and_op_cas (sync , origin_addr , result_addr , origin_datatype , extent , peer , target_address ,
1062
+ ret = ompi_osc_rdma_fetch_and_op_cas (sync , origin_addr , result_addr , origin_datatype , origin_extent , peer , target_address ,
1053
1063
target_handle , op , request );
1054
1064
if (OMPI_SUCCESS == ret ) {
1055
1065
return OMPI_SUCCESS ;
0 commit comments