Files
TheRock/rocm-systems/emulation/rocjitsu/tests/kernels/CMakeLists.txt
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

265 lines
11 KiB
CMake

# Copyright (c) 2026 Advanced Micro Devices, Inc.
# SPDX-License-Identifier: MIT
# Compile HIP device kernels into host+device ELF objects for simulator testing.
#
# The resulting .o files are standard ELF objects containing a .hip_fatbin
# section with the bundled AMDGPU device code. The code object loader
# (Executable) extracts and parses the device ELF from this section.
#
# Requires an ROCm installation with amdclang++. When the compiler is not
# found the kernel targets are silently skipped and tests that depend on them
# are disabled at runtime via the HAS_DEVICE_KERNELS compile definition.
include(rj_find_amdcxx)
rj_find_amdcxx(AMDCXX)
if(NOT AMDCXX)
message(
STATUS
"amdclang++ not found - device kernel tests will be disabled"
)
return()
endif()
if(DEFINED SKIP_DEVICE_KERNELS AND SKIP_DEVICE_KERNELS)
message(
STATUS
"SKIP_DEVICE_KERNELS set - device kernel tests will be disabled"
)
return()
endif()
message(STATUS "Using device compiler: ${AMDCXX}")
set(KERNEL_OUTPUT_DIR ${CMAKE_BINARY_DIR}/kernels)
file(MAKE_DIRECTORY ${KERNEL_OUTPUT_DIR})
include(rj_add_device_kernel)
rj_add_device_kernel(matmul_naive gfx950)
rj_add_device_kernel(matmul_mfma gfx950)
rj_add_device_kernel(matmul_mfma_16x16 gfx950)
rj_add_device_kernel(matmul_tiled gfx950)
rj_add_device_kernel(vector_add gfx950)
rj_add_device_kernel(dynamic_copy_loop gfx950)
rj_add_device_kernel(virtual_lds_smoke gfx950)
rj_add_device_kernel(cvt_pk_bf16_f32 gfx950)
rj_add_device_kernel(multikernel_indirect_branch gfx950)
rj_add_device_kernel(multikernel_indirect_branch_part0 gfx950)
rj_add_device_kernel(multikernel_indirect_branch_part1 gfx950)
# gfx1250 was added after older installed ROCm compilers. Probe the selected
# compiler before registering this fixture so a checkout remains buildable with
# an otherwise supported toolchain. `-nogpulib` keeps the probe independent of
# device-library packaging; the real custom command still uses ROCM_PATH.
execute_process(
COMMAND
${AMDCXX} -x hip --offload-arch=gfx1250 -nogpulib --cuda-device-only -c
/dev/null -o /dev/null
RESULT_VARIABLE RJ_AMDCXX_SUPPORTS_GFX1250
OUTPUT_QUIET
ERROR_QUIET
)
set(HAS_GFX1250_DEVICE_KERNELS FALSE)
set(RJ_GFX1250_DEVICE_KERNEL_TARGET)
if(RJ_AMDCXX_SUPPORTS_GFX1250 EQUAL 0)
rj_add_device_kernel(relocation_function_table_dispatch gfx1250)
set(HAS_GFX1250_DEVICE_KERNELS TRUE)
set(RJ_GFX1250_DEVICE_KERNEL_TARGET
kernel_relocation_function_table_dispatch
)
else()
message(
STATUS
"gfx1250 device kernel tests disabled (selected amdclang++ does not support gfx1250)"
)
endif()
# Triton-generated assembly fixtures. The checked-in assembly records the
# original Triton-generated kernels, so normal test builds only need the ROCm
# assembler/linker and do not depend on a Python/Triton install.
function(rj_add_asm_fixture name target)
set(asm_obj ${KERNEL_OUTPUT_DIR}/${name}.asm.o)
set(hsaco ${KERNEL_OUTPUT_DIR}/${name}.hsaco)
add_custom_command(
OUTPUT ${asm_obj}
COMMAND
${AMDCXX} -x assembler -target amdgcn-amd-amdhsa -mcpu=${target}
--rocm-path=${ROCM_PATH} -c -o ${asm_obj}
${CMAKE_CURRENT_SOURCE_DIR}/${name}.s
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.s
COMMENT "Assembling Triton fixture: ${name} (${target})"
)
add_custom_command(
OUTPUT ${hsaco}
COMMAND
${AMDCXX} -target amdgcn-amd-amdhsa -mcpu=${target}
--rocm-path=${ROCM_PATH} -nostdlib -shared -o ${hsaco} ${asm_obj}
DEPENDS ${asm_obj}
COMMENT "Linking Triton fixture: ${name} (${target})"
)
add_custom_target(kernel_${name} DEPENDS ${hsaco})
endfunction()
rj_add_asm_fixture(triton_cdna4_matmul_dynamic_32x32x64 gfx950)
rj_add_asm_fixture(triton_cdna4_matmul_buffer_async_1024 gfx950)
rj_add_asm_fixture(triton_cdna4_flash_attention_no_async_1024 gfx950)
rj_add_asm_fixture(triton_cdna4_flash_attention_buffer_async_1024 gfx950)
rj_add_asm_fixture(triton_cdna3_matmul_dynamic_32x32x64 gfx942)
rj_add_asm_fixture(triton_cdna3_matmul_buffer_async_1024 gfx942)
rj_add_asm_fixture(triton_cdna3_flash_attention_no_async_1024 gfx942)
rj_add_asm_fixture(triton_cdna3_flash_attention_buffer_async_1024 gfx942)
# HipKittens-generated assembly fixtures. The upstream sources build as Python
# extension modules and pull in the full HipKittens/PyTorch/pybind stack, so the
# checked-in .s files preserve the generated gfx950 code object in a readable,
# reassemblable form for DBT tests.
rj_add_asm_fixture(hipkittens_bf16fp32_256_256_64_32_with16x32 gfx950)
rj_add_asm_fixture(hipkittens_bf16fp32_256_256_64_32_with32x16 gfx950)
# Second build of vector_add for gfx90a, used by the DBI hardware-gated
# smoke test (tests/dbi/hsa_dbi_nop_asm_test.cpp). Outputs vector_add_gfx90a.o
# so it coexists with the gfx950 build above. (A single multi-target fat
# binary would be cleaner but the Executable loader has a pre-existing
# single-bundle assumption — see executable.cpp::load_hip_fatbin.)
rj_add_device_kernel(vector_add gfx90a OUTPUT_NAME vector_add_gfx90a)
# Register-padded vector_add for the DBI probe-CALL smoke test
# (tests/dbi/hsa_dbi_nop_probe_test.cpp). Forces .sgpr_count >= 32 so the
# probe's link pair s[30:31] is granted; see vector_add_probe.hip.
rj_add_device_kernel(vector_add_probe gfx90a OUTPUT_NAME vector_add_probe_gfx90a)
if(RJ_INSTALL_TESTS)
set(RJ_DEVICE_KERNEL_FIXTURES
${KERNEL_OUTPUT_DIR}/matmul_naive.o
${KERNEL_OUTPUT_DIR}/matmul_mfma.o
${KERNEL_OUTPUT_DIR}/matmul_mfma_16x16.o
${KERNEL_OUTPUT_DIR}/matmul_tiled.o
${KERNEL_OUTPUT_DIR}/vector_add.o
${KERNEL_OUTPUT_DIR}/vector_add_gfx90a.o
${KERNEL_OUTPUT_DIR}/vector_add_probe_gfx90a.o
${KERNEL_OUTPUT_DIR}/dynamic_copy_loop.o
${KERNEL_OUTPUT_DIR}/virtual_lds_smoke.o
${KERNEL_OUTPUT_DIR}/cvt_pk_bf16_f32.o
${KERNEL_OUTPUT_DIR}/hipkittens_bf16fp32_256_256_64_32_with16x32.hsaco
${KERNEL_OUTPUT_DIR}/hipkittens_bf16fp32_256_256_64_32_with32x16.hsaco
${KERNEL_OUTPUT_DIR}/triton_cdna4_matmul_dynamic_32x32x64.hsaco
${KERNEL_OUTPUT_DIR}/triton_cdna4_matmul_buffer_async_1024.hsaco
${KERNEL_OUTPUT_DIR}/triton_cdna4_flash_attention_no_async_1024.hsaco
${KERNEL_OUTPUT_DIR}/triton_cdna4_flash_attention_buffer_async_1024.hsaco
${KERNEL_OUTPUT_DIR}/triton_cdna3_matmul_dynamic_32x32x64.hsaco
${KERNEL_OUTPUT_DIR}/triton_cdna3_matmul_buffer_async_1024.hsaco
${KERNEL_OUTPUT_DIR}/triton_cdna3_flash_attention_no_async_1024.hsaco
${KERNEL_OUTPUT_DIR}/triton_cdna3_flash_attention_buffer_async_1024.hsaco
)
if(HAS_GFX1250_DEVICE_KERNELS)
list(
APPEND RJ_DEVICE_KERNEL_FIXTURES
${KERNEL_OUTPUT_DIR}/relocation_function_table_dispatch.o
)
endif()
install(
FILES ${RJ_DEVICE_KERNEL_FIXTURES}
DESTINATION ${CMAKE_INSTALL_DATADIR}/rocjitsu/tests/kernels
)
endif()
# DBI no-op probe fixture. A lone __device__ function needs the device-only +
# unbundle path (rj_add_probe_object in cmake/rj_add_device_kernel.cmake), which
# additionally requires clang-offload-bundler from the same LLVM tree.
find_program(
CLANG_OFFLOAD_BUNDLER
clang-offload-bundler
HINTS ${ROCM_PATH}/lib/llvm/bin ${ROCM_PATH}/llvm/bin ${ROCM_PATH}/bin
ENV ROCM_PATH
PATH_SUFFIXES bin
DOC "Path to clang-offload-bundler for device-only probe objects"
)
set(HAS_PROBE_FIXTURES FALSE)
set(HAS_GFX1250_DBT_FIXTURE FALSE)
set(RJ_GFX1250_DBT_FIXTURE_TARGET)
if(CLANG_OFFLOAD_BUNDLER)
rj_add_probe_object(rj_nop_probe gfx90a OUTPUT_NAME rj_nop_probe_gfx90a)
set(HAS_PROBE_FIXTURES TRUE)
# The narrow gfx1250 DBT library accepts a raw AMDGPU code object rather
# than the host ELF / .hip_fatbin produced by rj_add_device_kernel().
if(HAS_GFX1250_DEVICE_KERNELS)
rj_add_probe_object(
relocation_function_table_dispatch
gfx1250
OUTPUT_NAME relocation_function_table_dispatch_gfx1250
)
set(HAS_GFX1250_DBT_FIXTURE TRUE)
set(RJ_GFX1250_DBT_FIXTURE_TARGET
probe_relocation_function_table_dispatch_gfx1250
)
endif()
# Install the probe object alongside the other kernel fixtures so installed
# runs of probe_fixture_test / hsa_dbi_nop_probe_test can find it via
# ROCJITSU_KERNEL_DIR. Gated here (not in the list above) because it exists
# only when the offload bundler is available.
if(RJ_INSTALL_TESTS)
install(
FILES ${KERNEL_OUTPUT_DIR}/rj_nop_probe_gfx90a.hsaco
DESTINATION ${CMAKE_INSTALL_DATADIR}/rocjitsu/tests/kernels
)
if(HAS_GFX1250_DBT_FIXTURE)
install(
FILES
${KERNEL_OUTPUT_DIR}/relocation_function_table_dispatch_gfx1250.hsaco
DESTINATION ${CMAKE_INSTALL_DATADIR}/rocjitsu/tests/kernels
)
endif()
endif()
else()
message(
STATUS
"clang-offload-bundler not found - DBI probe object fixtures disabled"
)
endif()
# Umbrella target for all device kernels.
add_custom_target(
device_kernels
DEPENDS
kernel_matmul_naive
kernel_matmul_mfma
kernel_matmul_mfma_16x16
kernel_matmul_tiled
kernel_vector_add
kernel_vector_add_gfx90a
kernel_vector_add_probe_gfx90a
kernel_dynamic_copy_loop
kernel_virtual_lds_smoke
kernel_cvt_pk_bf16_f32
kernel_multikernel_indirect_branch
kernel_multikernel_indirect_branch_part0
kernel_multikernel_indirect_branch_part1
${RJ_GFX1250_DEVICE_KERNEL_TARGET}
${RJ_GFX1250_DBT_FIXTURE_TARGET}
kernel_triton_cdna4_matmul_dynamic_32x32x64
kernel_triton_cdna4_matmul_buffer_async_1024
kernel_triton_cdna4_flash_attention_no_async_1024
kernel_triton_cdna4_flash_attention_buffer_async_1024
kernel_triton_cdna3_matmul_dynamic_32x32x64
kernel_triton_cdna3_matmul_buffer_async_1024
kernel_triton_cdna3_flash_attention_no_async_1024
kernel_triton_cdna3_flash_attention_buffer_async_1024
kernel_hipkittens_bf16fp32_256_256_64_32_with16x32
kernel_hipkittens_bf16fp32_256_256_64_32_with32x16
)
if(HAS_PROBE_FIXTURES)
add_dependencies(device_kernels probe_rj_nop_probe_gfx90a)
endif()
# Export variables to the parent scope so the test executable can use them.
set(HAS_DEVICE_KERNELS TRUE PARENT_SCOPE)
set(HAS_GFX1250_DEVICE_KERNELS ${HAS_GFX1250_DEVICE_KERNELS} PARENT_SCOPE)
set(HAS_GFX1250_DBT_FIXTURE ${HAS_GFX1250_DBT_FIXTURE} PARENT_SCOPE)
set(HAS_PROBE_FIXTURES ${HAS_PROBE_FIXTURES} PARENT_SCOPE)
set(KERNEL_OUTPUT_DIR ${KERNEL_OUTPUT_DIR} PARENT_SCOPE)