From ecc33f7b105373264807d09f6bdcadb93e59f1f0 Mon Sep 17 00:00:00 2001 From: Andrzej Janik Date: Sun, 4 Jul 2021 15:40:08 +0200 Subject: [PATCH] Make everything async --- level_zero-sys/lib/ze_loader.def | Bin 15760 -> 8043 bytes level_zero-sys/lib/ze_loader.lib | Bin 77220 -> 78754 bytes level_zero/src/ze.rs | 20 ++++++++++++++++++++ zluda/src/impl/function.rs | 13 +++++-------- zluda/src/impl/memory.rs | 28 +++++++++++----------------- zluda/src/impl/mod.rs | 10 +++------- 6 files changed, 39 insertions(+), 32 deletions(-) diff --git a/level_zero-sys/lib/ze_loader.def b/level_zero-sys/lib/ze_loader.def index 71bc4df4bb6534e42585f407e4fb5f256b561449..d95ffad9d45f2a0abb960182a8e683e1ac114bca 100644 GIT binary patch literal 8043 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 IjNg&?55;PF1poj5 diff --git a/level_zero-sys/lib/ze_loader.lib b/level_zero-sys/lib/ze_loader.lib index dfb3f84a4b9e74af7c267ba8b3a658794dd5aaf6..525496a50b4fa14324943a001a5ec492cbfb63f2 100644 GIT binary patch literal 78754 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 literal 77220 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 CommandList<'a> { Ok(unsafe { Self::from_ffi(result) }) } + pub fn new_immediate(ctx: &'a Context, dev: Device) -> Result { + let queue_desc = sys::ze_command_queue_desc_t { + stype: sys::ze_structure_type_t::ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC, + pNext: ptr::null(), + ordinal: 0, + index: 0, + flags: sys::ze_command_queue_flags_t(0), + mode: sys::ze_command_queue_mode_t::ZE_COMMAND_QUEUE_MODE_DEFAULT, + priority: sys::ze_command_queue_priority_t::ZE_COMMAND_QUEUE_PRIORITY_NORMAL, + }; + let mut result: sys::ze_command_list_handle_t = ptr::null_mut(); + check!(sys::zeCommandListCreateImmediate( + ctx.as_ffi(), + dev.as_ffi(), + &queue_desc, + &mut result + )); + Ok(unsafe { Self::from_ffi(result) }) + } + pub unsafe fn append_memory_copy< 'dep, T: 'a + 'dep + Copy + Sized, diff --git a/zluda/src/impl/function.rs b/zluda/src/impl/function.rs index 2aaab22..2a35512 100644 --- a/zluda/src/impl/function.rs +++ b/zluda/src/impl/function.rs @@ -81,7 +81,7 @@ pub fn launch_kernel( { return Err(CUresult::CUDA_ERROR_INVALID_VALUE); } - GlobalState::lock_stream(hstream, |stream| { + GlobalState::lock_enqueue(hstream, |cmd_list, signal, wait| { let func: &mut FunctionData = unsafe { &mut *f }.as_result_mut()?; if kernel_params != ptr::null_mut() { for (i, arg_size) in func.arg_size.iter().enumerate() { @@ -144,19 +144,16 @@ pub fn launch_kernel( func.base .set_group_size(block_dim_x, block_dim_y, block_dim_z)?; func.legacy_args.reset(); - let cmd_list = stream.command_list()?; unsafe { cmd_list.append_launch_kernel( &mut func.base, &[grid_dim_x, grid_dim_y, grid_dim_z], - None, - &mut [], + Some(signal), + wait, )?; } - cmd_list.close()?; - stream.queue.execute_and_synchronize(cmd_list)?; - Ok(()) - })? + Ok::<_, CUresult>(()) + }) } fn round_up_to_multiple(x: usize, multiple: usize) -> usize { diff --git a/zluda/src/impl/memory.rs b/zluda/src/impl/memory.rs index 81b4f31..56821d1 100644 --- a/zluda/src/impl/memory.rs +++ b/zluda/src/impl/memory.rs @@ -13,7 +13,7 @@ pub fn alloc_v2(dptr: *mut *mut c_void, bytesize: usize) -> Result<(), CUresult> pub fn copy_v2(dst: *mut c_void, src: *const c_void, bytesize: usize) -> Result<(), CUresult> { GlobalState::lock_enqueue(stream::CU_STREAM_LEGACY, |cmd_list, signal, wait| { unsafe { cmd_list.append_memory_copy_raw(dst, src, bytesize, Some(signal), wait)? }; - Ok::<_, l0::sys::ze_result_t>(()) + Ok(()) }) } @@ -26,41 +26,35 @@ pub fn free_v2(ptr: *mut c_void) -> Result<(), CUresult> { } pub(crate) fn set_d32_v2(dst: *mut c_void, mut ui: u32, n: usize) -> Result<(), CUresult> { - GlobalState::lock_stream(stream::CU_STREAM_LEGACY, |stream| { - let cmd_list = stream.command_list()?; + GlobalState::lock_enqueue(stream::CU_STREAM_LEGACY, |cmd_list, signal, wait| { unsafe { cmd_list.append_memory_fill_raw( dst, &mut ui as *mut _ as *mut _, mem::size_of::(), mem::size_of::() * n, - None, - &mut [], + Some(signal), + wait, ) }?; - cmd_list.close()?; - stream.queue.execute_and_synchronize(cmd_list)?; - Ok::<_, CUresult>(()) - })? + Ok(()) + }) } pub(crate) fn set_d8_v2(dst: *mut c_void, mut uc: u8, n: usize) -> Result<(), CUresult> { - GlobalState::lock_stream(stream::CU_STREAM_LEGACY, |stream| { - let cmd_list = stream.command_list()?; + GlobalState::lock_enqueue(stream::CU_STREAM_LEGACY, |cmd_list, signal, wait| { unsafe { cmd_list.append_memory_fill_raw( dst, &mut uc as *mut _ as *mut _, mem::size_of::(), mem::size_of::() * n, - None, - &mut [], + Some(signal), + wait, ) }?; - cmd_list.close()?; - stream.queue.execute_and_synchronize(cmd_list)?; - Ok::<_, CUresult>(()) - })? + Ok(()) + }) } #[cfg(test)] diff --git a/zluda/src/impl/mod.rs b/zluda/src/impl/mod.rs index 2bdd613..f12e964 100644 --- a/zluda/src/impl/mod.rs +++ b/zluda/src/impl/mod.rs @@ -275,17 +275,13 @@ impl GlobalState { fn lock_enqueue( stream: *mut stream::Stream, - f: impl FnOnce( - &mut l0::CommandList, - &l0::Event<'static>, - &[&l0::Event<'static>], - ) -> l0::Result<()>, + f: impl FnOnce(&l0::CommandList, &l0::Event<'static>, &[&l0::Event<'static>]) -> Result<(), CUresult>, ) -> Result<(), CUresult> { Self::lock_stream(stream, |stream_data| { let l0_dev = unsafe { (*(*stream_data.context).device).base }; let l0_ctx = unsafe { &mut (*(*stream_data.context).device).l0_context }; let event_pool = unsafe { &mut (*(*stream_data.context).device).event_pool }; - let mut cmd_list = unsafe { mem::transmute(stream_data.command_list()?) }; + let cmd_list = unsafe { mem::transmute(stream_data.command_list()?) }; stream_data .process_finished_events(&mut |(_, marker)| event_pool.mark_as_free(marker))?; let prev_event = stream_data.get_last_event(); @@ -293,7 +289,7 @@ impl GlobalState { let empty = []; let prev_event_slice = prev_event_array.as_ref().map_or(&empty[..], |arr| &arr[..]); let (new_event, new_marker) = event_pool.get(l0_dev, l0_ctx)?; - f(&mut cmd_list, &new_event, prev_event_slice)?; + f(&cmd_list, &new_event, prev_event_slice)?; cmd_list.close()?; unsafe { stream_data.queue.execute(&cmd_list, None)? }; stream_data.push_event((new_event, new_marker));