@@ -673,4 +673,89 @@ static inline mca_btl_base_am_rdma_module_t *ompi_osc_rdma_selected_am_rdma(ompi
673
673
return module -> alternate_am_rdmas [btl_index ];
674
674
}
675
675
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
+ }
676
761
#endif /* OMPI_OSC_RDMA_H */
0 commit comments