Skip to content

Commit bec4555

Browse files
committed
fix(cuda): synchronize Arrow exports with buffer streams
Signed-off-by: Alexander Droste <alexander.droste@protonmail.com>
1 parent 1e6102b commit bec4555

1 file changed

Lines changed: 13 additions & 3 deletions

File tree

vortex-cuda/src/arrow/mod.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use async_trait::async_trait;
3030
pub(crate) use canonical::CanonicalDeviceArrayExport;
3131
use cudarc::driver::CudaEvent;
3232
use cudarc::driver::CudaStream;
33+
use cudarc::driver::DevicePtr;
3334
use cudarc::runtime::sys::cudaEvent_t;
3435
pub(crate) use offsets::I32Offsets;
3536
pub(crate) use offsets::i32_offsets_from_lengths;
@@ -169,9 +170,18 @@ impl PrivateData {
169170
// null pointer
170171
Ok(ptr::null())
171172
}
172-
Some(handle) => usize::try_from(handle.cuda_device_ptr()?)
173-
.map(|ptr| ptr as *const c_void)
174-
.map_err(|_| vortex_err!("CUDA device pointer does not fit in usize")),
173+
Some(handle) => {
174+
// The buffer may have been populated on a different stream (for example,
175+
// pooled file reads use a dedicated H2D stream). Access it through cudarc's
176+
// stream-aware API so this export stream waits for pending writes before
177+
// its Arrow sync event is recorded.
178+
let view = handle.cuda_view::<u8>()?;
179+
let (device_ptr, record_read) = view.device_ptr(ctx.stream());
180+
drop(record_read);
181+
usize::try_from(device_ptr)
182+
.map(|ptr| ptr as *const c_void)
183+
.map_err(|_| vortex_err!("CUDA device pointer does not fit in usize"))
184+
}
175185
}
176186
})
177187
.collect::<VortexResult<Vec<_>>>()?

0 commit comments

Comments
 (0)