1- use crate :: { CpuStorage , DType , Device , Result , Shape , Storage , Tensor , D } ;
1+ use crate :: {
2+ backend:: BackendStorage , CpuStorage , DType , Device , Result , Shape , Storage , Tensor , D ,
3+ } ;
24use k_quants:: * ;
35use std:: borrow:: Cow ;
46
@@ -386,6 +388,7 @@ impl GgmlDType {
386388pub trait QuantizedType : Send + Sync {
387389 fn dtype ( & self ) -> GgmlDType ;
388390 fn matmul_t ( & self , mkn : ( usize , usize , usize ) , lhs : & [ f32 ] , dst : & mut [ f32 ] ) -> Result < ( ) > ;
391+ fn matmul_t_f16 ( & self , mkn : ( usize , usize , usize ) , lhs : & [ f16 ] , dst : & mut [ f16 ] ) -> Result < ( ) > ;
389392 fn dequantize ( & self , elem_count : usize ) -> Result < CpuStorage > ;
390393 fn storage_size_in_bytes ( & self ) -> usize ;
391394 fn as_ptr ( & self ) -> * const u8 ;
@@ -406,6 +409,9 @@ impl<T: k_quants::GgmlType + Send + Sync> QuantizedType for Vec<T> {
406409 fn matmul_t ( & self , mkn : ( usize , usize , usize ) , lhs : & [ f32 ] , dst : & mut [ f32 ] ) -> Result < ( ) > {
407410 k_quants:: matmul ( mkn, lhs, self . as_slice ( ) , dst)
408411 }
412+ fn matmul_t_f16 ( & self , mkn : ( usize , usize , usize ) , lhs : & [ f16 ] , dst : & mut [ f16 ] ) -> Result < ( ) > {
413+ k_quants:: matmul_f16 ( mkn, lhs, self . as_slice ( ) , dst)
414+ }
409415
410416 fn size ( & self ) -> usize {
411417 self . len ( ) * core:: mem:: size_of :: < T > ( )
@@ -750,11 +756,33 @@ impl crate::CustomOp1 for QTensor {
750756 QStorage :: Cpu ( storage) => storage,
751757 QStorage :: Metal ( _) | QStorage :: Cuda ( _) => crate :: bail!( "Invalid storage" ) ,
752758 } ;
753- let slice = storage. as_slice :: < f32 > ( ) ?;
754- let slice = & slice[ layout. start_offset ( ) ..layout. start_offset ( ) + src_shape. elem_count ( ) ] ;
755- let mut dst_storage = vec ! [ 0f32 ; dst_shape. elem_count( ) ] ;
756- self_storage. matmul_t ( ( dst_shape. elem_count ( ) / n, k, n) , slice, & mut dst_storage) ?;
757- Ok ( ( crate :: CpuStorage :: F32 ( dst_storage) , dst_shape) )
759+ match storage. dtype ( ) {
760+ DType :: F32 => {
761+ let slice = storage. as_slice :: < f32 > ( ) ?;
762+ let slice =
763+ & slice[ layout. start_offset ( ) ..layout. start_offset ( ) + src_shape. elem_count ( ) ] ;
764+ let mut dst_storage = vec ! [ 0f32 ; dst_shape. elem_count( ) ] ;
765+ self_storage. matmul_t (
766+ ( dst_shape. elem_count ( ) / n, k, n) ,
767+ slice,
768+ & mut dst_storage,
769+ ) ?;
770+ Ok ( ( crate :: CpuStorage :: F32 ( dst_storage) , dst_shape) )
771+ }
772+ DType :: F16 => {
773+ let slice = storage. as_slice :: < f16 > ( ) ?;
774+ let slice =
775+ & slice[ layout. start_offset ( ) ..layout. start_offset ( ) + src_shape. elem_count ( ) ] ;
776+ let mut dst_storage = vec ! [ f16:: ZERO ; dst_shape. elem_count( ) ] ;
777+ self_storage. matmul_t_f16 (
778+ ( dst_shape. elem_count ( ) / n, k, n) ,
779+ slice,
780+ & mut dst_storage,
781+ ) ?;
782+ Ok ( ( crate :: CpuStorage :: F16 ( dst_storage) , dst_shape) )
783+ }
784+ _ => crate :: bail!( "Expected f32/f16" ) ,
785+ }
758786 }
759787
760788 fn metal_fwd (
0 commit comments