Skip to content

Commit 202b50f

Browse files
committed
osc/rdma: Modify copies and comparisons for accelerator buffers
With non managed device memory, memcmp, memcpy, and various comparison logic do not work. Add checks to idenitfy if it is an accelerator buffer and copy to a temporary host buffer to do these checks. Signed-off-by: William Zhang <wilzhang@amazon.com>
1 parent af33612 commit 202b50f

File tree

4 files changed

+273
-28
lines changed

4 files changed

+273
-28
lines changed

ompi/mca/osc/rdma/osc_rdma.h

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,4 +673,89 @@ static inline mca_btl_base_am_rdma_module_t *ompi_osc_rdma_selected_am_rdma(ompi
673673
return module->alternate_am_rdmas[btl_index];
674674
}
675675

676+
/**
677+
* @brief Copies from src to dest buffers that may or may not be accelerator
678+
* buffers
679+
*
680+
* @param[in] dest destination buffer
681+
* @param[in] src source buffer
682+
* @param[in] size length to copy
683+
*
684+
* @returns OMPI_SUCCESS or error
685+
*/
686+
static inline int osc_rdma_accelerator_mem_copy(void *dest, const void *src, size_t size)
687+
{
688+
int res, dev_id;
689+
uint64_t flags;
690+
int dest_is_accel = opal_accelerator.check_addr(dest, &dev_id, &flags);
691+
int src_is_accel = opal_accelerator.check_addr(src, &dev_id, &flags);
692+
693+
if (0 == dest_is_accel && 0 == src_is_accel) {
694+
memcpy(dest, src, size);
695+
return OMPI_SUCCESS;
696+
} else if (0 > dest_is_accel) {
697+
return dest_is_accel;
698+
} else if (0 > src_is_accel) {
699+
return src_is_accel;
700+
}
701+
702+
res = opal_accelerator.mem_copy(MCA_ACCELERATOR_NO_DEVICE_ID, MCA_ACCELERATOR_NO_DEVICE_ID,
703+
dest, src, size, MCA_ACCELERATOR_TRANSFER_UNSPEC);
704+
if (OPAL_SUCCESS != res) {
705+
opal_output(0, "Error in accelerator memcpy");
706+
}
707+
return res;
708+
}
709+
710+
/**
711+
* @brief Moves memory from src to dest buffers that may or may not be accelerator
712+
* buffers
713+
*
714+
* @param[in] dest destination buffer
715+
* @param[in] src source buffer
716+
* @param[in] size length to copy
717+
*
718+
* @returns OMPI_SUCCESS or error;
719+
*/
720+
static inline int osc_rdma_accelerator_mem_move(void *dest, const void *src, size_t size)
721+
{
722+
int res, dev_id;
723+
uint64_t flags;
724+
int dest_is_accel = opal_accelerator.check_addr(dest, &dev_id, &flags);
725+
int src_is_accel = opal_accelerator.check_addr(src, &dev_id, &flags);
726+
727+
if (0 == dest_is_accel && 0 == src_is_accel) {
728+
memmove(dest, src, size);
729+
return OMPI_SUCCESS;
730+
} else if (0 > dest_is_accel) {
731+
return dest_is_accel;
732+
} else if (0 > src_is_accel) {
733+
return src_is_accel;
734+
}
735+
736+
res = opal_accelerator.mem_move(MCA_ACCELERATOR_NO_DEVICE_ID, MCA_ACCELERATOR_NO_DEVICE_ID,
737+
dest, src, size, MCA_ACCELERATOR_TRANSFER_UNSPEC);
738+
if (OPAL_SUCCESS != res) {
739+
opal_output(0, "Error in accelerator memmove");
740+
}
741+
return res;
742+
}
743+
744+
/**
745+
* @brief Identifies whether the provided buffer is an accelerator buffer.
746+
*
747+
* @param[in] buf buffer
748+
*
749+
* @retval <0 An error has occurred.
750+
* @retval 0 The buffer does not belong to a managed buffer
751+
* in device memory.
752+
* @retval >0 The buffer belongs to a managed buffer in
753+
* device memory.
754+
*/
755+
static inline int osc_rdma_is_accel(void *buf)
756+
{
757+
int dev_id;
758+
uint64_t flags;
759+
return opal_accelerator.check_addr(buf, &dev_id, &flags);
760+
}
676761
#endif /* OMPI_OSC_RDMA_H */

0 commit comments

Comments
 (0)