@@ -968,6 +968,7 @@ int ompi_osc_rdma_compare_and_swap (const void *origin_addr, const void *compare
968
968
mca_btl_base_registration_handle_t * target_handle ;
969
969
ompi_osc_rdma_sync_t * sync ;
970
970
uint64_t target_address ;
971
+ ptrdiff_t true_lb , true_extent ;
971
972
int ret ;
972
973
973
974
OSC_RDMA_VERBOSE (MCA_BASE_VERBOSE_TRACE , "cswap: 0x%lx, 0x%lx, 0x%lx, %s, %d, %d, %s" ,
@@ -979,7 +980,12 @@ int ompi_osc_rdma_compare_and_swap (const void *origin_addr, const void *compare
979
980
return OMPI_ERR_RMA_SYNC ;
980
981
}
981
982
982
- ret = osc_rdma_get_remote_segment (module , peer , target_disp , dt -> super .size , & target_address , & target_handle );
983
+ ret = ompi_datatype_get_true_extent (dt , & true_lb , & true_extent );
984
+ if (OPAL_UNLIKELY (OMPI_SUCCESS != ret )) {
985
+ return ret ;
986
+ }
987
+
988
+ ret = osc_rdma_get_remote_segment (module , peer , target_disp , true_lb + true_extent , & target_address , & target_handle );
983
989
if (OPAL_UNLIKELY (OPAL_SUCCESS != ret )) {
984
990
return ret ;
985
991
}
@@ -1016,7 +1022,7 @@ int ompi_osc_rdma_rget_accumulate_internal (ompi_osc_rdma_sync_t *sync, const vo
1016
1022
ompi_osc_rdma_module_t * module = sync -> module ;
1017
1023
mca_btl_base_registration_handle_t * target_handle ;
1018
1024
uint64_t target_address ;
1019
- ptrdiff_t lb , extent ;
1025
+ ptrdiff_t lb , origin_extent , target_span ;
1020
1026
int ret ;
1021
1027
1022
1028
/* short-circuit case. note that origin_count may be 0 if op is MPI_NO_OP */
@@ -1068,20 +1074,24 @@ int ompi_osc_rdma_rget_accumulate_internal (ompi_osc_rdma_sync_t *sync, const vo
1068
1074
}
1069
1075
}
1070
1076
1071
- ( void ) ompi_datatype_get_extent ( origin_datatype , & lb , & extent );
1077
+ target_span = opal_datatype_span ( & target_datatype -> super , target_count , & lb );
1072
1078
1073
- ret = osc_rdma_get_remote_segment (module , peer , target_disp , extent * target_count , & target_address , & target_handle );
1079
+ // a buffer defined by (buf, count, dt)
1080
+ // will have data starting at buf+offset and ending len bytes later:
1081
+ ret = osc_rdma_get_remote_segment (module , peer , target_disp , target_span + lb , & target_address , & target_handle );
1074
1082
if (OPAL_UNLIKELY (OMPI_SUCCESS != ret )) {
1075
1083
return ret ;
1076
1084
}
1077
1085
1078
- if (module -> acc_single_intrinsic && extent <= 8 ) {
1086
+ (void ) ompi_datatype_get_extent (origin_datatype , & lb , & origin_extent );
1087
+
1088
+ if (module -> acc_single_intrinsic && origin_extent <= 8 ) {
1079
1089
if (module -> acc_use_amo && ompi_datatype_is_predefined (origin_datatype )) {
1080
1090
if (NULL == result_addr ) {
1081
- ret = ompi_osc_rdma_acc_single_atomic (sync , origin_addr , origin_datatype , extent , peer , target_address ,
1091
+ ret = ompi_osc_rdma_acc_single_atomic (sync , origin_addr , origin_datatype , origin_extent , peer , target_address ,
1082
1092
target_handle , op , request );
1083
1093
} else {
1084
- ret = ompi_osc_rdma_fetch_and_op_atomic (sync , origin_addr , result_addr , origin_datatype , extent , peer , target_address ,
1094
+ ret = ompi_osc_rdma_fetch_and_op_atomic (sync , origin_addr , result_addr , origin_datatype , origin_extent , peer , target_address ,
1085
1095
target_handle , op , request );
1086
1096
}
1087
1097
@@ -1090,7 +1100,7 @@ int ompi_osc_rdma_rget_accumulate_internal (ompi_osc_rdma_sync_t *sync, const vo
1090
1100
}
1091
1101
}
1092
1102
1093
- ret = ompi_osc_rdma_fetch_and_op_cas (sync , origin_addr , result_addr , origin_datatype , extent , peer , target_address ,
1103
+ ret = ompi_osc_rdma_fetch_and_op_cas (sync , origin_addr , result_addr , origin_datatype , origin_extent , peer , target_address ,
1094
1104
target_handle , op , request );
1095
1105
if (OMPI_SUCCESS == ret ) {
1096
1106
return OMPI_SUCCESS ;
0 commit comments