Files
TheRock/rocm-libraries/projects/composablekernel/dispatcher/scripts/generate_profiler_kernels.py
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

173 lines
6.3 KiB
Python
Executable File

#!/usr/bin/env python3
# Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
# SPDX-License-Identifier: MIT
#
# Generates dispatcher-based kernels for the CK Profiler (all directions).
#
# This script:
# 1. Generates GEMM + depthwise configs from tile_math rules via get_default_configs()
# 2. Calls UnifiedGroupedConvCodegen.generate_all() to emit C++ kernel headers
# 3. Generates include_all_grouped_conv_<variant>_kernels.hpp
# 4. Generates chunked register_*_chunk_N.cpp files + register_all_grouped_conv_kernels.cpp
#
# Usage:
# python3 generate_profiler_kernels.py \
# --variant {fwd,bwd_data,bwd_weight} \
# --output-dir <generated-kernel-output-dir> \
# --arch gfx950 \
# [--mode tests|profiler]
import argparse
import sys
from pathlib import Path
from registration_codegen import generate_chunked_registration
VARIANT_CONFIG = {
"fwd": {
"glob_pattern": "grouped_conv_fwd_*.hpp",
"include_all_header": "include_all_grouped_conv_fwd_kernels.hpp",
"description": "forward",
"op_enum": "GroupedConvOp::Forward",
"run_fn_maker": "backends::make_conv_fwd_run_fn",
"is_supported_fn_maker": "backends::make_conv_fwd_is_supported_fn",
"register_fn_name": "register_all_grouped_conv_fwd_kernels",
},
"bwd_data": {
"glob_pattern": "grouped_conv_bwd_data_*.hpp",
"include_all_header": "include_all_grouped_conv_bwd_data_kernels.hpp",
"description": "backward data",
"op_enum": "GroupedConvOp::BackwardData",
"run_fn_maker": "backends::make_conv_bwd_data_run_fn",
"is_supported_fn_maker": "backends::make_conv_bwd_data_is_supported_fn",
"register_fn_name": "register_all_grouped_conv_bwd_data_kernels",
},
"bwd_weight": {
"glob_pattern": "grouped_conv_bwd_weight_*.hpp",
"include_all_header": "include_all_grouped_conv_bwd_weight_kernels.hpp",
"description": "backward weight",
"op_enum": "GroupedConvOp::BackwardWeight",
"run_fn_maker": "backends::make_conv_bwd_weight_run_fn",
"is_supported_fn_maker": "backends::make_conv_bwd_weight_is_supported_fn",
"register_fn_name": "register_all_grouped_conv_bwd_weight_kernels",
},
}
VARIANT_MAP = {
"fwd": "FORWARD",
"bwd_data": "BACKWARD_DATA",
"bwd_weight": "BACKWARD_WEIGHT",
}
def _ensure_codegen_importable():
"""Ensure the codegen directory is on sys.path."""
codegen_dir = str(Path(__file__).resolve().parent.parent / "codegen")
if codegen_dir not in sys.path:
sys.path.insert(0, codegen_dir)
def collect_kernel_headers(output_dir, glob_pattern):
"""Collect all generated .hpp kernel headers matching the variant pattern."""
headers = sorted(Path(output_dir).glob(glob_pattern))
return headers
def generate_include_all_header(headers, output_dir, header_filename, description):
"""Generate include_all_grouped_conv_<variant>_kernels.hpp."""
lines = [
"// Auto-generated \u2014 do not edit",
f"// Includes all generated {description} kernel headers.",
"#pragma once",
"",
]
for h in headers:
lines.append(f'#include "{h.name}"')
lines.append("")
path = Path(output_dir) / header_filename
path.write_text("\n".join(lines))
print(f"Generated {path} ({len(headers)} includes)")
return path
def main():
parser = argparse.ArgumentParser(
description="Generate dispatcher-based kernels for CK Profiler."
)
parser.add_argument("--variant", required=True, choices=list(VARIANT_CONFIG.keys()))
parser.add_argument("--output-dir", required=True)
parser.add_argument("--arch", default="gfx950")
parser.add_argument("--rule-set", default="tests",
choices=["profiler", "tests", "full", "full-tests", "tiny", "default"],
help="Rule set: 'profiler'/'tests' (CK Builder "
"profiler/tests instance sets generated in memory "
"from the .conf configs), 'full' (full rule-derived "
"per-(variant,ndim,datatype) set), 'full-tests' "
"(~20% stratified subset of 'full'), 'tiny' "
"(minimal >=10-config subset of 'full-tests'), or "
"'default' (original hand-curated heuristics)")
args = parser.parse_args()
cfg = VARIANT_CONFIG[args.variant]
output_dir = Path(args.output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
_ensure_codegen_importable()
from unified_grouped_conv_codegen import (
UnifiedGroupedConvCodegen,
GroupedConvVariant,
get_default_configs,
)
variant_enum = GroupedConvVariant[VARIANT_MAP[args.variant]]
datatypes = ["fp16", "bf16", "fp32"]
# --- Step 1: Generate configs from rules ---
print(f"Generating configs from rules (variant={args.variant}, "
f"arch={args.arch}, rule_set={args.rule_set})...")
configs = get_default_configs(
arch=args.arch,
variants=[variant_enum],
ndims=[2, 3],
datatypes=datatypes,
rule_set=args.rule_set,
)
print(f"Generated {len(configs)} configs from rules")
if not configs:
print("ERROR: No configs generated from rules", file=sys.stderr)
sys.exit(1)
# --- Step 2: Generate kernel headers ---
codegen = UnifiedGroupedConvCodegen(
output_dir=output_dir, gpu_target=args.arch, enable_arch_filter=False,
)
codegen.generate_all(configs, datatypes=datatypes)
# --- Step 3: Collect headers and generate registration ---
headers = collect_kernel_headers(output_dir, cfg["glob_pattern"])
print(f"Found {len(headers)} generated kernel headers")
if not headers:
print("ERROR: No kernel headers generated", file=sys.stderr)
sys.exit(1)
generate_include_all_header(headers, output_dir, cfg["include_all_header"], cfg["description"])
generate_chunked_registration(
headers, output_dir,
variant=args.variant,
op_enum=cfg["op_enum"],
run_fn_maker=cfg["run_fn_maker"],
is_supported_fn_maker=cfg["is_supported_fn_maker"],
register_fn_name=cfg["register_fn_name"],
)
print(f"\nDone. {len(headers)} kernels ready in {output_dir}")
if __name__ == "__main__":
main()