(
&self,
buf_x: &MappedBuffer,
buf_w: &MappedBuffer,
buf_w_f16: Option<&Arc<MappedBuffer>>,
k: usize,
n: usize,
)
| 916 | /// Returns (result_data, output_buffer) so caller can cache the buffer. |
| 917 | #[allow(dead_code)] |
| 918 | fn gpu_gemv( |
| 919 | &self, |
| 920 | buf_x: &MappedBuffer, |
| 921 | buf_w: &MappedBuffer, |
| 922 | buf_w_f16: Option<&Arc<MappedBuffer>>, |
| 923 | k: usize, |
| 924 | n: usize, |
| 925 | ) -> (Vec<f32>, MappedBuffer) { |
| 926 | let buf_y = self.alloc_output(n); |
| 927 | // Use F16 kernel if available — halves memory bandwidth |
| 928 | let (entry, w_buf) = if let Some(f16_buf) = buf_w_f16 { |
| 929 | ("gemv_f16", f16_buf.buffer) |
| 930 | } else { |
| 931 | ("gemv", buf_w.buffer) |
| 932 | }; |
| 933 | let result = self.dispatch_compute( |
| 934 | entry, |
| 935 | &[buf_x.buffer, w_buf, buf_y.buffer], |
| 936 | &buf_y, |
| 937 | n, |
| 938 | &[n as u32, k as u32, 0, 0], |
| 939 | ((n as u32).div_ceil(256), 1, 1), |
| 940 | ); |
| 941 | (result, buf_y) |
| 942 | } |
| 943 | |
| 944 | fn gpu_gemm( |
| 945 | &self, |
no test coverage detected