1818namespace dpct {
1919namespace experimental {
2020
21+ struct ipc_mem_handle_ext_t {
22+ pid_t pid;
23+ ze_ipc_mem_handle_t handle;
24+ };
25+
2126namespace detail {
2227
2328#ifndef _SYS_pidfd_open
@@ -28,10 +33,7 @@ namespace detail {
2833#define _SYS_pidfd_getfd 438 // syscall number for pidfd_getfd
2934#endif
3035
31- // / Obtain a duplicate of another process's file descriptor.
32- // / \param [in] ext_handle IPC memory handle extension
33- // / \returns obtained file descriptor
34- template <class T > int get_fd_of_peer_process (T ext_handle) {
36+ inline int get_fd_of_peer_process (ipc_mem_handle_ext_t ext_handle) {
3537 int pidfd = syscall (_SYS_pidfd_open, ext_handle.pid ,
3638 0 ); // obtain a file descriptor that refers to a
3739 // process(requires kernel 5.6+).
@@ -44,41 +46,34 @@ template <class T> int get_fd_of_peer_process(T ext_handle) {
4446
4547} // namespace detail
4648
47- struct ipc_mem_handle_ext_t {
48- pid_t pid;
49- ze_ipc_mem_handle_t handle;
50- };
51-
5249// / Creates an IPC memory handle for the specified allocation.
5350// / \param [in] ptr Pointer to the device memory allocation
5451// / \param [out] ext_handle_ptr IPC memory handle extension
55- inline void get_mem_ipc_handle (const void *ptr,
56- ipc_mem_handle_ext_t *ext_handle_ptr) {
52+ inline ze_result_t get_mem_ipc_handle (const void *ptr,
53+ ipc_mem_handle_ext_t *ext_handle_ptr) {
5754 ext_handle_ptr->pid = getpid ();
58- auto ret =
59- zeMemGetIpcHandle (sycl::get_native<sycl::backend::ext_oneapi_level_zero>(
60- dpct::get_current_device ().get_context ()),
61- ptr, &ext_handle_ptr->handle );
62- if (ret != ZE_RESULT_SUCCESS )
63- throw std::runtime_error (" The zeMemGetIpcHandle execution failed." );
55+ return zeMemGetIpcHandle (
56+ sycl::get_native<sycl::backend::ext_oneapi_level_zero>(
57+ dpct::get_current_device ().get_context ()),
58+ ptr, &ext_handle_ptr->handle );
6459}
6560
6661// / Opens an IPC memory handle to retrieve a device pointer.
6762// / \param [in] ext_handle IPC memory handle extension
6863// / \param [out] pptr Pointer to device allocation in this process
69- inline void open_mem_ipc_handle (ipc_mem_handle_ext_t ext_handle, void **pptr) {
64+ inline ze_result_t open_mem_ipc_handle (ipc_mem_handle_ext_t ext_handle,
65+ void **pptr) {
7066 int fd = detail::get_fd_of_peer_process (ext_handle);
7167 if (fd < 0 )
7268 throw std::runtime_error (" Cannot get file descriptor of peer process." );
7369 *((int *)ext_handle.handle .data ) = fd;
74- auto ret =
75- zeMemOpenIpcHandle (sycl::get_native<sycl::backend::ext_oneapi_level_zero>(
76- dpct::get_current_device ().get_context ()),
77- sycl::get_native<sycl::backend::ext_oneapi_level_zero>(
78- (sycl::device)dpct::get_current_device ()),
79- ext_handle.handle , 0u , pptr);
80- if (ret != ZE_RESULT_SUCCESS )
81- throw std::runtime_error (" The zeMemOpenIpcHandle execution failed." );
70+
71+ return zeMemOpenIpcHandle (
72+ sycl::get_native<sycl::backend::ext_oneapi_level_zero>(
73+ dpct::get_current_device ().get_context ()),
74+ sycl::get_native<sycl::backend::ext_oneapi_level_zero>(
75+ (sycl::device)dpct::get_current_device ()),
76+ ext_handle.handle , 0u , pptr);
8277}
8378
8479} // namespace experimental
0 commit comments