73 lines
2.8 KiB
CMake
73 lines
2.8 KiB
CMake
macro(add_offload_test_device_code test_filename test_name)
|
|
set(SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${test_filename})
|
|
|
|
# Build for NVPTX
|
|
if(OFFLOAD_TEST_TARGET_NVIDIA)
|
|
set(BIN_PATH ${CMAKE_CURRENT_BINARY_DIR}/${test_name}.nvptx64.bin)
|
|
add_custom_command(OUTPUT ${BIN_PATH}
|
|
COMMAND
|
|
${CMAKE_C_COMPILER} --target=nvptx64-nvidia-cuda
|
|
${ARGN}
|
|
-march=${LIBOMPTARGET_DEP_CUDA_ARCH}
|
|
--cuda-path=${CUDA_ROOT}
|
|
${SRC_PATH} -o ${BIN_PATH}
|
|
DEPENDS ${SRC_PATH}
|
|
)
|
|
list(APPEND BIN_PATHS ${BIN_PATH})
|
|
endif()
|
|
|
|
# Build for AMDGPU
|
|
if(OFFLOAD_TEST_TARGET_AMDGPU)
|
|
set(BIN_PATH ${CMAKE_CURRENT_BINARY_DIR}/${test_name}.amdgpu.bin)
|
|
add_custom_command(OUTPUT ${BIN_PATH}
|
|
COMMAND
|
|
${CMAKE_C_COMPILER} --target=amdgcn-amd-amdhsa -nogpulib
|
|
${ARGN}
|
|
-mcpu=${LIBOMPTARGET_DEP_AMDGPU_ARCH}
|
|
${SRC_PATH} -o ${BIN_PATH}
|
|
DEPENDS ${SRC_PATH}
|
|
)
|
|
list(APPEND BIN_PATHS ${BIN_PATH})
|
|
endif()
|
|
|
|
# TODO: Build for host CPU
|
|
endmacro()
|
|
|
|
|
|
# Decide what device targets to build for. LibomptargetGetDependencies is
|
|
# included at the top-level so the GPUs present on the system are already
|
|
# detected.
|
|
set(OFFLOAD_TESTS_FORCE_NVIDIA_ARCH "" CACHE STRING
|
|
"Force building of NVPTX device code for Offload unit tests with the given arch, e.g. sm_61")
|
|
set(OFFLOAD_TESTS_FORCE_AMDGPU_ARCH "" CACHE STRING
|
|
"Force building of AMDGPU device code for Offload unit tests with the given arch, e.g. gfx1030")
|
|
|
|
find_package(CUDAToolkit QUIET)
|
|
if(CUDAToolkit_FOUND)
|
|
get_filename_component(CUDA_ROOT "${CUDAToolkit_BIN_DIR}" DIRECTORY ABSOLUTE)
|
|
endif()
|
|
if (OFFLOAD_TESTS_FORCE_NVIDIA_ARCH)
|
|
set(LIBOMPTARGET_DEP_CUDA_ARCH ${OFFLOAD_TESTS_FORCE_NVIDIA_ARCH})
|
|
set(OFFLOAD_TEST_TARGET_NVIDIA ON)
|
|
elseif (LIBOMPTARGET_FOUND_NVIDIA_GPU AND CUDA_ROOT AND "cuda" IN_LIST LIBOMPTARGET_PLUGINS_TO_BUILD)
|
|
set(OFFLOAD_TEST_TARGET_NVIDIA ON)
|
|
endif()
|
|
|
|
if (OFFLOAD_TESTS_FORCE_AMDGPU_ARCH)
|
|
set(LIBOMPTARGET_DEP_AMDGPU_ARCH ${OFFLOAD_TESTS_FORCE_AMDGPU_ARCH})
|
|
set(OFFLOAD_TEST_TARGET_AMDGPU ON)
|
|
elseif (LIBOMPTARGET_FOUND_AMDGPU_GPU AND "amdgpu" IN_LIST LIBOMPTARGET_PLUGINS_TO_BUILD)
|
|
list(GET LIBOMPTARGET_AMDGPU_DETECTED_ARCH_LIST 0 LIBOMPTARGET_DEP_AMDGPU_ARCH)
|
|
set(OFFLOAD_TEST_TARGET_AMDGPU ON)
|
|
endif()
|
|
|
|
add_offload_test_device_code(foo.c foo)
|
|
add_offload_test_device_code(bar.c bar)
|
|
# By default, amdhsa will add a number of "hidden" arguments to the kernel defintion
|
|
# O3 disables this, and results in a kernel function with actually no arguments as seen by liboffload
|
|
add_offload_test_device_code(noargs.c noargs -O3)
|
|
|
|
add_custom_target(OffloadUnitTestsDeviceBins DEPENDS ${BIN_PATHS})
|
|
|
|
set(OFFLOAD_TEST_DEVICE_CODE_PATH ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE)
|