metal: fuse snake activation (mul, sin, sqr, mul, add) (#25459)

* metal: fuse snake activation (mul, sin, sqr, mul, add)

Mirror the CUDA, Vulkan and CPU snake fusion: same matcher on the naive
5-op chain, same F32 contract on a and inv_b, same F32/F16/BF16 kernel
with F32 compute. Follows the Metal backend idioms: bf16 instantiation
gated behind GGML_METAL_HAS_BF16 and concurrency ranges checked on the
remaining chain nodes before encoding, as done by the bin fusion.

Covered by the existing backend-agnostic SNAKE_FUSE tests.

* metal: absorb snake fusion into ggml_metal_op_bin

Extract the matcher to ggml_metal_op_can_fuse_snake, mirroring the
Vulkan naming, and dispatch the fused path from ggml_metal_op_bin.
The encode loop switch is back to a single call per case.

Address review from ggerganov

* metal: fix indentation in ggml_metal_op_can_fuse_snake
This commit is contained in:
Pascal
2026-07-15 13:53:31 +03:00
committed by GitHub
parent f955e394bf
commit b3c9d1b846
6 changed files with 153 additions and 0 deletions
+5
View File
@@ -616,6 +616,11 @@ typedef struct {
int32_t p0;
} ggml_metal_kargs_col2im_1d;
typedef struct {
int32_t T;
int32_t C;
} ggml_metal_kargs_snake;
typedef struct {
int32_t IC;
int32_t IH;