xlog_cuda/provider/
launch_safe.rs1use cudarc::driver::sys;
12use xlog_core::{Result, XlogError};
13
14use crate::device_runtime::StreamId;
15use crate::launch::{LaunchEnqueueError, LaunchRecorder};
16use crate::memory::{CudaColumn, TrackedCudaSlice};
17
18impl super::CudaKernelProvider {
19 pub fn memset_recorded(
34 &self,
35 dst: &mut TrackedCudaSlice<u8>,
36 value: u8,
37 launch_stream: StreamId,
38 ) -> Result<()> {
39 let runtime = self.memory().runtime().ok_or_else(|| {
40 XlogError::Kernel(
41 "memset_recorded requires a runtime-backed GpuMemoryManager \
42 (constructed by CudaProviderBuilder)"
43 .to_string(),
44 )
45 })?;
46 let dst_ptr = dst.device_ptr_value();
47 let dst_len = dst.len();
48
49 let mut rec = LaunchRecorder::new_strict(launch_stream);
50 rec.write(dst);
51
52 let enqueued = unsafe {
57 rec.enqueue(runtime, |stream| {
58 let result =
59 sys::cuMemsetD8Async(dst_ptr, value, dst_len, stream.stream().cu_stream());
60 if result == sys::cudaError_enum::CUDA_SUCCESS {
61 Ok(())
62 } else {
63 Err(XlogError::Kernel(format!(
64 "cuMemsetD8Async failed: {result:?}"
65 )))
66 }
67 })
68 }
69 .map_err(|error| match error {
70 LaunchEnqueueError::Preparation(preparation) => XlogError::Kernel(format!(
71 "memset_recorded: launch recorder preparation failed: {preparation}"
72 )),
73 LaunchEnqueueError::PreparationAndCleanup {
74 preparation,
75 cleanup,
76 } => XlogError::Kernel(format!(
77 "memset_recorded: launch recorder preparation failed: {preparation}; \
78 launch reservation cleanup also failed: {cleanup}"
79 )),
80 LaunchEnqueueError::Operation(operation) => operation,
81 LaunchEnqueueError::OperationAndCleanup { operation, cleanup } => XlogError::Kernel(
82 format!("{operation}; launch reservation cleanup also failed: {cleanup}"),
83 ),
84 })?;
85
86 enqueued.commit().map_err(|error| {
87 XlogError::Kernel(format!(
88 "memset_recorded: launch recorder commit failed: {error}"
89 ))
90 })
91 }
92
93 pub fn memset_column_recorded(
100 &self,
101 dst: &mut CudaColumn,
102 value: u8,
103 launch_stream: StreamId,
104 ) -> Result<()> {
105 let runtime = self.memory().runtime().ok_or_else(|| {
106 XlogError::Kernel(
107 "memset_column_recorded requires a runtime-backed GpuMemoryManager".to_string(),
108 )
109 })?;
110 let dst_ptr = *dst.device_ptr();
111 let dst_len = <CudaColumn as cudarc::driver::DeviceSlice<u8>>::len(dst);
112
113 let mut rec = LaunchRecorder::new_strict(launch_stream);
114 rec.write_column(dst);
115 let enqueued = unsafe {
119 rec.enqueue(runtime, |stream| {
120 let result =
121 sys::cuMemsetD8Async(dst_ptr, value, dst_len, stream.stream().cu_stream());
122 if result == sys::cudaError_enum::CUDA_SUCCESS {
123 Ok(())
124 } else {
125 Err(XlogError::Kernel(format!(
126 "cuMemsetD8Async (column) failed: {result:?}"
127 )))
128 }
129 })
130 }
131 .map_err(|error| match error {
132 LaunchEnqueueError::Preparation(preparation) => XlogError::Kernel(format!(
133 "memset_column_recorded: launch recorder preparation failed: {preparation}"
134 )),
135 LaunchEnqueueError::PreparationAndCleanup {
136 preparation,
137 cleanup,
138 } => XlogError::Kernel(format!(
139 "memset_column_recorded: launch recorder preparation failed: {preparation}; \
140 launch reservation cleanup also failed: {cleanup}"
141 )),
142 LaunchEnqueueError::Operation(operation) => operation,
143 LaunchEnqueueError::OperationAndCleanup { operation, cleanup } => XlogError::Kernel(
144 format!("{operation}; launch reservation cleanup also failed: {cleanup}"),
145 ),
146 })?;
147
148 enqueued.commit().map_err(|e| {
149 XlogError::Kernel(format!(
150 "memset_column_recorded: launch recorder commit failed: {}",
151 e
152 ))
153 })
154 }
155}