@@ -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 , origin_extent , target_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,9 +1033,11 @@ 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 ( target_datatype , & lb , & target_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 , target_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
}
0 commit comments