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