@@ -967,6 +967,7 @@ int ompi_osc_rdma_compare_and_swap (const void *origin_addr, const void *compare
967967 mca_btl_base_registration_handle_t * target_handle ;
968968 ompi_osc_rdma_sync_t * sync ;
969969 uint64_t target_address ;
970+ ptrdiff_t true_lb , true_extent ;
970971 int ret ;
971972
972973 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
978979 return OMPI_ERR_RMA_SYNC ;
979980 }
980981
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 );
982988 if (OPAL_UNLIKELY (OPAL_SUCCESS != ret )) {
983989 return ret ;
984990 }
@@ -1015,7 +1021,7 @@ int ompi_osc_rdma_rget_accumulate_internal (ompi_osc_rdma_sync_t *sync, const vo
10151021 ompi_osc_rdma_module_t * module = sync -> module ;
10161022 mca_btl_base_registration_handle_t * target_handle ;
10171023 uint64_t target_address ;
1018- ptrdiff_t lb , extent ;
1024+ ptrdiff_t lb , origin_extent , target_span ;
10191025 int ret ;
10201026
10211027 /* 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
10271033 return OMPI_SUCCESS ;
10281034 }
10291035
1030- ( void ) ompi_datatype_get_extent ( origin_datatype , & lb , & extent );
1036+ target_span = opal_datatype_span ( & target_datatype -> super , target_count , & lb );
10311037
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 );
10331041 if (OPAL_UNLIKELY (OMPI_SUCCESS != ret )) {
10341042 return ret ;
10351043 }
10361044
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 ) {
10381048 if (module -> acc_use_amo && ompi_datatype_is_predefined (origin_datatype )) {
10391049 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 ,
10411051 target_handle , op , request );
10421052 } 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 ,
10441054 target_handle , op , request );
10451055 }
10461056
@@ -1049,7 +1059,7 @@ int ompi_osc_rdma_rget_accumulate_internal (ompi_osc_rdma_sync_t *sync, const vo
10491059 }
10501060 }
10511061
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 ,
10531063 target_handle , op , request );
10541064 if (OMPI_SUCCESS == ret ) {
10551065 return OMPI_SUCCESS ;
0 commit comments