Skip to content

Commit 317a343

Browse files
authored
Make gemv JIT compilable (#3705)
1 parent c9e8ee6 commit 317a343

9 files changed

Lines changed: 905 additions & 760 deletions

File tree

mlx/backend/metal/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ if(MLX_METAL_JIT)
7979
make_jit_source(quantized kernels/quantized_utils.h)
8080
make_jit_source(fp_quantized kernels/quantized_utils.h kernels/fp8.h
8181
kernels/fp4.h)
82+
make_jit_source(gemv)
8283
make_jit_source(gemv_masked)
8384

8485
make_jit_source(steel/attn/kernels/steel_attention)

mlx/backend/metal/jit/includes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ const char* conv();
4343
const char* steel_conv();
4444
const char* steel_conv_3d();
4545
const char* steel_conv_general();
46+
const char* gemv();
4647
const char* gemv_masked();
4748
const char* steel_attention();
4849

mlx/backend/metal/jit_kernels.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,70 @@ MTL::ComputePipelineState* get_steel_gemm_segmented_kernel(
698698
return d.get_kernel(kernel_name, lib, hash_name, func_consts);
699699
}
700700

701+
MTL::ComputePipelineState* get_gemv_kernel(
702+
metal::Device& d,
703+
const std::string& kernel_name,
704+
const array& out,
705+
bool transpose_mat,
706+
int bm,
707+
int bn,
708+
int sm,
709+
int sn,
710+
int tm,
711+
int tn,
712+
bool nc,
713+
bool axpby) {
714+
const auto& lib_name = kernel_name;
715+
auto lib = d.get_library(lib_name, [&]() {
716+
std::ostringstream kernel_source;
717+
kernel_source << metal::gemv()
718+
<< get_template_definition(
719+
lib_name,
720+
transpose_mat ? "gemv_t" : "gemv",
721+
get_type_string(out.dtype()),
722+
bm,
723+
bn,
724+
sm,
725+
sn,
726+
tm,
727+
tn,
728+
nc ? 1 : 0,
729+
axpby ? 1 : 0);
730+
return kernel_source.str();
731+
});
732+
return d.get_kernel(kernel_name, lib);
733+
}
734+
735+
MTL::ComputePipelineState* get_gemv_gather_kernel(
736+
metal::Device& d,
737+
const std::string& kernel_name,
738+
const array& out,
739+
bool transpose_mat,
740+
int bm,
741+
int bn,
742+
int sm,
743+
int sn,
744+
int tm,
745+
int tn) {
746+
const auto& lib_name = kernel_name;
747+
auto lib = d.get_library(lib_name, [&]() {
748+
std::ostringstream kernel_source;
749+
kernel_source << metal::gemv()
750+
<< get_template_definition(
751+
lib_name,
752+
transpose_mat ? "gemv_t_gather" : "gemv_gather",
753+
get_type_string(out.dtype()),
754+
bm,
755+
bn,
756+
sm,
757+
sn,
758+
tm,
759+
tn);
760+
return kernel_source.str();
761+
});
762+
return d.get_kernel(kernel_name, lib);
763+
}
764+
701765
MTL::ComputePipelineState* get_gemv_masked_kernel(
702766
metal::Device& d,
703767
const std::string& kernel_name,

mlx/backend/metal/kernels.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,32 @@ MTL::ComputePipelineState* get_steel_conv_3d_kernel(
212212
int wn,
213213
bool small_filter);
214214

215+
MTL::ComputePipelineState* get_gemv_kernel(
216+
metal::Device& d,
217+
const std::string& kernel_name,
218+
const array& out,
219+
bool transpose_mat,
220+
int bm,
221+
int bn,
222+
int sm,
223+
int sn,
224+
int tm,
225+
int tn,
226+
bool nc,
227+
bool axpby);
228+
229+
MTL::ComputePipelineState* get_gemv_gather_kernel(
230+
metal::Device& d,
231+
const std::string& kernel_name,
232+
const array& out,
233+
bool transpose_mat,
234+
int bm,
235+
int bn,
236+
int sm,
237+
int sn,
238+
int tm,
239+
int tn);
240+
215241
MTL::ComputePipelineState* get_gemv_masked_kernel(
216242
metal::Device& d,
217243
const std::string& kernel_name,

mlx/backend/metal/kernels/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ endfunction(build_kernel)
4848

4949
build_kernel(arg_reduce)
5050
build_kernel(conv steel/conv/params.h)
51-
build_kernel(gemv steel/utils.h)
5251
build_kernel(layer_norm)
5352
build_kernel(random)
5453
build_kernel(rms_norm)
@@ -152,6 +151,7 @@ if(NOT MLX_METAL_JIT)
152151
build_kernel(steel/gemm/kernels/steel_gemm_masked ${STEEL_HEADERS})
153152
build_kernel(steel/gemm/kernels/steel_gemm_splitk ${STEEL_HEADERS})
154153
build_kernel(steel/gemm/kernels/steel_gemm_segmented ${STEEL_HEADERS})
154+
build_kernel(gemv steel/utils.h)
155155
build_kernel(gemv_masked steel/utils.h)
156156
build_kernel(steel/attn/kernels/steel_attention ${STEEL_ATTN_HEADERS})
157157

0 commit comments

Comments
 (0)