@@ -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+
6192struct Clone ;
6293impl Map1 for Clone {
6394 fn f < T : DeviceRepr > (
0 commit comments