Skip to content

Commit ebdfa0d

Browse files
committed
Bind thread for cudastorage drop
1 parent 34e5753 commit ebdfa0d

1 file changed

Lines changed: 31 additions & 0 deletions

File tree

  • candle-core/src/cuda_backend

candle-core/src/cuda_backend/mod.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,37 @@ pub enum CudaStorageSlice {
5858
F8E4M3(CudaSlice<F8E4M3>),
5959
}
6060

61+
impl Drop for CudaStorageSlice {
62+
fn drop(&mut self) {
63+
// Set the correct CUDA context before the CudaSlice drops
64+
let _result = match self {
65+
CudaStorageSlice::U8(slice) => set_context_for_slice(slice),
66+
CudaStorageSlice::U32(slice) => set_context_for_slice(slice),
67+
CudaStorageSlice::I16(slice) => set_context_for_slice(slice),
68+
CudaStorageSlice::I32(slice) => set_context_for_slice(slice),
69+
CudaStorageSlice::I64(slice) => set_context_for_slice(slice),
70+
CudaStorageSlice::BF16(slice) => set_context_for_slice(slice),
71+
CudaStorageSlice::F16(slice) => set_context_for_slice(slice),
72+
CudaStorageSlice::F32(slice) => set_context_for_slice(slice),
73+
CudaStorageSlice::F64(slice) => set_context_for_slice(slice),
74+
CudaStorageSlice::F8E4M3(slice) => set_context_for_slice(slice),
75+
};
76+
// After this method exits, the CudaSlice will drop with correct context
77+
}
78+
}
79+
80+
fn set_context_for_slice<T>(slice: &CudaSlice<T>) -> std::result::Result<(), CudaError> {
81+
// Get the device this slice belongs to
82+
let device = slice.device();
83+
84+
// Set this device's CUDA context as current
85+
// The exact method depends on cudarc's API
86+
device.bind_to_thread()?;
87+
// OR: cudarc::driver::result::ctx::set_current(device.cu_primary_ctx())?;
88+
89+
Ok(())
90+
}
91+
6192
struct Clone;
6293
impl Map1 for Clone {
6394
fn f<T: DeviceRepr>(

0 commit comments

Comments
 (0)