blob: 3df614274178df525b3957a5bb9933d7a2ed75b2 [file] [edit]
"""Build parameters for XNNPACK.
Arch-specific build parameters and utility functions.
"""
load(
":build_defs.bzl",
"xnnpack_cc_library",
"xnnpack_if_kleidiai_enabled",
"xnnpack_select_if",
)
# buildifier: disable=out-of-order-load
load("//:register_extension_info.bzl", "register_extension_info")
def xnnpack_src_to_target_name(src):
src = src.split("/")[-1]
src = src.split(".")[0]
return src.replace("-", "_")
def xnnpack_list_sum(values, initial = 0):
result = initial
for value in values:
result += value
return result
def _create_params(
cond = None,
extra_deps = None,
**kwargs):
# Set defaults for unspecified parameters.
extra_deps = extra_deps or []
return struct(
cond = cond,
extra_deps = extra_deps,
extra_kwargs = kwargs,
)
def xnnpack_copts_for_arch(arch):
params = XNNPACK_PARAMS_FOR_ARCH[arch]
kwargs = params.extra_kwargs
return (kwargs.get("copts", []) +
xnnpack_select_if(
"//build_config:x86",
kwargs.get("gcc_x86_copts", []),
))
def xnnpack_target_compatible_with_for_arch(arch):
params = XNNPACK_PARAMS_FOR_ARCH[arch]
return xnnpack_select_if(
cond = params.cond,
val_false = ["@platforms//:incompatible"],
val_true = [],
)
def xnnpack_cond_for_arch(arch):
return XNNPACK_PARAMS_FOR_ARCH[arch].cond
def xnnpack_cc_library_for_arch(arch, name, deps = None, **kwargs):
"""Creates an xnnpack_cc_library target for the given `arch` name.
Args:
arch: The name of the architecture to create the target for.
name: The name of the target to create.
deps: The list of dependencies to add to the target.
**kwargs: Other arguments to pass to the xnnpack_cc_library target.
"""
# Get the params for the given arch.
params = XNNPACK_PARAMS_FOR_ARCH[arch]
# Set defaults for unspecified parameters.
deps = (deps or []) + params.extra_deps
# Merge the kwargs with the extra args from the params.
for key, val in params.extra_kwargs.items():
if key in kwargs:
kwargs[key] += val
else:
kwargs[key] = val
xnnpack_cc_library(
name = name,
target_compatible_with = xnnpack_select_if(
cond = params.cond,
val_false = ["@platforms//:incompatible"],
val_true = [],
),
deps = deps,
**kwargs
)
register_extension_info(
extension = xnnpack_cc_library_for_arch,
label_regex_for_dep = "{extension_name}",
)
_XNNPACK_SIMD_ARCH_COPT_MAPPING = {
"avx": xnnpack_select_if("//build_config:x86", ["-mavx"]),
"avx2": xnnpack_select_if("//build_config:x86", ["-mavx2"]),
"avx512f": xnnpack_select_if("//build_config:x86", ["-mavx512f"]),
"avx512skx": xnnpack_select_if(
"//build_config:x86",
[
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
],
),
"avx512fp16": xnnpack_select_if(
"//:avx512fp16_enabled",
[
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
"-mavx512vnni",
"-mgfni",
"-mavx512fp16",
],
),
"fma3": xnnpack_select_if("//build_config:x86", ["-mfma"]),
"neon": select({
"//build_config:aarch32": [
"-marm",
"-march=armv7-a",
"-mfpu=neon",
],
"//conditions:default": [],
}),
"neonfp16arith": select({
"//build_config:aarch32": [
"-marm",
"-march=armv8.2-a+fp16",
"-mfpu=neon-fp-armv8",
],
"//build_config:aarch64": ["-march=armv8.2-a+fp16"],
"//conditions:default": [],
}),
"sse2": xnnpack_select_if("//build_config:x86", ["-msse2"]),
"sse41": xnnpack_select_if("//build_config:x86", ["-msse4.1"]),
"hvx": xnnpack_select_if("//build_config:hexagon", ["-mhvx-ieee-fp"]),
}
def xnnpack_simd_copts_for_arch(arch):
return _XNNPACK_SIMD_ARCH_COPT_MAPPING.get(arch, [])
def xnnpack_simd_f32_archs():
return ["avx", "avx2", "avx512f", "fma3", "hvx", "neon", "scalar", "sse2", "sse2fma", "wasmsimd", "wasmrelaxedsimd"]
def xnnpack_simd_f16_archs():
return ["scalar", "neonfp16arith", "avx512fp16"]
def xnnpack_simd_s16_archs():
return ["avx2", "avx512skx", "neon", "scalar", "sse41", "wasmsimd"]
def xnnpack_simd_s32_archs():
return ["avx2", "avx512f", "neon", "scalar", "sse41", "hvx", "wasmsimd"]
def xnnpack_simd_s8_archs():
return ["scalar", "sse41", "neon", "hvx", "wasmsimd"]
def xnnpack_simd_u8_archs():
return ["scalar", "sse2", "neon", "hvx", "wasmsimd"]
def xnnpack_archs():
return XNNPACK_PARAMS_FOR_ARCH.keys()
def _x86_align_stack(alignment):
"""Adds `copt`s to align the stack to the given `alignment` for `x86`."""
log2_alignment = 0
temp = alignment
for _ in range(64):
if temp == 0:
break
log2_alignment += 1
temp = temp // 2
return select({
"//build_config:clang_and_not_fuchsia_or_ios": [
"-mstack-alignment=" + str(alignment),
"-fomit-frame-pointer",
"-mstackrealign",
],
"//build_config:gcc": [
"-mpreferred-stack-boundary=" + str(log2_alignment),
"-fomit-frame-pointer",
"-mstackrealign",
"-mincoming-stack-boundary=4",
],
"//conditions:default": [],
})
XNNPACK_PARAMS_FOR_ARCH = {
# Scalar.
"scalar": _create_params(
copts = xnnpack_select_if(
"//build_config:aarch32",
["-marm"],
) + [
"-fno-fast-math",
"-fno-math-errno",
"-ffp-contract=off",
],
extra_deps = [
"//src/configs:config_hdrs",
"@FXdiv",
],
),
# Emscripten.
"wasm": _create_params(
cond = "//build_config:emscripten_wasm",
copts = [
"-fno-fast-math",
"-fno-math-errno",
],
),
"wasmsimd": _create_params(
cond = "//build_config:emscripten_wasmsimd",
copts = [
"-fno-fast-math",
"-fno-math-errno",
],
),
"wasmrelaxedsimd": _create_params(
cond = "//build_config:emscripten_wasmrelaxedsimd",
copts = [
"-fno-fast-math",
"-fno-math-errno",
"-mfp16",
],
),
"wasm32": _create_params(
cond = "//build_config:emscripten_wasm",
),
"wasmsimd32": _create_params(
cond = "//build_config:emscripten_wasmsimd",
),
"wasmrelaxedsimd32": _create_params(
cond = "//build_config:emscripten_wasmrelaxedsimd",
),
# ARM.
"armsimd32": _create_params(
cond = "//build_config:aarch32",
copts = [
"-marm",
"-march=armv6",
"-mfpu=vfp",
"-munaligned-access",
"-fno-fast-math",
"-fno-math-errno",
],
),
"fp16arith": _create_params(
cond = "//:arm_fp16_scalar_enabled",
copts = select({
"//build_config:aarch32": [
"-marm",
"-march=armv8.2-a+fp16",
# GCC emits wrong directives for assembler with -mfpu=fp-armv8
"-mfpu=neon-fp-armv8",
# For vsqrth_f16 polyfill using sqrtf
"-fno-math-errno",
# For vminh_f16/vmaxh_f16 polyfills using compare + select
"-ffinite-math-only",
],
"//build_config:aarch64": ["-march=armv8.2-a+fp16"],
"//conditions:default": [],
}),
extra_deps = xnnpack_if_kleidiai_enabled([
"@KleidiAI//kai/ukernels/matmul",
]),
),
"neon": _create_params(
cond = "//build_config:arm",
copts = xnnpack_select_if(
"//build_config:aarch32",
[
"-marm",
"-march=armv7-a",
"-mfpu=neon",
],
),
extra_deps = xnnpack_if_kleidiai_enabled([
"@KleidiAI//kai/ukernels/matmul",
]),
),
"neon_aarch64": _create_params(
cond = "//build_config:aarch64",
extra_deps = xnnpack_if_kleidiai_enabled([
"@KleidiAI//kai/ukernels/matmul",
]),
),
"neonfp16": _create_params(
cond = "//build_config:arm",
copts = xnnpack_select_if(
"//build_config:aarch32",
[
"-marm",
"-march=armv7-a",
"-mfpu=neon-fp16",
],
),
),
"neonfma": _create_params(
cond = "//build_config:arm",
copts = xnnpack_select_if(
"//build_config:aarch32",
[
"-marm",
"-march=armv7-a",
"-mfpu=neon-vfpv4",
],
),
),
"neonfma_aarch64": _create_params(
cond = "//build_config:aarch64",
),
"neonv8": _create_params(
cond = "//build_config:arm",
copts = xnnpack_select_if(
"//build_config:aarch32",
[
"-marm",
"-march=armv8-a",
"-mfpu=neon-fp-armv8",
],
),
),
"neonfp16arith": _create_params(
cond = "//:arm_fp16_vector_enabled",
copts = select({
"//build_config:aarch32": [
"-marm",
"-march=armv8.2-a+fp16",
"-mfpu=neon-fp-armv8",
],
"//build_config:aarch64": ["-march=armv8.2-a+fp16"],
"//conditions:default": [],
}),
),
"neonfp16arith_aarch64": _create_params(
cond = "//:arm_aarch64_fp16_vector_enabled",
copts = ["-march=armv8.2-a+fp16"],
),
"neonbf16": _create_params(
cond = "//build_config:aarch64",
copts = ["-march=armv8.2-a+bf16"],
),
"neondotfp16arith": _create_params(
cond = "//:arm_neondotfp16_enabled",
copts = select({
"//build_config:aarch32": [
"-marm",
"-march=armv8.2-a+dotprod+fp16",
"-mfpu=neon-fp-armv8",
],
"//build_config:aarch64": ["-march=armv8.2-a+dotprod+fp16"],
"//conditions:default": [],
}),
),
"neondot": _create_params(
cond = "//:arm_dotprod_enabled",
copts = select({
"//build_config:aarch32": [
"-marm",
"-march=armv8.2-a+dotprod",
"-mfpu=neon-fp-armv8",
],
"//build_config:aarch64": ["-march=armv8.2-a+dotprod"],
"//conditions:default": [],
}),
),
"neondot_aarch64": _create_params(
cond = "//:arm_aarch64_dotprod_enabled",
copts = ["-march=armv8.2-a+dotprod"],
extra_deps = xnnpack_if_kleidiai_enabled([
"@KleidiAI//kai/ukernels/matmul:matmul",
]),
),
"neoni8mm": _create_params(
cond = "//:arm_i8mm_enabled",
copts = ["-march=armv8.2-a+i8mm+fp16"],
extra_deps = xnnpack_if_kleidiai_enabled([
"@KleidiAI//kai/ukernels/matmul:matmul",
]),
),
"neonsme": _create_params(
cond = "//:arm_sme_enabled",
copts = ["-march=armv8.2-a+sve+sve2"],
extra_deps = xnnpack_if_kleidiai_enabled([
"@KleidiAI//kai/ukernels/matmul:matmul",
]),
),
"neonsme2": _create_params(
cond = "//:arm_sme2_enabled",
copts = ["-march=armv8.2-a+sve+sve2"],
extra_deps = xnnpack_if_kleidiai_enabled([
"@KleidiAI//kai/ukernels/matmul:matmul",
]),
),
"aarch32": _create_params(
cond = "//build_config:aarch32",
copts = [
"-marm",
"-march=armv8.2-a+dotprod+fp16",
"-mfpu=neon-fp-armv8",
],
),
"aarch64": _create_params(
cond = "//build_config:aarch64",
copts = ["-march=armv8.2-a+fp16+dotprod"],
),
# X86.
"sse": _create_params(
cond = "//build_config:x86",
copts = _x86_align_stack(16),
gcc_x86_copts = [
"-msse",
"-mno-sse2",
],
msvc_x86_32_copts = ["/arch:SSE"],
msvc_x86_64_copts = ["/arch:SSE"],
),
"sse2": _create_params(
cond = "//build_config:x86",
copts = _x86_align_stack(16),
gcc_x86_copts = [
"-msse2",
"-mno-sse3",
],
msvc_x86_32_copts = ["/arch:SSE2"],
msvc_x86_64_copts = ["/arch:SSE2"],
),
"sse2fma": _create_params(
cond = "//build_config:x86",
copts = _x86_align_stack(16),
gcc_x86_copts = [
"-msse2",
"-mno-sse3",
],
msvc_x86_32_copts = ["/arch:SSE2"],
msvc_x86_64_copts = ["/arch:SSE2"],
),
"ssse3": _create_params(
cond = "//build_config:x86",
copts = _x86_align_stack(16),
gcc_x86_copts = [
"-mssse3",
"-mno-sse4.1",
],
msvc_x86_32_copts = ["/arch:SSE2"],
msvc_x86_64_copts = ["/arch:SSE2"],
),
"sse41": _create_params(
cond = "//build_config:x86",
copts = _x86_align_stack(16),
gcc_x86_copts = [
"-msse4.1",
"-mno-sse4.2",
],
extra_deps = [
],
msvc_x86_32_copts = ["/arch:SSE2"],
msvc_x86_64_copts = ["/arch:SSE2"],
),
"avx": _create_params(
cond = "//build_config:x86",
copts = _x86_align_stack(32),
gcc_x86_copts = [
"-mavx",
"-mno-avx2",
"-mno-f16c",
"-mno-fma",
],
msvc_x86_32_copts = ["/arch:AVX"],
msvc_x86_64_copts = ["/arch:AVX"],
),
"avxvnni": _create_params(
cond = "//:avxvnni_enabled",
copts = _x86_align_stack(32),
gcc_x86_copts = [
"-mavx2",
"-mavxvnni",
"-mf16c",
"-mfma",
"-mgfni",
],
msvc_x86_32_copts = ["/arch:AVX"],
msvc_x86_64_copts = ["/arch:AVX"],
),
"avxvnniint8": _create_params(
cond = "//:avxvnniint8_enabled",
copts = _x86_align_stack(32),
gcc_x86_copts = [
"-mavx2",
"-mavxvnniint8",
"-mf16c",
"-mfma",
"-mgfni",
],
msvc_x86_32_copts = ["/arch:AVX"],
msvc_x86_64_copts = ["/arch:AVX"],
),
"f16c": _create_params(
cond = "//build_config:x86",
copts = _x86_align_stack(32),
gcc_x86_copts = [
"-mf16c",
"-mno-avx2",
"-mno-fma",
],
msvc_x86_32_copts = ["/arch:AVX"],
msvc_x86_64_copts = ["/arch:AVX"],
),
"fma3": _create_params(
cond = "//build_config:x86",
copts = _x86_align_stack(32),
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mno-avx2",
],
msvc_x86_32_copts = ["/arch:AVX"],
msvc_x86_64_copts = ["/arch:AVX"],
),
"avx2": _create_params(
cond = "//build_config:x86",
copts = _x86_align_stack(32),
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx2",
],
msvc_x86_32_copts = ["/arch:AVX2"],
msvc_x86_64_copts = ["/arch:AVX2"],
),
"avx512f": _create_params(
cond = "//:avx512f_enabled",
copts = _x86_align_stack(64),
gcc_x86_copts = [
"-mavx512f",
],
msvc_x86_32_copts = ["/arch:AVX512"],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
"avx512skx": _create_params(
cond = "//:avx512skx_enabled",
copts = _x86_align_stack(64),
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
],
msvc_x86_32_copts = ["/arch:AVX512"],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
"avx256skx": _create_params(
cond = "//:avx256skx_enabled",
copts = _x86_align_stack(32),
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
],
msvc_x86_32_copts = ["/arch:AVX512"],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
"avx512vbmi": _create_params(
cond = "//:avx512vbmi_enabled",
copts = _x86_align_stack(64),
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
"-mavx512vbmi",
],
msvc_x86_32_copts = ["/arch:AVX512"],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
"avx512vnni": _create_params(
cond = "//:avx512vnni_enabled",
copts = _x86_align_stack(64),
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
"-mavx512vnni",
],
msvc_x86_32_copts = ["/arch:AVX512"],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
"avx256vnni": _create_params(
cond = "//:avx256vnni_enabled",
copts = _x86_align_stack(32),
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
"-mavx512vnni",
],
msvc_x86_32_copts = ["/arch:AVX512"],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
"avx512vnnigfni": _create_params(
cond = "//:avx512vnnigfni_enabled",
copts = _x86_align_stack(64),
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
"-mavx512vnni",
"-mgfni",
],
msvc_x86_32_copts = ["/arch:AVX512"],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
"avx256vnnigfni": _create_params(
cond = "//:avx256vnnigfni_enabled",
copts = _x86_align_stack(32),
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
"-mavx512vnni",
"-mgfni",
],
msvc_x86_32_copts = ["/arch:AVX512"],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
"avx512amx": _create_params(
cond = "//:avx512amx_enabled",
copts = _x86_align_stack(64),
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
"-mavx512vnni",
"-mgfni",
"-mamx-tile",
"-mamx-int8",
],
msvc_x86_32_copts = ["/arch:AVX512"],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
"avx512fp16": _create_params(
cond = "//:avx512fp16_enabled",
copts = _x86_align_stack(64),
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
"-mavx512vnni",
"-mgfni",
"-mavx512fp16",
],
msvc_x86_32_copts = ["/arch:AVX512"],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
"avx512bf16": _create_params(
cond = "//:avx512bf16_enabled",
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
"-mavx512vnni",
"-mgfni",
"-mavx512bf16",
],
msvc_x86_32_copts = ["/arch:AVX512"],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
# RISC-V.
"rvv": _create_params(
cond = "//:riscv_vector_enabled",
copts = [
"-march=rv64gcv",
"-mabi=lp64d",
],
),
"rvvfp16arith": _create_params(
cond = "//:riscv_fp16_vector_enabled",
copts = [
"-march=rv64gc_zvfh",
"-mabi=lp64d",
],
),
# Hexagon.
"hexagon": _create_params(
cond = "//:hvx_enabled",
copts = [
"-mhvx-ieee-fp",
],
extra_deps = [], # Extra deps for hexagon.
),
"hvx": _create_params(
cond = "//:hvx_enabled",
copts = [
"-mhvx-ieee-fp",
],
extra_deps = [], # Extra deps for hexagon.
),
"amd64": _create_params(
cond = "//build_config:x86_64",
gcc_x86_copts = [
"-mf16c",
"-mfma",
"-mavx512f",
"-mavx512cd",
"-mavx512bw",
"-mavx512dq",
"-mavx512vl",
"-mavx512vnni",
"-mgfni",
],
msvc_x86_64_copts = ["/arch:AVX512"],
mingw_copts = ["-fno-asynchronous-unwind-tables"],
msys_copts = ["-fno-asynchronous-unwind-tables"],
),
}