Files
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

185 lines
6.2 KiB
Python

#!/usr/bin/env python3
"""Generate test .kpack archives for C++ runtime tests.
This script creates minimal .kpack files with known data for testing the C++
runtime API without depending on live build artifacts.
"""
import sys
from pathlib import Path
# Add Python module to path
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "python"))
import msgpack
from rocm_kpack.kpack import PackedKernelArchive
from rocm_kpack.compression import NoOpCompressor, ZstdCompressor
def generate_noop_archive(output_dir: Path) -> None:
"""Generate a NoOp (uncompressed) test archive."""
archive = PackedKernelArchive(
group_name="test",
gfx_arch_family="gfx900X",
gfx_arches=["gfx900", "gfx906"],
compressor=NoOpCompressor(),
)
# Add test kernels with recognizable patterns
# TOC keys always use indexed format: "binary#N"
# Runtime constructs lookup_key as kernel_name + "#" + co_index
#
# Kernel 1: lib/libtest.so#0 @ gfx900
kernel1_data = b"KERNEL1_GFX900_DATA" + b"\x00" * 100
prepared1 = archive.prepare_kernel("lib/libtest.so#0", "gfx900", kernel1_data)
archive.add_kernel(prepared1)
# Kernel 2: lib/libtest.so#0 @ gfx906
kernel2_data = b"KERNEL2_GFX906_DATA" + b"\x00" * 200
prepared2 = archive.prepare_kernel("lib/libtest.so#0", "gfx906", kernel2_data)
archive.add_kernel(prepared2)
# Kernel 3: bin/testapp#0 @ gfx900
kernel3_data = b"KERNEL3_APP_GFX900" + b"\xFF" * 150
prepared3 = archive.prepare_kernel("bin/testapp#0", "gfx900", kernel3_data)
archive.add_kernel(prepared3)
archive.finalize_archive()
output_path = output_dir / "test_noop.kpack"
archive.write(output_path)
print(f"Generated NoOp archive: {output_path}")
print(f" - 2 binaries, 3 kernels (indexed TOC keys)")
print(
f" - lib/libtest.so#0: gfx900 ({len(kernel1_data)} bytes), gfx906 ({len(kernel2_data)} bytes)"
)
print(f" - bin/testapp#0: gfx900 ({len(kernel3_data)} bytes)")
def generate_zstd_archive(output_dir: Path) -> None:
"""Generate a Zstd compressed test archive."""
archive = PackedKernelArchive(
group_name="test",
gfx_arch_family="gfx110X",
gfx_arches=["gfx1100", "gfx1101"],
compressor=ZstdCompressor(compression_level=3),
)
# Add test kernels with compressible patterns
# TOC keys always use indexed format: "binary#N"
#
# Kernel 1: lib/libhip.so#0 @ gfx1100
kernel1_data = b"HIP_KERNEL_GFX1100_" + b"A" * 500 + b"B" * 500
prepared1 = archive.prepare_kernel("lib/libhip.so#0", "gfx1100", kernel1_data)
archive.add_kernel(prepared1)
# Kernel 2: lib/libhip.so#0 @ gfx1101
kernel2_data = b"HIP_KERNEL_GFX1101_" + b"X" * 300 + b"Y" * 300
prepared2 = archive.prepare_kernel("lib/libhip.so#0", "gfx1101", kernel2_data)
archive.add_kernel(prepared2)
# Kernel 3: bin/hiptest#0 @ gfx1100
kernel3_data = b"TEST_APP_KERNEL___" + b"\x42" * 1000
prepared3 = archive.prepare_kernel("bin/hiptest#0", "gfx1100", kernel3_data)
archive.add_kernel(prepared3)
archive.finalize_archive()
output_path = output_dir / "test_zstd.kpack"
archive.write(output_path)
print(f"Generated Zstd archive: {output_path}")
print(f" - 2 binaries, 3 kernels (indexed TOC keys)")
print(
f" - lib/libhip.so#0: gfx1100 ({len(kernel1_data)} bytes), gfx1101 ({len(kernel2_data)} bytes)"
)
print(f" - bin/hiptest#0: gfx1100 ({len(kernel3_data)} bytes)")
def generate_test_manifests(output_dir: Path) -> None:
"""Generate .kpm manifest files for testing manifest resolution."""
# Manifest for test_noop.kpack (gfx900, gfx906)
noop_manifest = {
"format_version": 1,
"component_name": "test_noop",
"prefix": "lib",
"kpack_files": {
"gfx900": {
"file": "test_noop.kpack",
"size": (output_dir / "test_noop.kpack").stat().st_size,
"kernel_count": 2,
},
"gfx906": {
"file": "test_noop.kpack",
"size": (output_dir / "test_noop.kpack").stat().st_size,
"kernel_count": 1,
},
},
}
noop_path = output_dir / "test_noop.kpm"
noop_path.write_bytes(msgpack.packb(noop_manifest))
print(f"Generated manifest: {noop_path}")
print(f" - gfx900, gfx906 -> test_noop.kpack")
# Manifest for test_zstd.kpack (gfx1100, gfx1101)
zstd_manifest = {
"format_version": 1,
"component_name": "test_zstd",
"prefix": "lib",
"kpack_files": {
"gfx1100": {
"file": "test_zstd.kpack",
"size": (output_dir / "test_zstd.kpack").stat().st_size,
"kernel_count": 2,
},
"gfx1101": {
"file": "test_zstd.kpack",
"size": (output_dir / "test_zstd.kpack").stat().st_size,
"kernel_count": 1,
},
},
}
zstd_path = output_dir / "test_zstd.kpm"
zstd_path.write_bytes(msgpack.packb(zstd_manifest))
print(f"Generated manifest: {zstd_path}")
print(f" - gfx1100, gfx1101 -> test_zstd.kpack")
# Partial manifest (only gfx900, no gfx906) for negative tests
partial_manifest = {
"format_version": 1,
"component_name": "test_partial",
"prefix": "lib",
"kpack_files": {
"gfx900": {
"file": "test_noop.kpack",
"size": (output_dir / "test_noop.kpack").stat().st_size,
"kernel_count": 2,
},
},
}
partial_path = output_dir / "test_partial.kpm"
partial_path.write_bytes(msgpack.packb(partial_manifest))
print(f"Generated manifest: {partial_path}")
print(f" - gfx900 only -> test_noop.kpack")
def main() -> None:
"""Generate all test archives."""
# Output to runtime/tests/test_assets
script_dir = Path(__file__).parent
output_dir = script_dir / "test_assets"
output_dir.mkdir(parents=True, exist_ok=True)
print("Generating test kpack archives...")
print()
generate_noop_archive(output_dir)
print()
generate_zstd_archive(output_dir)
print()
generate_test_manifests(output_dir)
print()
print("Done!")
if __name__ == "__main__":
main()