@@ -46,6 +46,7 @@ impl crate::scalar::Scalar {
4646 Scalar :: F64 ( v) => builder. arg ( v) ,
4747 Scalar :: F16 ( v) => builder. arg ( v) ,
4848 Scalar :: BF16 ( v) => builder. arg ( v) ,
49+ Scalar :: F8E4M3 ( v) => builder. arg ( v) ,
4950 } ;
5051 }
5152}
@@ -1330,6 +1331,7 @@ impl BackendStorage for CudaStorage {
13301331 S :: F16 ( s) => ( slice_ptr ( s, src_o) , "const_set_f16" ) ,
13311332 S :: F32 ( s) => ( slice_ptr ( s, src_o) , "const_set_f32" ) ,
13321333 S :: F64 ( s) => ( slice_ptr ( s, src_o) , "const_set_f64" ) ,
1334+ S :: F8E4M3 ( s) => ( slice_ptr ( s, src_o) , "const_set_f8_e4m3" ) ,
13331335 } ;
13341336
13351337 let func = dev. get_or_load_func ( kernel_name, & kernels:: FILL ) ?;
@@ -1448,9 +1450,16 @@ impl BackendStorage for CudaStorage {
14481450 CudaStorageSlice :: F64 ( out)
14491451 }
14501452 DType :: F8E4M3 => {
1451- let out = unsafe { dev. alloc :: < F8E4M3 > ( el) } . w ( ) ?;
1452- let params = ( el, dims. len ( ) , & ds, * inp, & out) ;
1453- unsafe { func. launch ( cfg, params) } . w ( ) ?;
1453+ let out: CudaSlice < F8E4M3 > = unsafe { dev. alloc :: < F8E4M3 > ( el) } ?;
1454+
1455+ let mut builder = func. builder ( ) ;
1456+ barg ! ( builder, el) ;
1457+ barg ! ( builder, dims. len( ) ) ;
1458+ ds. builder_arg ( & mut builder) ;
1459+ barg ! ( builder, * inp) ;
1460+ builder. arg ( & out) ;
1461+ unsafe { builder. launch ( cfg) } . w ( ) ?;
1462+
14541463 CudaStorageSlice :: F8E4M3 ( out)
14551464 }
14561465 } ;
@@ -1538,8 +1547,7 @@ impl BackendStorage for CudaStorage {
15381547 Ok ( CpuStorage :: F64 ( cpu_storage) )
15391548 }
15401549 CudaStorageSlice :: F8E4M3 ( slice) => {
1541- let dev = slice. device ( ) ;
1542- let cpu_storage = dev. dtoh_sync_copy ( slice) . w ( ) ?;
1550+ let cpu_storage = slice. stream ( ) . memcpy_dtov ( slice) . w ( ) ?;
15431551 Ok ( CpuStorage :: F8E4M3 ( cpu_storage) )
15441552 }
15451553 }
@@ -2119,13 +2127,17 @@ impl BackendStorage for CudaStorage {
21192127 ( CudaStorageSlice :: F8E4M3 ( src) , CudaStorageSlice :: F8E4M3 ( dst) ) => {
21202128 let ( src, mut dst) = slice_src_and_dst ( src, src_l, dst, dst_offset) ;
21212129 if src_l. is_contiguous ( ) {
2122- dev. dtod_copy ( & src, & mut dst) . w ( ) ?
2130+ dev. memcpy_dtod ( & src, & mut dst) ?
21232131 } else {
2124- let func = dev. get_or_load_func ( "ucopy_f8_e4m3" , kernels:: UNARY ) ?;
2125- // SAFETY: Set later by running the kernel.
2126- let params = ( el_count, dims. len ( ) , & ds, & src, & mut dst) ;
2132+ let func = dev. get_or_load_func ( "ucopy_f8_e4m3" , & kernels:: UNARY ) ?;
2133+ let mut builder = func. builder ( ) ;
2134+ barg ! ( builder, el_count) ;
2135+ barg ! ( builder, dims. len( ) ) ;
2136+ ds. builder_arg ( & mut builder) ;
2137+ builder. arg ( & src) ;
2138+ builder. arg ( & mut dst) ;
21272139 // SAFETY: ffi.
2128- unsafe { func . launch ( cfg, params ) } . w ( ) ?
2140+ unsafe { builder . launch ( cfg) } . w ( ) ?;
21292141 }
21302142 }
21312143 ( CudaStorageSlice :: U8 ( src) , CudaStorageSlice :: U8 ( dst) ) => {
0 commit comments