Skip to content

Commit 3cfed5e

Browse files
authored
Merge pull request #11214 from wckzhang/fihmembtl
Add OSC RDMA and OFI BTL support for accelerator buffers
2 parents 4d32d2d + d3d661c commit 3cfed5e

File tree

7 files changed

+371
-37
lines changed

7 files changed

+371
-37
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)