blob: fa25dd403b5554022e5c7a639b03909d7c781b38 [file] [edit]
#!/usr/bin/env python3
# Copyright 2024 Google LLC
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
import os
from gemm_compiler import avx512vnni_template
from gemm_compiler import generate
from gemm_compiler import neondot_template
output_base = 'src/qd8-f32-qc4w-gemm/gen/'
def generate_qd8_f32_qc4w_gemm_microkernels():
"""Generates qd8-f32-qc4w assembly gemm microkernels."""
if '/bazel-out/' in os.getcwd():
os.chdir(os.environ['BUILD_WORKING_DIRECTORY'])
for unroll in {1, 2, 4}:
decrement = 32 * unroll
for nr in range(8, 17, 8):
for mr in range(1, 5):
generate.generate_gemm_microkernel(
isa=neondot_template.NeonDotQC4W(mr, nr, unroll),
output_file=os.path.join(
output_base,
f'qd8-f32-qc4w-gemm-{mr}x{nr}-minmax-asm-aarch64-neondot-ld{decrement}.S',
),
)
for unroll in {1, 2, 4}:
decrement = 32 * unroll
for nr in range(8, 16, 8):
for mr in range(1, 8):
generate.generate_gemm_microkernel(
isa=neondot_template.NeonDotQC4W(mr, nr, unroll),
output_file=os.path.join(
output_base,
f'qd8-f32-qc4w-gemm-{mr}x{nr}-minmax-asm-aarch64-neondot-ld{decrement}.S',
),
)
for mr in range(1, 12):
generate.generate_gemm_microkernel(
isa=avx512vnni_template.Avx512VnniQc4w(m=mr, n=32, c=4),
output_file=os.path.join(
output_base,
f'qd8-f32-qc4w-gemm-{mr}x32-minmax-asm-amd64-avx512vnni.S',
),
)
# not enough SIMD registers to go above 5x64
for mr in range(1, 6):
generate.generate_gemm_microkernel(
isa=avx512vnni_template.Avx512VnniQc4w(m=mr, n=64, c=4),
output_file=os.path.join(
output_base,
f'qd8-f32-qc4w-gemm-{mr}x64-minmax-asm-amd64-avx512vnni.S',
),
)
for mr in range(1, 6):
generate.generate_gemm_microkernel(
isa=avx512vnni_template.Avx512VnniQc4w(m=mr, n=32, c=8),
output_file=os.path.join(
output_base,
f'qd8-f32-qc4w-gemm-{mr}x32c8-minmax-asm-amd64-avx512vnni.S',
),
)
for mr in range(1, 12):
generate.generate_gemm_microkernel(
isa=avx512vnni_template.Avx512VnniQc4w(m=mr, n=16, c=8),
output_file=os.path.join(
output_base,
f'qd8-f32-qc4w-gemm-{mr}x16c8-minmax-asm-amd64-avx512vnni.S',
),
)