From 4b3066a0c6f2f357736fee3d4047fc01d6a78b5e Mon Sep 17 00:00:00 2001 From: Ross Brunton Date: Thu, 24 Apr 2025 17:17:36 +0100 Subject: [PATCH] [UR][HIP] Unbundle hip conformance test binaries The binaries used for conformance testing on hip are generated using SYCL programs which output a "bundled object" rather than a raw amdhsa binary. This unbundles the objects so that the HIP conformance tests are given the raw binaries. --- unified-runtime/CMakeLists.txt | 8 +++++++ .../conformance/device_code/CMakeLists.txt | 24 ++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/unified-runtime/CMakeLists.txt b/unified-runtime/CMakeLists.txt index 7d1ee861b1879..63bc63bc156dd 100644 --- a/unified-runtime/CMakeLists.txt +++ b/unified-runtime/CMakeLists.txt @@ -60,6 +60,7 @@ set(UR_EXTERNAL_DEPENDENCIES "" CACHE STRING set(UR_DPCXX "" CACHE FILEPATH "Path of the DPC++ compiler executable") set(UR_DPCXX_BUILD_FLAGS "" CACHE STRING "Build flags to pass to DPC++ when compiling device programs") set(UR_DEVICE_CODE_EXTRACTOR "" CACHE PATH "Path to clang-offload-extract") +set(UR_DEVICE_BUNDLER "" CACHE PATH "Path to clang-offload-bundler") set(UR_SYCL_LIBRARY_DIR "" CACHE PATH "Path of the SYCL runtime library directory") set(UR_CONFORMANCE_TARGET_TRIPLES "" CACHE STRING @@ -147,6 +148,7 @@ endif() if(NOT UR_STANDALONE_BUILD AND "${UR_DPCXX}" STREQUAL "") set(UR_FOUND_DPCXX "$") set(UR_FOUND_DEVICE_CODE_EXTRACTOR "$") + set(UR_FOUND_DEVICE_BUNDLER "$") set(UR_DPCXX_DEPS "sycl-toolchain;") else() set(UR_FOUND_DPCXX "${UR_DPCXX}") @@ -156,6 +158,12 @@ else() cmake_path(GET UR_FOUND_DPCXX EXTENSION EXE) cmake_path(REPLACE_FILENAME UR_FOUND_DPCXX "clang-offload-extract${EXE}" OUTPUT_VARIABLE UR_FOUND_DEVICE_CODE_EXTRACTOR) endif() + if(UR_DEVICE_BUNDLER) + set(UR_FOUND_BUNDLER "${UR_DEVICE_BUNDLER}") + else() + cmake_path(GET UR_FOUND_DPCXX EXTENSION EXE) + cmake_path(REPLACE_FILENAME UR_FOUND_DPCXX "clang-offload-bundler${EXE}" OUTPUT_VARIABLE UR_FOUND_DEVICE_BUNDLER) + endif() set(UR_DPCXX_DEPS "") endif() diff --git a/unified-runtime/test/conformance/device_code/CMakeLists.txt b/unified-runtime/test/conformance/device_code/CMakeLists.txt index a5401fdf52898..7022248f239fc 100644 --- a/unified-runtime/test/conformance/device_code/CMakeLists.txt +++ b/unified-runtime/test/conformance/device_code/CMakeLists.txt @@ -104,18 +104,36 @@ macro(add_device_binary SOURCE_FILE) continue() endif() - add_custom_command(OUTPUT ${BIN_PATH} - COMMAND LD_LIBRARY_PATH=${UR_SYCL_LIBRARY_DIR}:$ENV{LD_LIBRARY_PATH} + add_custom_command(OUTPUT ${EXE_PATH} + COMMAND LD_LIBRARY_PATH=${UR_SYCL_LIBRARY_DIR}:$ENV{LD_LIBRARY_PATH} ${UR_FOUND_DPCXX} -fsycl -fsycl-targets=${TRIPLE} -fsycl-device-code-split=off ${AMD_TARGET_BACKEND} ${AMD_OFFLOAD_ARCH} ${AMD_NOGPULIB} ${DPCXX_BUILD_FLAGS_LIST} ${SOURCE_FILE} -o ${EXE_PATH} - COMMAND ${CMAKE_COMMAND} -E env ${EXTRA_ENV} ${UR_FOUND_DEVICE_CODE_EXTRACTOR} -q --stem="${TRIPLE}.bin" ${EXE_PATH} WORKING_DIRECTORY "${DEVICE_BINARY_DIR}" DEPENDS ${SOURCE_FILE} ${UR_DPCXX_DEPS} ) + + if(${TRIPLE} MATCHES "amd") + add_custom_command(OUTPUT ${BIN_PATH} + COMMAND ${CMAKE_COMMAND} -E env ${EXTRA_ENV} ${UR_FOUND_DEVICE_CODE_EXTRACTOR} -q --stem="${TRIPLE}.bundle" ${EXE_PATH} + + COMMAND ${CMAKE_COMMAND} -E env ${EXTRA_ENV} ${UR_FOUND_DEVICE_BUNDLER} --type=o --input=${TRIPLE}.bundle.0 + -unbundle -targets=hipv4-${TRIPLE}--${AMD_ARCH} -output=${TRIPLE}.bin.0 + + WORKING_DIRECTORY "${DEVICE_BINARY_DIR}" + DEPENDS ${EXE_PATH} + ) + else() + add_custom_command(OUTPUT ${BIN_PATH} + COMMAND ${CMAKE_COMMAND} -E env ${EXTRA_ENV} ${UR_FOUND_DEVICE_CODE_EXTRACTOR} -q --stem="${TRIPLE}.bin" ${EXE_PATH} + + WORKING_DIRECTORY "${DEVICE_BINARY_DIR}" + DEPENDS ${EXE_PATH} + ) + endif() add_custom_target(generate_${KERNEL_NAME}_${TRIPLE} DEPENDS ${BIN_PATH}) add_dependencies(generate_device_binaries generate_${KERNEL_NAME}_${TRIPLE}) endforeach()