# MIT License # # Copyright (c) 2017-2026 Advanced Micro Devices, Inc. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. set(INSTALL_TEST_FILE "${CMAKE_CURRENT_BINARY_DIR}/install_CTestTestfile.cmake") file(WRITE "${INSTALL_TEST_FILE}" [=[ # This is a test file generated by rocPRIM for install time. # It differs slightly from the default testfile, and you may encounter issues because of that. ]=] ) # This variable is defined here to be accessible to other test sub-modules set(COMMON_TEST_HEADER_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set(PROFILE_DIR "${CMAKE_BINARY_DIR}/coverage-report") set_property(GLOBAL PROPERTY LLVM_COV_OBJECT_ARGS "") function(add_relative_test test_name test_target resource_group) get_target_property(EXE_PATH ${test_target} RUNTIME_OUTPUT_DIRECTORY) if(EXE_PATH STREQUAL "EXE_PATH-NOTFOUND") set(EXE_PATH ".") endif() get_filename_component(EXE_PATH "${EXE_PATH}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}") get_target_property(EXE_NAME ${test_target} RUNTIME_OUTPUT_NAME) if(EXE_NAME STREQUAL "EXE_NAME-NOTFOUND") get_target_property(EXE_NAME ${test_target} OUTPUT_NAME) if(EXE_NAME STREQUAL "EXE_NAME-NOTFOUND") set(EXE_NAME "${test_target}") endif() endif() if(BUILD_CODE_COVERAGE) set(ABS_EXE "${EXE_PATH}/${EXE_NAME}") set_property(GLOBAL APPEND PROPERTY LLVM_COV_OBJECT_ARGS -object "${ABS_EXE}") endif() file(RELATIVE_PATH rel_path "${CMAKE_CURRENT_BINARY_DIR}" "${EXE_PATH}/${EXE_NAME}") add_test(NAME "${test_name}" COMMAND "./${rel_path}") if(BUILD_CODE_COVERAGE) set_tests_properties(${test_name} PROPERTIES ENVIRONMENT "LLVM_PROFILE_FILE=${PROFILE_DIR}/profraw/rocprim-coverage_%m.profraw" ) endif() file(APPEND "${INSTALL_TEST_FILE}" "add_test(${test_name} \"../${EXE_NAME}\")\n") # Set the resource group for the test. This must correspond to a GPU resource present in resources.json. file(APPEND "${INSTALL_TEST_FILE}" "set_tests_properties(${test_name} PROPERTIES RESOURCE_GROUPS \"1,${resource_group}:1\")\n") # Record this (test_target, resource_group) pair so the test-categories pass can later attach gtest-filter # labels to each test while inheriting the same RESOURCE_GROUPS pinning. set_property(GLOBAL APPEND PROPERTY ROCPRIM_TEST_TARGET_RESOURCE_PAIRS "${test_target}|${resource_group}") endfunction() function(add_hip_test TEST_NAME TEST_SOURCES) list(GET TEST_SOURCES 0 TEST_MAIN_SOURCE) get_filename_component(TEST_TARGET ${TEST_MAIN_SOURCE} NAME_WE) if(USE_HIPCXX) set_source_files_properties(${TEST_SOURCES} PROPERTIES LANGUAGE HIP) endif() add_executable(${TEST_TARGET} ${TEST_SOURCES}) target_compile_definitions(${TEST_TARGET} PRIVATE USE_GTEST=ON) if (ROCPRIM_INSTALL) rocm_install(TARGETS ${TEST_TARGET} COMPONENT tests) endif() target_include_directories(${TEST_TARGET} SYSTEM BEFORE PUBLIC $ ) target_link_libraries(${TEST_TARGET} PRIVATE GTest::GTest GTest::Main ) if(USE_SYSTEM_LIB) target_link_libraries(${TEST_TARGET} PRIVATE roc::rocprim) else() target_link_libraries(${TEST_TARGET} PRIVATE rocprim) endif() if(USE_HIPCXX) target_link_libraries(${TEST_TARGET} PRIVATE $,hip::host,hip::device> ) else() target_link_libraries(${TEST_TARGET} PRIVATE hip::device) endif() target_compile_options(${TEST_TARGET} PRIVATE $<$: /bigobj # number of sections exceeded object file format limit: compile with /bigobj > ) set_target_properties(${TEST_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/test" ) add_relative_test(${TEST_NAME} ${TEST_TARGET} ${DEFAULT_GPU_RESOURCE}) if (WIN32 AND NOT DEFINED DLLS_COPIED) set(DLLS_COPIED "YES") set(DLLS_COPIED ${DLLS_COPIED} PARENT_SCOPE) # for now adding in all .dll as dependency chain is not cmake based on win32 file( GLOB third_party_dlls LIST_DIRECTORIES ON CONFIGURE_DEPENDS ${HIP_DIR}/bin/*.dll ${CMAKE_SOURCE_DIR}/rtest.* ) foreach( file_i ${third_party_dlls}) add_custom_command( TARGET ${TEST_TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${file_i} ${PROJECT_BINARY_DIR}/test ) endforeach( file_i ) endif() endfunction() # **************************************************************************** # Tests # **************************************************************************** # HIP tests without using rocPRIM add_hip_test("hip.device_api" hip/test_hip_api.cpp) add_hip_test("hip.async_copy" hip/test_hip_async_copy.cpp) add_hip_test("hip.ordered_block_id" hip/test_ordered_block_id.cpp) # rocPRIM test add_subdirectory(rocprim) # hipGraph tests add_hip_test("hipgraph.basic" hipgraph/test_hipgraph_basic.cpp) add_hip_test("hipgraph.algs" hipgraph/test_hipgraph_algs.cpp) # **************************************************************************** # Test Filter Standardization # **************************************************************************** if(EXISTS "${ROCM_LIBRARIES_ROOT}/shared/ctest/TestCategories.cmake") include("${ROCM_LIBRARIES_ROOT}/shared/ctest/TestCategories.cmake") message(STATUS "Applying test categories for rocprim") get_property(_rp_pairs GLOBAL PROPERTY ROCPRIM_TEST_TARGET_RESOURCE_PAIRS) list(REMOVE_DUPLICATES _rp_pairs) foreach(_rp_pair IN LISTS _rp_pairs) string(REPLACE "|" ";" _rp_parts "${_rp_pair}") list(GET _rp_parts 0 _rp_t) list(GET _rp_parts 1 _rp_rg) get_target_property(_rp_dir ${_rp_t} RUNTIME_OUTPUT_DIRECTORY) apply_test_category_labels(${_rp_t} "${CMAKE_CURRENT_SOURCE_DIR}/test_categories.yaml" "${_rp_dir}" "${INSTALL_TEST_FILE}" "${_rp_rg}") endforeach() else() message( STATUS "Shared CTest categories not found at " "${CMAKE_CURRENT_SOURCE_DIR}/TestCategories.cmake - " "skipping rocprim test category labels" ) endif() if (ROCPRIM_INSTALL) rocm_install( FILES "${INSTALL_TEST_FILE}" DESTINATION "${CMAKE_INSTALL_BINDIR}/${PROJECT_NAME}" COMPONENT tests RENAME "CTestTestfile.cmake" ) endif() # Build the executable used for generating the resource spec file. add_executable(generate_resource_spec ${CMAKE_SOURCE_DIR}/test/generate_resource_spec.cpp) set_target_properties(generate_resource_spec PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") target_link_libraries(generate_resource_spec PRIVATE hip::host) # This test may still get the offload-compress flag passed. Since it does not include any kernel # code it will give an unused-command-line-argument warning. target_compile_options(generate_resource_spec PRIVATE "-Wno-unused-command-line-argument") # Install the executable using the standard install command instead of rocm_install # since we want to put it in a custom DESTINATION (rocm_install does not support # the DESTINATION option for TARGETS). set_property(TARGET generate_resource_spec APPEND PROPERTY INSTALL_RPATH "$ORIGIN/../../lib") install( TARGETS generate_resource_spec DESTINATION "${CMAKE_INSTALL_BINDIR}/${PROJECT_NAME}" COMPONENT tests )