@@ -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