diff --git a/projects/hipsolver/CMakeLists.txt b/projects/hipsolver/CMakeLists.txt index 9985ef0a946..7eb0aa16c8c 100644 --- a/projects/hipsolver/CMakeLists.txt +++ b/projects/hipsolver/CMakeLists.txt @@ -1,83 +1,40 @@ -# ######################################################################## -# Copyright (C) 2016-2025 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 cop- -# ies 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 IM- -# PLIED, 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 CONNE- -# CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# ######################################################################## - -cmake_minimum_required(VERSION 3.12) - -# Consider removing this in the future -# This should appear before the project command, because it does not use FORCE -if(WIN32) - set(CMAKE_INSTALL_PREFIX "${PROJECT_BINARY_DIR}/package" CACHE PATH "Install path prefix, prepended onto install directories") -else() - set(CMAKE_INSTALL_PREFIX "/opt/rocm" CACHE PATH "Install path prefix, prepended onto install directories") +# Copyright Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +cmake_minimum_required(VERSION 3.21) + +# Default install prefix (before project() so it doesn't use FORCE) +if(NOT DEFINED CMAKE_INSTALL_PREFIX OR CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + if(WIN32) + set(CMAKE_INSTALL_PREFIX "C:/hipSDK" CACHE PATH "Install path prefix." FORCE) + else() + set(CMAKE_INSTALL_PREFIX "/opt/rocm" CACHE PATH "Install path prefix." FORCE) + endif() endif() -# This has to be initialized before the project() command appears -# Set the default of CMAKE_BUILD_TYPE to be release, unless user specifies with -D. MSVC_IDE does not use CMAKE_BUILD_TYPE +# Default build type for single-config generators if(NOT DEFINED CMAKE_CONFIGURATION_TYPES AND NOT DEFINED CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel.") + set(CMAKE_BUILD_TYPE Release CACHE STRING + "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." + ) endif() if(NOT DEFINED CMAKE_Fortran_COMPILER AND NOT DEFINED ENV{FC}) - set(CMAKE_Fortran_COMPILER "gfortran") + set(CMAKE_Fortran_COMPILER "gfortran") endif() project(hipsolver LANGUAGES CXX) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_EXTENSIONS OFF) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -# This finds the rocm-cmake project, and installs it if not found -# rocm-cmake contains common cmake code for rocm projects to help setup and install -set(PROJECT_EXTERN_DIR ${CMAKE_CURRENT_BINARY_DIR}/extern) -find_package(ROCM 0.7.3 CONFIG QUIET PATHS /opt/rocm) -if(NOT ROCM_FOUND) - set(rocm_cmake_tag "master" CACHE STRING "rocm-cmake tag to download") - set(rocm_cmake_url "https://github.com/RadeonOpenCompute/rocm-cmake/archive/${rocm_cmake_tag}.zip") - set(rocm_cmake_path "${PROJECT_EXTERN_DIR}/rocm-cmake-${rocm_cmake_tag}") - set(rocm_cmake_archive "${rocm_cmake_path}.zip") - file(DOWNLOAD "${rocm_cmake_url}" "${rocm_cmake_archive}" STATUS status LOG log) - - list(GET status 0 status_code) - list(GET status 1 status_string) - - if(status_code EQUAL 0) - message(STATUS "downloading... done") - else() - message(FATAL_ERROR "error: downloading\n'${rocm_cmake_url}' failed - status_code: ${status_code} - status_string: ${status_string} - log: ${log}\n") - endif() - - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzvf "${rocm_cmake_archive}" - WORKING_DIRECTORY ${PROJECT_EXTERN_DIR}) - execute_process(COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_EXTERN_DIR}/rocm-cmake . - WORKING_DIRECTORY ${PROJECT_EXTERN_DIR}/rocm-cmake-${rocm_cmake_tag}) - execute_process(COMMAND ${CMAKE_COMMAND} --build rocm-cmake-${rocm_cmake_tag} --target install - WORKING_DIRECTORY ${PROJECT_EXTERN_DIR}) - - find_package(ROCM 0.7.3 REQUIRED CONFIG PATHS ${PROJECT_EXTERN_DIR}/rocm-cmake) -endif() +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +# Set cpack license file early to avoid rocm-cmake warning +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md") + +# --- Backward-compatibility shim for renamed options --- +include(hipsolver-options-shim) + +# --- rocm-cmake --- +find_package(ROCM 0.7.3 REQUIRED CONFIG) include(ROCMSetupVersion) include(ROCMCreatePackage) @@ -86,215 +43,163 @@ include(ROCMPackageConfigHelpers) include(ROCMInstallSymlinks) include(ROCMClients) include(ROCMHeaderWrapper) +include(CMakeDependentOption) +include(GNUInstallDirs) set(VERSION_STRING "3.3.0") rocm_setup_version(VERSION ${VERSION_STRING}) -if(NOT DEFINED ENV{HIP_PATH}) - set(HIP_PATH "/opt/rocm/hip") -else() - file(TO_CMAKE_PATH "$ENV{HIP_PATH}" HIP_PATH) -endif() - -# NOTE: workaround until hip cmake modules fixes symlink logic in their config files; remove when fixed -list(APPEND CMAKE_PREFIX_PATH ${ROCM_PATH}/lib/cmake/hip /opt/rocm /opt/rocm/llvm /opt/rocm/hip) - -option(BUILD_SHARED_LIBS "Build hipSOLVER as a shared library" ON) -option(BUILD_ADDRESS_SANITIZER "Build with address sanitizer enabled" OFF) -option(BUILD_CODE_COVERAGE "Build hipSOLVER with code coverage enabled" OFF) -option(BUILD_HIPBLAS_TESTS "Build additional tests to ensure hipBLAS and hipSOLVER are compatible (requires installed hipBLAS)" OFF) -option(BUILD_HIPSPARSE_TESTS "Build additional tests to cover sparse functionality (requires installed hipSPARSE)" ON) -# BUILD_SHARED_LIBS is a cmake built-in; we make it an explicit option such that it shows in cmake-gui -option(BUILD_WITH_SPARSE "Build hipSOLVER with sparse functionality available at build time (requires installed dependencies)" OFF) -option(BUILD_VERBOSE "Output additional build information" OFF) -option(USE_CUDA "Look for CUDA and use that as a backend if found" OFF) -option(HIPSOLVER_FIND_PACKAGE_LAPACK_CONFIG "Skip module mode search for LAPACK" ON) -option(BUILD_FORTRAN_BINDINGS "Build the Fortran bindings" "${UNIX}") - -if(NOT BUILD_SHARED_LIBS) - add_compile_definitions(HIPSOLVER_STATIC_LIB) -endif() - -if(BUILD_FORTRAN_BINDINGS) - enable_language(Fortran) -endif() - -add_library(hipsolver-common INTERFACE) -target_compile_options(hipsolver-common INTERFACE - -Wno-unused-result # TODO: address [[nodiscard]] warnings +# --- Build options --- + +option(BUILD_SHARED_LIBS "Build hipSOLVER as a shared library." ON) +option(HIPSOLVER_ENABLE_CUDA "Build with CUDA backend instead of HIP." OFF) +option(HIPSOLVER_ENABLE_ASAN "Build with address sanitizer enabled." OFF) +option(HIPSOLVER_BUILD_COVERAGE "Build with code coverage enabled." OFF) +option(HIPSOLVER_ENABLE_HIPBLAS_TESTS "Build tests for hipBLAS/hipSOLVER compatibility (requires hipBLAS)." OFF) +option(HIPSOLVER_ENABLE_HIPSPARSE_TESTS "Build tests for sparse functionality (requires hipSPARSE)." ON) +option(HIPSOLVER_ENABLE_SPARSE "Build with sparse functionality at build time (requires dependencies)." OFF) +option(HIPSOLVER_ENABLE_VERBOSE "Output additional build information." OFF) +option(HIPSOLVER_FIND_PACKAGE_LAPACK_CONFIG "Skip module mode search for LAPACK." ON) +option(HIPSOLVER_ENABLE_FORTRAN "Build the Fortran bindings." "${UNIX}") +option(HIPSOLVER_BUILD_TESTING "Build hipSOLVER unit tests." OFF) +option(HIPSOLVER_ENABLE_BENCHMARKS "Build hipSOLVER benchmarks." OFF) +option(HIPSOLVER_ENABLE_SAMPLES "Build hipSOLVER samples." OFF) +option(CMAKE_EXPORT_COMPILE_COMMANDS "Export compile_commands.json for clang tooling support." ON) + +set(HIPSOLVER_ARMOR_LEVEL "0" CACHE STRING + "Runtime correctness check level (0=none, 1=assertions, 2=debug iterators)." ) -if(BUILD_ADDRESS_SANITIZER) - target_compile_options(hipsolver-common INTERFACE - -fsanitize=address - -shared-libasan - ) - target_link_options(hipsolver-common INTERFACE - -fsanitize=address - -shared-libasan - -fuse-ld=lld - ) -endif() - - - -# Find CUDA if the user wants a CUDA version. -if(USE_CUDA) - find_package(CUDA REQUIRED) -endif() -# Hip headers required of all clients; clients use hip to allocate device memory -if(USE_CUDA) - # Append cmake path for hip (for convenience) - # Users may override HIP path by specifying their own in CMAKE_MODULE_PATH - list(APPEND CMAKE_MODULE_PATH ${ROCM_PATH}/lib/cmake/hip ${HIP_PATH}/cmake) - find_package(HIP MODULE REQUIRED) -else() - find_package(hip REQUIRED CONFIG PATHS ${HIP_PATH} ${ROCM_PATH} /opt/rocm) -endif() +# --- Language setup --- -if(USE_CUDA) - list(APPEND HIP_INCLUDE_DIRS "${HIP_ROOT_DIR}/include") +if(HIPSOLVER_ENABLE_FORTRAN) + enable_language(Fortran) endif() -# Append our library helper cmake path -list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ) +# --- Dependencies --- -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(DEFAULT_ARMOR_LEVEL 1) +if(HIPSOLVER_ENABLE_CUDA) + find_package(CUDA REQUIRED) + find_package(HIP MODULE REQUIRED) else() - set(DEFAULT_ARMOR_LEVEL 0) + find_package(hip REQUIRED CONFIG) endif() -set(ARMOR_LEVEL "${DEFAULT_ARMOR_LEVEL}" CACHE STRING "Enables increasingly expensive runtime correctness checks") -include(armor-config) -# FOR OPTIONAL CODE COVERAGE -if(BUILD_CODE_COVERAGE) - target_compile_options(hipsolver-common - INTERFACE - -g - -O0 - -fprofile-instr-generate - -fcoverage-mapping) - target_link_options(hipsolver-common - INTERFACE - -fprofile-instr-generate) -endif() +# --- Armor configuration --- +include(armor-config) -include(CMakeDependentOption) +# --- Backward compatibility for file reorg --- cmake_dependent_option(BUILD_FILE_REORG_BACKWARD_COMPATIBILITY - "Build with file/folder reorg backward compatibility enabled" OFF "NOT WIN32" OFF) + "Build with file/folder reorg backward compatibility enabled." OFF "NOT WIN32" OFF +) if(BUILD_FILE_REORG_BACKWARD_COMPATIBILITY) - rocm_wrap_header_dir( - ${CMAKE_SOURCE_DIR}/library/include - PATTERNS "*.h" - GUARDS SYMLINK WRAPPER - WRAPPER_LOCATIONS ${CMAKE_INSTALL_INCLUDEDIR} - ) -endif() - -if(WIN32) - add_compile_definitions( - WIN32_LEAN_AND_MEAN - _CRT_SECURE_NO_WARNINGS - NOMINMAX - ) + rocm_wrap_header_dir( + "${PROJECT_SOURCE_DIR}/library/include" + PATTERNS "*.h" + GUARDS SYMLINK WRAPPER + WRAPPER_LOCATIONS ${CMAKE_INSTALL_INCLUDEDIR} + ) endif() +# --- Library --- add_subdirectory(library) -include(clients/cmake/build-options.cmake) - +# --- OS detection for packaging --- if(NOT SYSTEM_OS) - rocm_set_os_id(SYSTEM_OS) - string(TOLOWER "${SYSTEM_OS}" SYSTEM_OS) - rocm_read_os_release(SYSTEM_OS_VERSION VERSION_ID) + rocm_set_os_id(SYSTEM_OS) + string(TOLOWER "${SYSTEM_OS}" SYSTEM_OS) + rocm_read_os_release(SYSTEM_OS_VERSION VERSION_ID) endif() -# Build clients of the library -if(BUILD_CLIENTS_SAMPLES OR BUILD_CLIENTS_TESTS OR BUILD_CLIENTS_BENCHMARKS) - set(GFORTRAN_RPM "libgfortran4") - set(GFORTRAN_DEB "libgfortran4") - if(SYSTEM_OS STREQUAL "centos" OR SYSTEM_OS STREQUAL "rhel" OR SYSTEM_OS STREQUAL "almalinux") - if(SYSTEM_OS_VERSION VERSION_GREATER_EQUAL "8") - set(GFORTRAN_RPM "libgfortran") +# --- Clients --- +if(HIPSOLVER_BUILD_TESTING OR HIPSOLVER_ENABLE_BENCHMARKS OR HIPSOLVER_ENABLE_SAMPLES) + set(GFORTRAN_RPM "libgfortran4") + set(GFORTRAN_DEB "libgfortran4") + if(SYSTEM_OS STREQUAL "centos" OR SYSTEM_OS STREQUAL "rhel" OR SYSTEM_OS STREQUAL "almalinux") + if(SYSTEM_OS_VERSION VERSION_GREATER_EQUAL "8") + set(GFORTRAN_RPM "libgfortran") + endif() + elseif(SYSTEM_OS STREQUAL "ubuntu" AND SYSTEM_OS_VERSION VERSION_GREATER_EQUAL "20.04") + set(GFORTRAN_DEB "libgfortran5") + elseif(SYSTEM_OS STREQUAL "mariner" OR SYSTEM_OS STREQUAL "azurelinux") + set(GFORTRAN_RPM "gfortran") + endif() + rocm_package_setup_component(clients) + if(UNIX) + set(DEP_ARGS DEPENDS RPM "${GFORTRAN_RPM}" DEB "${GFORTRAN_DEB}") + endif() + if(HIPSOLVER_BUILD_TESTING) + rocm_package_setup_client_component(tests ${DEP_ARGS}) endif() - elseif(SYSTEM_OS STREQUAL "ubuntu" AND SYSTEM_OS_VERSION VERSION_GREATER_EQUAL "20.04") - set(GFORTRAN_DEB "libgfortran5") - elseif(SYSTEM_OS STREQUAL "mariner" OR SYSTEM_OS STREQUAL "azurelinux") - set(GFORTRAN_RPM "gfortran") - endif() - rocm_package_setup_component(clients) - if(UNIX) - set(DEP_ARGS DEPENDS RPM "${GFORTRAN_RPM}" DEB "${GFORTRAN_DEB}") - endif() - if(BUILD_CLIENTS_TESTS) - rocm_package_setup_client_component(tests ${DEP_ARGS}) - endif() - if(BUILD_CLIENTS_BENCHMARKS) - rocm_package_setup_client_component(benchmarks ${DEP_ARGS}) - endif() - add_subdirectory(clients) + if(HIPSOLVER_ENABLE_BENCHMARKS) + rocm_package_setup_client_component(benchmarks ${DEP_ARGS}) + endif() + add_subdirectory(clients) endif() -# Package specific CPACK vars -if(NOT USE_CUDA) - set(rocblas_minimum 4.2.0) - set(rocsolver_minimum 3.33.0) - rocm_package_add_dependencies(SHARED_DEPENDS "rocblas >= ${rocblas_minimum}" "rocsolver >= ${rocsolver_minimum}") - rocm_package_add_rpm_dependencies(STATIC_DEPENDS "rocblas-static-devel >= ${rocblas_minimum}" "rocsolver-static-devel >= ${rocsolver_minimum}") - rocm_package_add_deb_dependencies(STATIC_DEPENDS "rocblas-static-dev >= ${rocblas_minimum}" "rocsolver-static-dev >= ${rocsolver_minimum}") - - if(SYSTEM_OS STREQUAL "centos" OR SYSTEM_OS STREQUAL "rhel" OR SYSTEM_OS STREQUAL "mariner" OR SYSTEM_OS STREQUAL "azurelinux") - list(APPEND hipsolver_pkgdeps "suitesparse") - elseif(SYSTEM_OS STREQUAL "ubuntu" AND SYSTEM_OS_VERSION VERSION_GREATER_EQUAL "24.04") - list(APPEND hipsolver_pkgdeps "libcholmod5" "libsuitesparseconfig7") - else() - list(APPEND hipsolver_pkgdeps "libcholmod3" "libsuitesparseconfig5") - endif() - - if(BUILD_WITH_SPARSE) - set(rocsparse_minimum 2.3.0) - rocm_package_add_dependencies(SHARED_DEPENDS "rocsparse >= ${rocsparse_minimum}") - rocm_package_add_rpm_dependencies(STATIC_DEPENDS "rocsparse-static-devel >= ${rocsparse_minimum}") - rocm_package_add_deb_dependencies(STATIC_DEPENDS "rocsparse-static-dev >= ${rocsparse_minimum}") - - rocm_package_add_dependencies(DEPENDS ${hipsolver_pkgdeps}) - else() - string(JOIN "," CPACK_DEBIAN_RUNTIME_PACKAGE_RECOMMENDS "rocsparse" ${hipsolver_pkgdeps}) - string(JOIN "," CPACK_RPM_RUNTIME_PACKAGE_SUGGESTS "rocsparse" ${hipsolver_pkgdeps}) - endif() +# --- Packaging --- + +if(NOT HIPSOLVER_ENABLE_CUDA) + set(rocblas_minimum 4.2.0) + set(rocsolver_minimum 3.33.0) + rocm_package_add_dependencies(SHARED_DEPENDS + "rocblas >= ${rocblas_minimum}" "rocsolver >= ${rocsolver_minimum}" + ) + rocm_package_add_rpm_dependencies(STATIC_DEPENDS + "rocblas-static-devel >= ${rocblas_minimum}" "rocsolver-static-devel >= ${rocsolver_minimum}" + ) + rocm_package_add_deb_dependencies(STATIC_DEPENDS + "rocblas-static-dev >= ${rocblas_minimum}" "rocsolver-static-dev >= ${rocsolver_minimum}" + ) + + if(SYSTEM_OS STREQUAL "centos" OR SYSTEM_OS STREQUAL "rhel" + OR SYSTEM_OS STREQUAL "mariner" OR SYSTEM_OS STREQUAL "azurelinux") + list(APPEND hipsolver_pkgdeps "suitesparse") + elseif(SYSTEM_OS STREQUAL "ubuntu" AND SYSTEM_OS_VERSION VERSION_GREATER_EQUAL "24.04") + list(APPEND hipsolver_pkgdeps "libcholmod5" "libsuitesparseconfig7") + else() + list(APPEND hipsolver_pkgdeps "libcholmod3" "libsuitesparseconfig5") + endif() + + if(HIPSOLVER_ENABLE_SPARSE) + set(rocsparse_minimum 2.3.0) + rocm_package_add_dependencies(SHARED_DEPENDS "rocsparse >= ${rocsparse_minimum}") + rocm_package_add_rpm_dependencies(STATIC_DEPENDS "rocsparse-static-devel >= ${rocsparse_minimum}") + rocm_package_add_deb_dependencies(STATIC_DEPENDS "rocsparse-static-dev >= ${rocsparse_minimum}") + rocm_package_add_dependencies(DEPENDS ${hipsolver_pkgdeps}) + else() + string(JOIN "," CPACK_DEBIAN_RUNTIME_PACKAGE_RECOMMENDS "rocsparse" ${hipsolver_pkgdeps}) + string(JOIN "," CPACK_RPM_RUNTIME_PACKAGE_SUGGESTS "rocsparse" ${hipsolver_pkgdeps}) + endif() endif() -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md") set(CPACK_RPM_PACKAGE_LICENSE "MIT") if(WIN32) - set(CPACK_SOURCE_GENERATOR "ZIP") - set(CPACK_GENERATOR "ZIP") - if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "C:/hipSDK" CACHE PATH "Install path" FORCE) - endif() - set(INSTALL_PREFIX "C:/hipSDK") - set(CPACK_SET_DESTDIR OFF) - set(CPACK_PACKAGE_INSTALL_DIRECTORY "C:/hipSDK") - set(CPACK_PACKAGING_INSTALL_PREFIX "") - set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) + set(CPACK_SOURCE_GENERATOR "ZIP") + set(CPACK_GENERATOR "ZIP") + set(INSTALL_PREFIX "C:/hipSDK") + set(CPACK_SET_DESTDIR OFF) + set(CPACK_PACKAGE_INSTALL_DIRECTORY "C:/hipSDK") + set(CPACK_PACKAGING_INSTALL_PREFIX "") + set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) else() - if(NOT CPACK_PACKAGING_INSTALL_PREFIX) - set(CPACK_PACKAGING_INSTALL_PREFIX "${ROCM_PATH}") - endif() + if(NOT CPACK_PACKAGING_INSTALL_PREFIX) + set(CPACK_PACKAGING_INSTALL_PREFIX "${ROCM_PATH}") + endif() endif() set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "\${CPACK_PACKAGING_INSTALL_PREFIX}") -# Give hipsolver compiled for CUDA backend a different name -if(NOT USE_CUDA) - set(package_name hipsolver) +if(NOT HIPSOLVER_ENABLE_CUDA) + set(package_name hipsolver) else() - set(package_name hipsolver-alt) + set(package_name hipsolver-alt) endif() -set(HIPSOLVER_CONFIG_DIR "\${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" CACHE PATH "Path placed into ldconfig file") +set(HIPSOLVER_CONFIG_DIR "\${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" + CACHE PATH "Path placed into ldconfig file" +) rocm_create_package( NAME ${package_name} @@ -304,52 +209,54 @@ rocm_create_package( LDCONFIG_DIR ${HIPSOLVER_CONFIG_DIR} ) -# ADDITIONAL TARGETS FOR CODE COVERAGE -# -# make coverage -if(BUILD_CODE_COVERAGE) - set(coverage_test ./clients/staging/hipsolver-test) - - add_custom_target( - code_cov_tests - DEPENDS hipsolver-test - COMMAND echo Coverage GTEST_FILTER=\${GTEST_FILTER} - COMMAND ${CMAKE_COMMAND} -E rm -rf ./coverage-report - COMMAND ${CMAKE_COMMAND} -E make_directory ./coverage-report/profraw - COMMAND ${CMAKE_COMMAND} -E env LLVM_PROFILE_FILE="./coverage-report/profraw/hipSOLVER-coverage_%p.profraw" GTEST_LISTENER=NO_PASS_LINE_IN_LOG ${coverage_test} --gtest_filter=\"\${GTEST_FILTER}\" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) - - find_program( - LLVM_PROFDATA - llvm-profdata - REQUIRED - HINTS ${ROCM_PATH}/llvm/bin - PATHS /opt/rocm/llvm/bin - ) - - find_program( - LLVM_COV - llvm-cov - REQUIRED - HINTS ${ROCM_PATH}/llvm/bin - PATHS /opt/rocm/llvm/bin - ) - - add_custom_target( - coverage - DEPENDS code_cov_tests - COMMAND ${LLVM_PROFDATA} merge -sparse ./coverage-report/profraw/hipSOLVER-coverage_*.profraw -o ./coverage-report/hipSOLVER.profdata - COMMAND ${LLVM_COV} report -object ./library/src/libhipsolver.so -instr-profile=./coverage-report/hipSOLVER.profdata - COMMAND ${LLVM_COV} show -object ./library/src/libhipsolver.so -instr-profile=./coverage-report/hipSOLVER.profdata -format=html -output-dir=coverage-report - COMMAND ${LLVM_COV} export -object ./library/src/libhipsolver.so -instr-profile=./coverage-report/hipSOLVER.profdata -format=lcov > ./coverage-report/coverage.info - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) - - # Coverage cleanup - add_custom_target(coverage_cleanup - COMMAND find ${CMAKE_BINARY_DIR} -name *.gcda -delete - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) +# --- Code coverage targets --- + +if(HIPSOLVER_BUILD_COVERAGE) + find_program(LLVM_PROFDATA llvm-profdata + REQUIRED HINTS ${ROCM_PATH}/llvm/bin + ) + find_program(LLVM_COV llvm-cov + REQUIRED HINTS ${ROCM_PATH}/llvm/bin + ) + + set(_coverage_dir "${CMAKE_CURRENT_BINARY_DIR}/coverage-report") + + add_custom_target(code_cov_tests + DEPENDS hipsolver-test + COMMAND ${CMAKE_COMMAND} -E rm -rf "${_coverage_dir}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${_coverage_dir}/profraw" + COMMAND ${CMAKE_COMMAND} -E env + LLVM_PROFILE_FILE="${_coverage_dir}/profraw/hipSOLVER-coverage_%p.profraw" + GTEST_LISTENER=NO_PASS_LINE_IN_LOG + $ --gtest_filter="\${GTEST_FILTER}" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + + add_custom_target(coverage + DEPENDS code_cov_tests + COMMAND ${LLVM_PROFDATA} merge -sparse + "${_coverage_dir}/profraw/hipSOLVER-coverage_*.profraw" + -o "${_coverage_dir}/hipSOLVER.profdata" + COMMAND ${LLVM_COV} report + -object $ + -instr-profile="${_coverage_dir}/hipSOLVER.profdata" + COMMAND ${LLVM_COV} show + -object $ + -instr-profile="${_coverage_dir}/hipSOLVER.profdata" + -format=html -output-dir="${_coverage_dir}" + COMMAND ${LLVM_COV} export + -object $ + -instr-profile="${_coverage_dir}/hipSOLVER.profdata" + -format=lcov > "${_coverage_dir}/coverage.info" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Generating coverage report in ${_coverage_dir}" + ) + + add_custom_target(coverage_cleanup + COMMAND ${CMAKE_COMMAND} -E rm -f + "${CMAKE_BINARY_DIR}/*.profraw" + "${_coverage_dir}/hipSOLVER.profdata" + "${_coverage_dir}/coverage.info" + COMMAND ${CMAKE_COMMAND} -E rm -rf "${_coverage_dir}" + ) endif() - diff --git a/projects/hipsolver/CMakePresets.json b/projects/hipsolver/CMakePresets.json new file mode 100644 index 00000000000..316919d498c --- /dev/null +++ b/projects/hipsolver/CMakePresets.json @@ -0,0 +1,88 @@ +{ + "version": 6, + "cmakeMinimumRequired": { + "major": 3, + "minor": 21, + "patch": 0 + }, + "configurePresets": [ + { + "name": "base", + "hidden": true, + "binaryDir": "${sourceDir}/build/${presetName}", + "cacheVariables": { + "CMAKE_CXX_COMPILER": "/opt/rocm/bin/amdclang++", + "CMAKE_C_COMPILER": "/opt/rocm/bin/amdclang", + "CMAKE_PREFIX_PATH": "/opt/rocm", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + }, + { + "name": "dev-hip", + "displayName": "HIP Development", + "description": "HIP backend with tests, benchmarks, and samples enabled", + "inherits": "base", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "HIPSOLVER_ENABLE_CUDA": "OFF", + "HIPSOLVER_BUILD_TESTING": "ON", + "HIPSOLVER_ENABLE_BENCHMARKS": "ON", + "HIPSOLVER_ENABLE_SAMPLES": "ON", + "HIPSOLVER_ENABLE_VERBOSE": "ON" + } + }, + { + "name": "dev-cuda", + "displayName": "CUDA Development", + "description": "CUDA backend with tests, benchmarks, and samples enabled", + "inherits": "base", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "HIPSOLVER_ENABLE_CUDA": "ON", + "HIPSOLVER_BUILD_TESTING": "ON", + "HIPSOLVER_ENABLE_BENCHMARKS": "ON", + "HIPSOLVER_ENABLE_SAMPLES": "ON", + "HIPSOLVER_ENABLE_VERBOSE": "ON" + } + }, + { + "name": "release-hip", + "displayName": "HIP Release", + "description": "HIP backend release build with default options", + "inherits": "base", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_INSTALL_PREFIX": "/opt/rocm", + "HIPSOLVER_ENABLE_CUDA": "OFF" + } + }, + { + "name": "release-cuda", + "displayName": "CUDA Release", + "description": "CUDA backend release build with default options", + "inherits": "base", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "HIPSOLVER_ENABLE_CUDA": "ON" + } + } + ], + "buildPresets": [ + { + "name": "build-dev-hip", + "configurePreset": "dev-hip" + }, + { + "name": "build-dev-cuda", + "configurePreset": "dev-cuda" + }, + { + "name": "build-release-hip", + "configurePreset": "release-hip" + }, + { + "name": "build-release-cuda", + "configurePreset": "release-cuda" + } + ] +} diff --git a/projects/hipsolver/clients/CMakeLists.txt b/projects/hipsolver/clients/CMakeLists.txt index 2590d8535a9..f31a87f4f84 100644 --- a/projects/hipsolver/clients/CMakeLists.txt +++ b/projects/hipsolver/clients/CMakeLists.txt @@ -1,126 +1,96 @@ -# ######################################################################## -# Copyright (C) 2016-2024 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 cop- -# ies 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 IM- -# PLIED, 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 CONNE- -# CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# ######################################################################## - -# Consider removing this in the future -# This should appear before the project command, because it does not use FORCE -if(WIN32) - set(CMAKE_INSTALL_PREFIX "${PROJECT_BINARY_DIR}/package" CACHE PATH "Install path prefix, prepended onto install directories") -else() - set(CMAKE_INSTALL_PREFIX "/opt/rocm" CACHE PATH "Install path prefix, prepended onto install directories") -endif() - -# This has to be initialized before the project() command appears -# Set the default of CMAKE_BUILD_TYPE to be release, unless user specifies with -D. MSVC_IDE does not use CMAKE_BUILD_TYPE -if(NOT DEFINED CMAKE_CONFIGURATION_TYPES AND NOT DEFINED CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel.") -endif() - -# This project may compile dependencies for clients -project(hipsolver-clients LANGUAGES CXX) -if(UNIX) - enable_language(Fortran) -endif() +# Copyright Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT -# We use C++17 features, this will add compile option: -std=c++17 -set(CMAKE_CXX_STANDARD 17) +# --- Client dependencies --- -list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) - -include(build-options) - -# Linking lapack library requires fortran flags set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) + if(HIPSOLVER_FIND_PACKAGE_LAPACK_CONFIG) - find_package(LAPACK 3.7 REQUIRED CONFIG) + find_package(LAPACK 3.7 REQUIRED CONFIG) else() - find_package(LAPACK 3.7 REQUIRED) + find_package(LAPACK 3.7 REQUIRED) endif() if(NOT LAPACK_LIBRARIES) - set(LAPACK_LIBRARIES - ${LAPACK_blas_LIBRARIES} - ${LAPACK_lapack_LIBRARIES} - ) -endif() - -if(NOT TARGET hipsolver) - find_package(hipsolver REQUIRED CONFIG PATHS ${ROCM_PATH} /opt/rocm) + set(LAPACK_LIBRARIES + ${LAPACK_blas_LIBRARIES} + ${LAPACK_lapack_LIBRARIES} + ) endif() -if(BUILD_FORTRAN_BINDINGS) - set(hipsolver_f90_source_clients - include/hipsolver_fortran.f90 - ) +# --- Fortran client bindings --- + +if(HIPSOLVER_ENABLE_FORTRAN) + if(HIPSOLVER_BUILD_TESTING OR HIPSOLVER_ENABLE_BENCHMARKS) + add_library(hipsolver_fortran_client STATIC) + target_sources(hipsolver_fortran_client PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/include/hipsolver_fortran.f90" + ) + target_link_libraries(hipsolver_fortran_client PUBLIC hipsolver_fortran) + target_include_directories(hipsolver_fortran_client PUBLIC + $ + $ + ) + target_compile_definitions(hipsolver_fortran_client INTERFACE HAVE_HIPSOLVER_FORTRAN_CLIENT) + endif() endif() -if(BUILD_CLIENTS_TESTS OR BUILD_CLIENTS_BENCHMARKS) - if(BUILD_FORTRAN_BINDINGS) - add_library(hipsolver_fortran_client STATIC ${hipsolver_f90_source_clients}) - target_link_libraries(hipsolver_fortran_client hipsolver_fortran) - include_directories(${CMAKE_BINARY_DIR}/include/hipsolver) - include_directories(${CMAKE_BINARY_DIR}/include/hipsolver/internal) - target_compile_definitions(hipsolver_fortran_client INTERFACE HAVE_HIPSOLVER_FORTRAN_CLIENT) - endif() - - add_library(clients-common INTERFACE) - target_include_directories(clients-common INTERFACE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ) - target_link_libraries(clients-common INTERFACE - $<$:stdc++fs> - ) - set(common_source_files - common/clients_utility.cpp - common/hipsolver_datatype2string.cpp - common/lapack_host_reference.cpp - common/utility.cpp - rocsolvercommon/rocsolver_test.cpp - ) - - prepend_path("${CMAKE_CURRENT_SOURCE_DIR}/" common_source_files common_source_paths) - target_sources(clients-common INTERFACE ${common_source_paths}) - - # Copy and point to sparse test data - file(COPY - ${CMAKE_CURRENT_SOURCE_DIR}/sparsedata/ - DESTINATION ${PROJECT_BINARY_DIR}/staging/sparsedata/ - ) - install(DIRECTORY - ${CMAKE_CURRENT_SOURCE_DIR}/sparsedata/ - DESTINATION ${CMAKE_INSTALL_DATADIR}/hipsolver/test - COMPONENT tests - ) - - if(BUILD_CLIENTS_TESTS) - add_subdirectory(gtest) - endif() - - if(BUILD_CLIENTS_BENCHMARKS) - add_subdirectory(benchmarks) - endif() +# --- Common client library --- + +if(HIPSOLVER_BUILD_TESTING OR HIPSOLVER_ENABLE_BENCHMARKS) + add_library(hipsolver-clients-common OBJECT) + + target_compile_features(hipsolver-clients-common PRIVATE cxx_std_17) + + target_sources(hipsolver-clients-common PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/common/clients_utility.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/common/hipsolver_datatype2string.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/common/lapack_host_reference.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/common/utility.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/rocsolvercommon/rocsolver_test.cpp" + ) + + target_include_directories(hipsolver-clients-common + PUBLIC + $ + $ + ) + + target_link_libraries(hipsolver-clients-common + PUBLIC roc::hipsolver + PRIVATE Threads::Threads + ) + + target_link_libraries(hipsolver-clients-common PUBLIC + $<$:stdc++fs> + ) + + # Ensure PIC for shared library builds + set_target_properties(hipsolver-clients-common PROPERTIES + POSITION_INDEPENDENT_CODE ON + ) + + # Copy and point to sparse test data + file(COPY + "${CMAKE_CURRENT_SOURCE_DIR}/sparsedata/" + DESTINATION "${PROJECT_BINARY_DIR}/staging/sparsedata/" + ) + install(DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}/sparsedata/" + DESTINATION "${CMAKE_INSTALL_DATADIR}/hipsolver/test" + COMPONENT tests + ) + + if(HIPSOLVER_BUILD_TESTING) + add_subdirectory(gtest) + endif() + + if(HIPSOLVER_ENABLE_BENCHMARKS) + add_subdirectory(benchmarks) + endif() endif() -if(BUILD_CLIENTS_SAMPLES) - add_subdirectory(samples) +if(HIPSOLVER_ENABLE_SAMPLES) + add_subdirectory(samples) endif() diff --git a/projects/hipsolver/clients/benchmarks/CMakeLists.txt b/projects/hipsolver/clients/benchmarks/CMakeLists.txt index bdc577df7b2..e1550b787d0 100644 --- a/projects/hipsolver/clients/benchmarks/CMakeLists.txt +++ b/projects/hipsolver/clients/benchmarks/CMakeLists.txt @@ -1,94 +1,85 @@ -# ######################################################################## -# Copyright (C) 2016-2024 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 cop- -# ies 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 IM- -# PLIED, 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 CONNE- -# CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# ######################################################################## - -if(BUILD_HIPSPARSE_TESTS) - if(NOT TARGET hipsparse) - if(CUSTOM_HIPSPARSE) - set(ENV{hipsparse_DIR} ${CUSTOM_HIPSPARSE}) - find_package(hipsparse REQUIRED CONFIG NO_CMAKE_PATH) - else() - find_package(hipsparse REQUIRED CONFIG PATHS ${ROCM_PATH} /opt/rocm) - endif() - endif() +# Copyright Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +if(HIPSOLVER_ENABLE_HIPSPARSE_TESTS) + find_package(hipsparse REQUIRED CONFIG) endif() -add_executable(hipsolver-bench client.cpp) +# --- Benchmark executable --- + +add_executable(hipsolver-bench) + +target_compile_features(hipsolver-bench PRIVATE cxx_std_17) + +target_sources(hipsolver-bench PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/client.cpp" +) + +target_compile_definitions(hipsolver-bench PRIVATE HIPSOLVER_BENCH ROCM_USE_FLOAT16) + +# --- Includes --- -# Internal header includes -target_include_directories(hipsolver-bench - PRIVATE +target_include_directories(hipsolver-bench PRIVATE $ ) -# External header includes included as system files -target_include_directories(hipsolver-bench - SYSTEM PRIVATE +target_include_directories(hipsolver-bench SYSTEM PRIVATE $ $ ) +# --- Linking --- + target_link_libraries(hipsolver-bench PRIVATE - ${LAPACK_LIBRARIES} - hipsolver-common - clients-common - roc::hipsolver + ${LAPACK_LIBRARIES} + hipsolver-clients-common + roc::hipsolver ) -if(BUILD_HIPSPARSE_TESTS) - set_source_files_properties(client.cpp - PROPERTIES - COMPILE_DEFINITIONS HAVE_HIPSPARSE - ) - target_link_libraries(hipsolver-bench PRIVATE roc::hipsparse) + +if(HIPSOLVER_ENABLE_HIPSPARSE_TESTS) + set_source_files_properties(client.cpp PROPERTIES COMPILE_DEFINITIONS HAVE_HIPSPARSE) + target_link_libraries(hipsolver-bench PRIVATE roc::hipsparse) endif() -if(BUILD_FORTRAN_BINDINGS) - target_link_libraries(hipsolver-bench PRIVATE hipsolver_fortran_client) + +if(HIPSOLVER_ENABLE_FORTRAN) + target_link_libraries(hipsolver-bench PRIVATE hipsolver_fortran_client) endif() -add_armor_flags(hipsolver-bench "${ARMOR_LEVEL}") +# --- ASAN flags --- -if(NOT USE_CUDA) - target_link_libraries(hipsolver-bench PRIVATE hip::host) +if(HIPSOLVER_ENABLE_ASAN) + target_compile_options(hipsolver-bench PRIVATE -fsanitize=address -shared-libasan) + target_link_options(hipsolver-bench PRIVATE -fsanitize=address -shared-libasan -fuse-ld=lld) +endif() - if(CUSTOM_TARGET) - target_link_libraries(hipsolver-bench PRIVATE hip::${CUSTOM_TARGET}) - endif() +# --- Armor --- - if(UNIX AND CMAKE_CXX_COMPILER MATCHES ".*/hipcc$") - # hip-clang needs specific flag to turn on pthread and m - target_link_libraries(hipsolver-bench PRIVATE -lpthread -lm) - endif() -else() - target_compile_definitions(hipsolver-bench PRIVATE __HIP_PLATFORM_NVIDIA__) +add_armor_flags(hipsolver-bench "${HIPSOLVER_ARMOR_LEVEL}") + +# --- Platform-specific linking --- - target_include_directories(hipsolver-bench - PRIVATE - $ - ) +if(NOT HIPSOLVER_ENABLE_CUDA) + target_link_libraries(hipsolver-bench PRIVATE hip::host) - target_link_libraries(hipsolver-bench PRIVATE ${CUDA_LIBRARIES} Threads::Threads) + if(CUSTOM_TARGET) + target_link_libraries(hipsolver-bench PRIVATE hip::${CUSTOM_TARGET}) + endif() + + if(UNIX AND CMAKE_CXX_COMPILER MATCHES ".*/hipcc$") + target_link_libraries(hipsolver-bench PRIVATE -lpthread -lm) + endif() +else() + target_compile_definitions(hipsolver-bench PRIVATE __HIP_PLATFORM_NVIDIA__) + target_include_directories(hipsolver-bench PRIVATE + $ + ) + target_link_libraries(hipsolver-bench PRIVATE ${CUDA_LIBRARIES} Threads::Threads) endif() -set_target_properties(hipsolver-bench PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/staging") +# --- Output and install --- -rocm_install(TARGETS hipsolver-bench COMPONENT benchmarks) +set_target_properties(hipsolver-bench PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/staging" +) -target_compile_definitions(hipsolver-bench PRIVATE HIPSOLVER_BENCH ROCM_USE_FLOAT16) +rocm_install(TARGETS hipsolver-bench COMPONENT benchmarks) diff --git a/projects/hipsolver/clients/cmake/build-options.cmake b/projects/hipsolver/clients/cmake/build-options.cmake deleted file mode 100644 index 87f37031160..00000000000 --- a/projects/hipsolver/clients/cmake/build-options.cmake +++ /dev/null @@ -1,43 +0,0 @@ -# ######################################################################## -# Copyright (C) 2016-2022 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 cop- -# ies 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 IM- -# PLIED, 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 CONNE- -# CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# ######################################################################## - -# This file is intended to be used in two ways; independently in a stand alone PROJECT -# and as part of a superbuild. If the file is included in a stand alone project, the -# variables are not expected to be preset, and this will produce options() in the GUI -# for the user to examine. If this file is included in a superbuild, the options will be -# presented in the superbuild GUI, but then passed into the ExternalProject as -D -# parameters, which would already define them. - -if(NOT BUILD_CLIENTS_TESTS) - option(BUILD_CLIENTS_TESTS "Build hipSOLVER unit tests" OFF) -endif() - -if(NOT BUILD_CLIENTS_BENCHMARKS) - option(BUILD_CLIENTS_BENCHMARKS "Build hipSOLVER benchmarks" OFF) -endif() - -if(NOT BUILD_CLIENTS_SAMPLES) - option(BUILD_CLIENTS_SAMPLES "Build hipSOLVER samples" OFF) -endif() - - - diff --git a/projects/hipsolver/clients/gtest/CMakeLists.txt b/projects/hipsolver/clients/gtest/CMakeLists.txt index 0681f2ac059..d6e0aac2314 100644 --- a/projects/hipsolver/clients/gtest/CMakeLists.txt +++ b/projects/hipsolver/clients/gtest/CMakeLists.txt @@ -1,189 +1,172 @@ -# ######################################################################## -# Copyright (C) 2016-2024 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 cop- -# ies 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 IM- -# PLIED, 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 CONNE- -# CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# ######################################################################## +# Copyright Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT find_package(GTest REQUIRED) -if(BUILD_HIPBLAS_TESTS) - if(NOT TARGET hipblas) - if(CUSTOM_HIPBLAS) - set(ENV{hipblas_DIR} ${CUSTOM_HIPBLAS}) - find_package(hipblas REQUIRED CONFIG NO_CMAKE_PATH) - else() - find_package(hipblas REQUIRED CONFIG PATHS ${ROCM_PATH} /opt/rocm) - endif() - endif() +if(HIPSOLVER_ENABLE_HIPBLAS_TESTS) + find_package(hipblas REQUIRED CONFIG) endif() -if(BUILD_HIPSPARSE_TESTS) - if(NOT TARGET hipsparse) - if(CUSTOM_HIPSPARSE) - set(ENV{hipsparse_DIR} ${CUSTOM_HIPSPARSE}) - find_package(hipsparse REQUIRED CONFIG NO_CMAKE_PATH) - else() - find_package(hipsparse REQUIRED CONFIG PATHS ${ROCM_PATH} /opt/rocm) - endif() - endif() +if(HIPSOLVER_ENABLE_HIPSPARSE_TESTS) + find_package(hipsparse REQUIRED CONFIG) endif() -set(hipsolverDn_test_source - hipsolver_gtest_main.cpp - getrs_gtest.cpp - getrf_gtest.cpp - gebrd_gtest.cpp - gels_gtest.cpp - geqrf_gtest.cpp - gesv_gtest.cpp - gesvd_gtest.cpp - gesvda_gtest.cpp - gesvdj_gtest.cpp - potrf_gtest.cpp - potri_gtest.cpp - potrs_gtest.cpp - syevd_heevd_gtest.cpp - syevj_heevj_gtest.cpp - sygvd_hegvd_gtest.cpp - sygvj_hegvj_gtest.cpp - syevdx_heevdx_gtest.cpp - sygvdx_hegvdx_gtest.cpp - sytrd_hetrd_gtest.cpp - sytrf_gtest.cpp - orgbr_ungbr_gtest.cpp - orgqr_ungqr_gtest.cpp - orgtr_ungtr_gtest.cpp - ormqr_unmqr_gtest.cpp - ormtr_unmtr_gtest.cpp +# --- Test executable --- + +add_executable(hipsolver-test) + +target_compile_features(hipsolver-test PRIVATE cxx_std_17) + +target_sources(hipsolver-test PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/hipsolver_gtest_main.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/determinism_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/params_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/getrs_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/getrf_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/gebrd_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/gels_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/geqrf_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/gesv_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/gesvd_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/gesvda_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/gesvdj_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/potrf_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/potri_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/potrs_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/syevd_heevd_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/syevj_heevj_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/sygvd_hegvd_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/sygvj_hegvj_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/syevdx_heevdx_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/sygvdx_hegvdx_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/sytrd_hetrd_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/sytrf_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/orgbr_ungbr_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/orgqr_ungqr_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/orgtr_ungtr_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ormqr_unmqr_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ormtr_unmtr_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/csrrf_refactlu_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/csrrf_solve_gtest.cpp" ) -set(hipsolverSp_test_source - csrlsvchol_gtest.cpp - csrlsvqr_gtest.cpp -) +# --- Coverage --- -set(hipsolverRf_test_source - csrrf_refactlu_gtest.cpp - csrrf_solve_gtest.cpp -) +if(HIPSOLVER_BUILD_COVERAGE) + target_compile_options(hipsolver-test PRIVATE -fprofile-instr-generate -fcoverage-mapping) + target_link_options(hipsolver-test PRIVATE -fprofile-instr-generate) +endif() + +# --- Includes --- -set(others_test_source - determinism_gtest.cpp - params_gtest.cpp +target_include_directories(hipsolver-test PRIVATE + $ ) -add_executable(hipsolver-test ${others_test_source} ${hipsolverDn_test_source} ${hipsolverRf_test_source}) +target_include_directories(hipsolver-test SYSTEM PRIVATE + $ + $ +) -if(BUILD_COVERAGE) - target_compile_options(hipsolver-test PRIVATE -g -O0 -fgenerate-instr-profile -fcoverage-mapping) - target_link_options(hipsolver-test PUBLIC -g -O0 -fgenerate-instr-profile) -endif() +# --- Armor --- -target_include_directories(hipsolver-test - PRIVATE - $ -) +add_armor_flags(hipsolver-test "${HIPSOLVER_ARMOR_LEVEL}") -add_armor_flags(hipsolver-test "${ARMOR_LEVEL}") +# --- Definitions --- target_compile_definitions(hipsolver-test PRIVATE GOOGLE_TEST) -# External header includes included as SYSTEM files -target_include_directories(hipsolver-test - SYSTEM PRIVATE - $ - $ -) +# --- ASAN flags --- + +if(HIPSOLVER_ENABLE_ASAN) + target_compile_options(hipsolver-test PRIVATE -fsanitize=address -shared-libasan) + target_link_options(hipsolver-test PRIVATE -fsanitize=address -shared-libasan -fuse-ld=lld) +endif() + +# --- Linking --- target_link_libraries(hipsolver-test PRIVATE - ${LAPACK_LIBRARIES} - hipsolver-common - clients-common - $,GTest::gtest,GTest::GTest> - Threads::Threads - roc::hipsolver + ${LAPACK_LIBRARIES} + hipsolver-clients-common + $,GTest::gtest,GTest::GTest> + Threads::Threads + roc::hipsolver ) -if(BUILD_HIPBLAS_TESTS) - target_link_libraries(hipsolver-test PRIVATE roc::hipblas) - target_sources(hipsolver-test PRIVATE hipblas_include1_gtest.cpp hipblas_include2_gtest.cpp) -endif() -if(BUILD_HIPSPARSE_TESTS) - target_link_libraries(hipsolver-test PRIVATE roc::hipsparse) - target_sources(hipsolver-test PRIVATE ${hipsolverSp_test_source}) + +if(HIPSOLVER_ENABLE_HIPBLAS_TESTS) + target_link_libraries(hipsolver-test PRIVATE roc::hipblas) + target_sources(hipsolver-test PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/hipblas_include1_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/hipblas_include2_gtest.cpp" + ) endif() -if(BUILD_FORTRAN_BINDINGS) - target_link_libraries(hipsolver-test PRIVATE hipsolver_fortran_client) - target_sources(hipsolver-test PRIVATE ${hipsolver_f90_source}) + +if(HIPSOLVER_ENABLE_HIPSPARSE_TESTS) + target_link_libraries(hipsolver-test PRIVATE roc::hipsparse) + target_sources(hipsolver-test PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/csrlsvchol_gtest.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/csrlsvqr_gtest.cpp" + ) endif() -if(NOT USE_CUDA) - target_link_libraries(hipsolver-test PRIVATE hip::host) +if(HIPSOLVER_ENABLE_FORTRAN) + target_link_libraries(hipsolver-test PRIVATE hipsolver_fortran_client) +endif() - if(CUSTOM_TARGET) - target_link_libraries(hipsolver-test PRIVATE hip::${CUSTOM_TARGET}) - endif() +# --- Platform-specific linking --- - if(CMAKE_CXX_COMPILER MATCHES ".*/hipcc$") - #hip-clang needs specific flag to turn on pthread and m - target_link_libraries(hipsolver-test PRIVATE -lpthread -lm) - endif() -else() - target_compile_definitions(hipsolver-test PRIVATE __HIP_PLATFORM_NVIDIA__) +if(NOT HIPSOLVER_ENABLE_CUDA) + target_link_libraries(hipsolver-test PRIVATE hip::host) - target_include_directories(hipsolver-test - PRIVATE - $ - ) + if(CUSTOM_TARGET) + target_link_libraries(hipsolver-test PRIVATE hip::${CUSTOM_TARGET}) + endif() - target_link_libraries(hipsolver-test PRIVATE ${CUDA_LIBRARIES} Threads::Threads) + if(CMAKE_CXX_COMPILER MATCHES ".*/hipcc$") + target_link_libraries(hipsolver-test PRIVATE -lpthread -lm) + endif() +else() + target_compile_definitions(hipsolver-test PRIVATE __HIP_PLATFORM_NVIDIA__) + target_include_directories(hipsolver-test PRIVATE + $ + ) + target_link_libraries(hipsolver-test PRIVATE ${CUDA_LIBRARIES} Threads::Threads) endif() -set_target_properties(hipsolver-test PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/staging") +# --- Output and install --- + +set_target_properties(hipsolver-test PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/staging" +) rocm_install(TARGETS hipsolver-test COMPONENT tests) +# --- Windows DLL copy --- + if(WIN32) - file(GLOB third_party_dlls - LIST_DIRECTORIES OFF - CONFIGURE_DEPENDS - ${cblas_DIR}/bin/*.dll - ${GTest_DIR}/bin/*.dll - $ENV{rocblas_DIR}/bin/*.dll - $ENV{rocsolver_DIR}/bin/*.dll - $ENV{HIP_DIR}/bin/*.dll - $ENV{HIP_DIR}/bin/hipinfo.exe - ${CMAKE_SOURCE_DIR}/rtest.* - ) - foreach(file_i ${third_party_dlls}) - add_custom_command(TARGET hipsolver-test - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy ${file_i} ${PROJECT_BINARY_DIR}/staging/ - ) - endforeach() - if(DEFINED ENV{rocblas_DIR}) - add_custom_command(TARGET hipsolver-test - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_directory $ENV{rocblas_DIR}/bin/rocblas/library ${PROJECT_BINARY_DIR}/staging/library + file(GLOB third_party_dlls + LIST_DIRECTORIES OFF + CONFIGURE_DEPENDS + ${cblas_DIR}/bin/*.dll + ${GTest_DIR}/bin/*.dll + $ENV{rocblas_DIR}/bin/*.dll + $ENV{rocsolver_DIR}/bin/*.dll + $ENV{HIP_DIR}/bin/*.dll + $ENV{HIP_DIR}/bin/hipinfo.exe + ${CMAKE_SOURCE_DIR}/rtest.* ) - else() - message(WARNING "ENV{rocblas_DIR} not set, tests may be missing .dlls") - endif() + foreach(file_i ${third_party_dlls}) + add_custom_command(TARGET hipsolver-test POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${file_i} ${PROJECT_BINARY_DIR}/staging/ + ) + endforeach() + if(DEFINED ENV{rocblas_DIR}) + add_custom_command(TARGET hipsolver-test POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + $ENV{rocblas_DIR}/bin/rocblas/library + ${PROJECT_BINARY_DIR}/staging/library + ) + else() + message(WARNING "ENV{rocblas_DIR} not set, tests may be missing .dlls") + endif() endif() diff --git a/projects/hipsolver/clients/samples/CMakeLists.txt b/projects/hipsolver/clients/samples/CMakeLists.txt index 2fe24cc4b9d..bd3fd68f5f8 100644 --- a/projects/hipsolver/clients/samples/CMakeLists.txt +++ b/projects/hipsolver/clients/samples/CMakeLists.txt @@ -1,66 +1,70 @@ -# ######################################################################## -# Copyright (C) 2016-2024 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 cop- -# ies 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 IM- -# PLIED, 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 CONNE- -# CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# ######################################################################## +# Copyright Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT -add_executable(example-c-basic example_basic.c) -add_executable(example-cpp-basic example_basic.cpp) +# --- C sample (C99 compatibility test) --- -# We test for C99 compatibility in the example-c.c test -set_source_files_properties(example_basic.c PROPERTIES LANGUAGE CXX) -set_source_files_properties(example_basic.c PROPERTIES COMPILE_FLAGS "-xc -std=c99") +add_executable(example-c-basic) +target_sources(example-c-basic PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/example_basic.c" +) +set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/example_basic.c" + PROPERTIES LANGUAGE CXX COMPILE_FLAGS "-xc -std=c99" +) +set_target_properties(example-c-basic PROPERTIES + LINKER_LANGUAGE CXX + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/staging" +) -# Test for C++11 compatibility in one of the samples -set_property(TARGET example-cpp-basic PROPERTY CXX_STANDARD 11) +target_include_directories(example-c-basic SYSTEM PRIVATE + $ +) +target_include_directories(example-c-basic PRIVATE + $ +) +target_link_libraries(example-c-basic PRIVATE roc::hipsolver) -foreach(exe example-c-basic;example-cpp-basic;) - - # External header includes included as SYSTEM files - target_include_directories(${exe} - SYSTEM PRIVATE - $ - ) +if(NOT HIPSOLVER_ENABLE_CUDA) + target_link_libraries(example-c-basic PRIVATE hip::host) + if(CUSTOM_TARGET) + target_link_libraries(example-c-basic PRIVATE hip::${CUSTOM_TARGET}) + endif() +else() + target_compile_definitions(example-c-basic PRIVATE __HIP_PLATFORM_NVIDIA__) + target_include_directories(example-c-basic PRIVATE + $ + ) + target_link_libraries(example-c-basic PRIVATE ${CUDA_LIBRARIES}) +endif() - target_include_directories(${exe} PRIVATE $) +# --- C++ sample (C++11 compatibility test) --- - target_link_libraries(${exe} PRIVATE roc::hipsolver) +add_executable(example-cpp-basic) +target_sources(example-cpp-basic PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/example_basic.cpp" +) +set_target_properties(example-cpp-basic PROPERTIES + CXX_STANDARD 11 + LINKER_LANGUAGE CXX + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/staging" +) - if(NOT USE_CUDA) - target_link_libraries(${exe} PRIVATE hip::host) +target_include_directories(example-cpp-basic SYSTEM PRIVATE + $ +) +target_include_directories(example-cpp-basic PRIVATE + $ +) +target_link_libraries(example-cpp-basic PRIVATE roc::hipsolver) +if(NOT HIPSOLVER_ENABLE_CUDA) + target_link_libraries(example-cpp-basic PRIVATE hip::host) if(CUSTOM_TARGET) - target_link_libraries(${exe} PRIVATE hip::${CUSTOM_TARGET}) + target_link_libraries(example-cpp-basic PRIVATE hip::${CUSTOM_TARGET}) endif() - - else() - target_compile_definitions(${exe} PRIVATE __HIP_PLATFORM_NVIDIA__) - - target_include_directories(${exe} - PRIVATE +else() + target_compile_definitions(example-cpp-basic PRIVATE __HIP_PLATFORM_NVIDIA__) + target_include_directories(example-cpp-basic PRIVATE $ ) - - target_link_libraries(${exe} PRIVATE ${CUDA_LIBRARIES}) - endif() - - set_target_properties(${exe} PROPERTIES LINKER_LANGUAGE CXX) - set_target_properties(${exe} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/staging") - -endforeach() + target_link_libraries(example-cpp-basic PRIVATE ${CUDA_LIBRARIES}) +endif() diff --git a/projects/hipsolver/cmake/armor-config.cmake b/projects/hipsolver/cmake/armor-config.cmake index 679d2fc5b8b..c221c416271 100644 --- a/projects/hipsolver/cmake/armor-config.cmake +++ b/projects/hipsolver/cmake/armor-config.cmake @@ -1,25 +1,5 @@ -# ######################################################################## -# Copyright (C) 2020-2022 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 cop- -# ies 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 IM- -# PLIED, 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 CONNE- -# CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# ######################################################################## - +# Copyright Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT # Enables increasingly expensive runtime correctness checks # 0 - Nothing @@ -28,17 +8,17 @@ # with optimizations enabled. e.g. -Og # 2 - Expensive correctness checks (debug iterators) macro(add_armor_flags target level) - if(UNIX AND "${level}" GREATER "0") - if("${level}" GREATER "1") - # Building with std debug iterators is enabled by the defines below, but - # requires building C++ dependencies with the same defines. - target_compile_definitions(${target} PRIVATE - _GLIBCXX_DEBUG - ) + if(UNIX AND "${level}" GREATER "0") + if("${level}" GREATER "1") + # Building with std debug iterators is enabled by the defines below, but + # requires building C++ dependencies with the same defines. + target_compile_definitions(${target} PRIVATE + _GLIBCXX_DEBUG + ) + endif() + target_compile_definitions(${target} PRIVATE + $<$>:_FORTIFY_SOURCE=1> + _GLIBCXX_ASSERTIONS + ) endif() - target_compile_definitions(${target} PRIVATE - $<$>:_FORTIFY_SOURCE=1> # requires optimizations to work - _GLIBCXX_ASSERTIONS - ) - endif() endmacro() diff --git a/projects/hipsolver/cmake/hipsolver-options-shim.cmake b/projects/hipsolver/cmake/hipsolver-options-shim.cmake new file mode 100644 index 00000000000..61a7ca22a36 --- /dev/null +++ b/projects/hipsolver/cmake/hipsolver-options-shim.cmake @@ -0,0 +1,50 @@ +# Copyright Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +# Backward-compatibility shim for renamed hipSOLVER cache variables. +# Maps old BUILD_* / USE_* names to new HIPSOLVER_* names. +# Include this BEFORE defining options so user-provided old names take effect. + +macro(_hipsolver_deprecate_option old_name new_name) + if(DEFINED ${old_name} AND NOT DEFINED ${new_name}) + message(DEPRECATION + "${old_name} is deprecated. Use ${new_name} instead." + ) + set(${new_name} "${${old_name}}" CACHE BOOL "" FORCE) + elseif(DEFINED ${old_name} AND DEFINED ${new_name}) + message(WARNING + "Both ${old_name} and ${new_name} are defined. " + "Using ${new_name}=${${new_name}}, ignoring ${old_name}=${${old_name}}." + ) + endif() +endmacro() + +macro(_hipsolver_deprecate_string_option old_name new_name) + if(DEFINED ${old_name} AND NOT DEFINED ${new_name}) + message(DEPRECATION + "${old_name} is deprecated. Use ${new_name} instead." + ) + set(${new_name} "${${old_name}}" CACHE STRING "" FORCE) + elseif(DEFINED ${old_name} AND DEFINED ${new_name}) + message(WARNING + "Both ${old_name} and ${new_name} are defined. " + "Using ${new_name}=${${new_name}}, ignoring ${old_name}=${${old_name}}." + ) + endif() +endmacro() + +# Boolean options +_hipsolver_deprecate_option(BUILD_ADDRESS_SANITIZER HIPSOLVER_ENABLE_ASAN) +_hipsolver_deprecate_option(BUILD_CODE_COVERAGE HIPSOLVER_BUILD_COVERAGE) +_hipsolver_deprecate_option(BUILD_HIPBLAS_TESTS HIPSOLVER_ENABLE_HIPBLAS_TESTS) +_hipsolver_deprecate_option(BUILD_HIPSPARSE_TESTS HIPSOLVER_ENABLE_HIPSPARSE_TESTS) +_hipsolver_deprecate_option(BUILD_WITH_SPARSE HIPSOLVER_ENABLE_SPARSE) +_hipsolver_deprecate_option(BUILD_VERBOSE HIPSOLVER_ENABLE_VERBOSE) +_hipsolver_deprecate_option(USE_CUDA HIPSOLVER_ENABLE_CUDA) +_hipsolver_deprecate_option(BUILD_FORTRAN_BINDINGS HIPSOLVER_ENABLE_FORTRAN) +_hipsolver_deprecate_option(BUILD_CLIENTS_TESTS HIPSOLVER_BUILD_TESTING) +_hipsolver_deprecate_option(BUILD_CLIENTS_BENCHMARKS HIPSOLVER_ENABLE_BENCHMARKS) +_hipsolver_deprecate_option(BUILD_CLIENTS_SAMPLES HIPSOLVER_ENABLE_SAMPLES) + +# String/numeric options +_hipsolver_deprecate_string_option(ARMOR_LEVEL HIPSOLVER_ARMOR_LEVEL) diff --git a/projects/hipsolver/library/CMakeLists.txt b/projects/hipsolver/library/CMakeLists.txt index f9836c22f49..0697a7aa02f 100644 --- a/projects/hipsolver/library/CMakeLists.txt +++ b/projects/hipsolver/library/CMakeLists.txt @@ -1,85 +1,17 @@ -# ######################################################################## -# Copyright (C) 2016-2025 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 cop- -# ies 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 IM- -# PLIED, 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 CONNE- -# CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# ######################################################################## +# Copyright Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT - -# This is incremented when the ABI to the library changes +# ABI version for the shared library set(hipsolver_SOVERSION 1.0) -list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${ROCM_PATH}/lib/cmake/hip /opt/rocm/lib/cmake/hip ${HIP_PATH}/cmake) - -# This option only works for make/nmake and the ninja generators, but no reason it shouldn't be on all the time -# This tells cmake to create a compile_commands.json file that can be used with clang tooling or vim -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -# Print out compiler flags for viewing/debug -if(BUILD_VERBOSE) - message(STATUS "hipsolver_VERSION: " ${hipsolver_VERSION}) - message(STATUS "\t==>CMAKE_BUILD_TYPE: " ${CMAKE_BUILD_TYPE}) - message(STATUS "\t==>BUILD_SHARED_LIBS: " ${BUILD_SHARED_LIBS}) - message(STATUS "\t==>CMAKE_INSTALL_PREFIX link: " ${CMAKE_INSTALL_PREFIX}) - message(STATUS "\t==>CMAKE_MODULE_PATH link: " ${CMAKE_MODULE_PATH}) - message(STATUS "\t==>CMAKE_PREFIX_PATH link: " ${CMAKE_PREFIX_PATH}) - - message(STATUS "\t==>CMAKE_CXX_COMPILER flags: " ${CMAKE_CXX_FLAGS}) - message(STATUS "\t==>CMAKE_CXX_COMPILER debug flags: " ${CMAKE_CXX_FLAGS_DEBUG}) - message(STATUS "\t==>CMAKE_CXX_COMPILER release flags: " ${CMAKE_CXX_FLAGS_RELEASE}) - message(STATUS "\t==>CMAKE_CXX_COMPILER relwithdebinfo flags: " ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}) - message(STATUS "\t==>CMAKE_EXE_LINKER link flags: " ${CMAKE_EXE_LINKER_FLAGS}) -endif() - -if(NOT USE_CUDA) - find_package(hip REQUIRED PATHS ${ROCM_PATH} /opt/rocm ${HIP_PATH}) -else() - find_package(HIP REQUIRED) -endif() - -# configure a header file to pass the CMake version settings to the source, and package the header files in the output archive -configure_file("${CMAKE_CURRENT_SOURCE_DIR}/include/internal/hipsolver-version.h.in" - "${PROJECT_BINARY_DIR}/include/hipsolver/internal/hipsolver-version.h") - -set(hipsolver_headers_public - include/hipsolver.h - include/internal/hipsolver-types.h - include/internal/hipsolver-functions.h - include/internal/hipsolver-compat.h - include/internal/hipsolver-dense.h - include/internal/hipsolver-dense64.h - include/internal/hipsolver-refactor.h - include/internal/hipsolver-sparse.h - ${PROJECT_BINARY_DIR}/include/hipsolver/internal/hipsolver-version.h +# Configure version header +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/include/internal/hipsolver-version.h.in" + "${PROJECT_BINARY_DIR}/include/hipsolver/internal/hipsolver-version.h" ) -source_group("Header Files\\Public" FILES ${hipsolver_headers_public}) - -set(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/include/hipsolver/internal) +if(HIPSOLVER_ENABLE_FORTRAN) + set(CMAKE_Fortran_MODULE_DIRECTORY "${PROJECT_BINARY_DIR}/include/hipsolver/internal") +endif() -# Build into subdirectories add_subdirectory(src) - -# The following code is setting variables to control the behavior of CPack to generate our -# if(WIN32) -# set(CPACK_SOURCE_GENERATOR "ZIP") -# set(CPACK_GENERATOR "ZIP") -# else() -# set(CPACK_SOURCE_GENERATOR "TGZ") -# set(CPACK_GENERATOR "DEB;RPM" CACHE STRING "cpack list: 7Z, DEB, IFW, NSIS, NSIS64, RPM, STGZ, TBZ2, TGZ, TXZ, TZ, ZIP") -# endif() diff --git a/projects/hipsolver/library/src/CMakeLists.txt b/projects/hipsolver/library/src/CMakeLists.txt index dee02fdc47a..90eb212ea3a 100644 --- a/projects/hipsolver/library/src/CMakeLists.txt +++ b/projects/hipsolver/library/src/CMakeLists.txt @@ -1,285 +1,250 @@ -# ######################################################################## -# Copyright (C) 2016-2024 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 cop- -# ies 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 IM- -# PLIED, 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 CONNE- -# CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# ######################################################################## - - -# ######################################################################## -# A helper function to prefix a source list of files with a common path into a new list (non-destructive) -# ######################################################################## -function(prepend_path prefix source_list_of_files return_list_of_files) - foreach(file ${${source_list_of_files}}) - if(IS_ABSOLUTE ${file}) - list(APPEND new_list ${file}) - else() - list(APPEND new_list ${prefix}/${file}) - endif() - endforeach() - set(${return_list_of_files} ${new_list} PARENT_SCOPE) -endfunction() - -# ######################################################################## -# Main -# ######################################################################## -prepend_path(".." hipsolver_headers_public relative_hipsolver_headers_public) - -if(NOT USE_CUDA) - set(hipsolver_source - "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver_conversions.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver_dense.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver_dense64.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver_refactor.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver_sparse.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/common/hipsolver_dense_common.cpp" - ) - if(NOT BUILD_WITH_SPARSE) - list(APPEND hipsolver_source - "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/dlopen/cholmod.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/dlopen/rocsparse.cpp" - ) - endif() -else() - set(hipsolver_source - "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver_conversions.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver_dense.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver_dense64.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver_refactor.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver_sparse.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/common/hipsolver_dense_common.cpp" - ) -endif() +# Copyright Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT -set(hipsolver_f90_source - hipsolver_module.f90 -) +# --- Fortran bindings --- -if(BUILD_FORTRAN_BINDINGS) - # Create hipSOLVER Fortran module - add_library(hipsolver_fortran ${hipsolver_f90_source}) - rocm_set_soversion(hipsolver_fortran ${hipsolver_SOVERSION}) - rocm_install(TARGETS hipsolver_fortran) +if(HIPSOLVER_ENABLE_FORTRAN) + add_library(hipsolver_fortran) + target_sources(hipsolver_fortran PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/hipsolver_module.f90" + ) + rocm_set_soversion(hipsolver_fortran ${hipsolver_SOVERSION}) + rocm_install(TARGETS hipsolver_fortran) endif() -add_library(hipsolver - ${hipsolver_source} - ${relative_hipsolver_headers_public} -) +# --- Main library target --- + +add_library(hipsolver) add_library(roc::hipsolver ALIAS hipsolver) -target_link_libraries(hipsolver PRIVATE - $ # https://gitlab.kitware.com/cmake/cmake/-/issues/15415 -) +target_compile_features(hipsolver PRIVATE cxx_std_17) +set_target_properties(hipsolver PROPERTIES CXX_EXTENSIONS OFF) + +# Warning suppression (was in hipsolver-common INTERFACE library) +target_compile_options(hipsolver PRIVATE -Wno-unused-result) + +# --- Sources --- + +if(NOT HIPSOLVER_ENABLE_CUDA) + target_sources(hipsolver PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver_conversions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver_dense.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver_dense64.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver_refactor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/hipsolver_sparse.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/common/hipsolver_dense_common.cpp" + ) + if(NOT HIPSOLVER_ENABLE_SPARSE) + target_sources(hipsolver PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/dlopen/cholmod.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/amd_detail/dlopen/rocsparse.cpp" + ) + endif() +else() + target_sources(hipsolver PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver_conversions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver_dense.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver_dense64.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver_refactor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/nvidia_detail/hipsolver_sparse.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/common/hipsolver_dense_common.cpp" + ) +endif() -if(BUILD_CODE_COVERAGE) - target_compile_options(hipsolver PRIVATE -g -O0 -fprofile-instr-generate -fcoverage-mapping) - target_link_options(hipsolver PUBLIC -fprofile-instr-generate) +# --- Static library define --- + +if(NOT BUILD_SHARED_LIBS) + target_compile_definitions(hipsolver PRIVATE HIPSOLVER_STATIC_LIB) + set_target_properties(hipsolver PROPERTIES PREFIX "lib") endif() -add_armor_flags(hipsolver "${ARMOR_LEVEL}") +# --- WIN32 compile definitions --- if(WIN32) - if(BUILD_CLIENTS_BENCHMARKS OR BUILD_CLIENTS_TESTS) - add_custom_command(TARGET hipsolver - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_BINARY_DIR}/staging/$" "${PROJECT_BINARY_DIR}/clients/staging/$" + target_compile_definitions(hipsolver PRIVATE + WIN32_LEAN_AND_MEAN + _CRT_SECURE_NO_WARNINGS + NOMINMAX ) - if(${CMAKE_BUILD_TYPE} MATCHES "Debug") - add_custom_command(TARGET hipsolver - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_BINARY_DIR}/staging/$" "${PROJECT_BINARY_DIR}/clients/staging/$" - ) - endif() - endif() endif() -set(static_depends) +# --- ASAN flags (was in hipsolver-common INTERFACE library) --- -if(NOT BUILD_WITH_SPARSE) - target_link_libraries(hipsolver PRIVATE $<$:${CMAKE_DL_LIBS}>) +if(HIPSOLVER_ENABLE_ASAN) + target_compile_options(hipsolver PRIVATE -fsanitize=address -shared-libasan) + target_link_options(hipsolver PRIVATE -fsanitize=address -shared-libasan -fuse-ld=lld) endif() -# Build hipsolver from source on AMD platform -if(NOT USE_CUDA) - # Find rocBLAS - if(NOT TARGET rocblas) - if(CUSTOM_ROCBLAS) - set(ENV{rocblas_DIR} ${CUSTOM_ROCBLAS}) - find_package(rocblas REQUIRED CONFIG NO_CMAKE_PATH) - else() - find_package(rocblas REQUIRED CONFIG PATHS /opt/rocm /opt/rocm/rocblas) - endif() +# --- Code coverage flags (was in hipsolver-common INTERFACE library) --- + +if(HIPSOLVER_BUILD_COVERAGE) + target_compile_options(hipsolver PRIVATE -fprofile-instr-generate -fcoverage-mapping) + target_link_options(hipsolver PRIVATE -fprofile-instr-generate) +endif() + +# --- Armor flags --- + +add_armor_flags(hipsolver "${HIPSOLVER_ARMOR_LEVEL}") + +# --- Dynamic loading for dlopen path --- + +if(NOT HIPSOLVER_ENABLE_SPARSE) + target_link_libraries(hipsolver PRIVATE $<$:${CMAKE_DL_LIBS}>) +endif() + +# --- Dependencies --- + +set(static_depends) + +if(NOT HIPSOLVER_ENABLE_CUDA) + find_package(rocblas REQUIRED CONFIG) list(APPEND static_depends PACKAGE rocblas) - endif() - - # Find rocSOLVER - if(NOT TARGET rocsolver) - if(CUSTOM_ROCSOLVER) - set(ENV{rocsolver_DIR} ${CUSTOM_ROCSOLVER}) - find_package(rocsolver REQUIRED CONFIG NO_CMAKE_PATH) - else() - find_package(rocsolver REQUIRED CONFIG PATHS /opt/rocm /opt/rocm/rocsolver /usr/local/rocsolver) - endif() + + find_package(rocsolver REQUIRED CONFIG) list(APPEND static_depends PACKAGE rocsolver) - endif() - - target_link_libraries(hipsolver PRIVATE roc::rocblas roc::rocsolver) - target_link_libraries(hipsolver PUBLIC hip::host) - - if(CUSTOM_TARGET) - target_link_libraries(hipsolver PRIVATE hip::${CUSTOM_TARGET}) - endif() - - if(BUILD_WITH_SPARSE) - # Find rocSPARSE - if(NOT TARGET rocsparse) - if(CUSTOM_ROCSPARSE) - set(ENV{rocsparse_DIR} ${CUSTOM_ROCSPARSE}) - find_package(rocsparse REQUIRED CONFIG NO_CMAKE_PATH) - else() - find_package(rocsparse REQUIRED CONFIG PATHS /opt/rocm /opt/rocm/rocsparse) - endif() - list(APPEND static_depends PACKAGE rocsparse) - endif() - find_package(CHOLMOD QUIET) - if(NOT TARGET SuiteSparse::CHOLMOD) - # try again with the custom find modules for older versions of suitesparse - list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/suitesparse) - find_package(CHOLMOD REQUIRED) + target_link_libraries(hipsolver PRIVATE roc::rocblas roc::rocsolver) + target_link_libraries(hipsolver PUBLIC hip::host) + + if(CUSTOM_TARGET) + target_link_libraries(hipsolver PRIVATE hip::${CUSTOM_TARGET}) endif() - target_link_libraries( hipsolver PRIVATE roc::rocsparse SuiteSparse::CHOLMOD) - set_source_files_properties(${hipsolver_source} - PROPERTIES - COMPILE_DEFINITIONS HAVE_ROCSPARSE - ) - endif() + if(HIPSOLVER_ENABLE_SPARSE) + find_package(rocsparse REQUIRED CONFIG) + list(APPEND static_depends PACKAGE rocsparse) -else() - target_compile_definitions(hipsolver PRIVATE __HIP_PLATFORM_NVIDIA__) + find_package(CHOLMOD QUIET) + if(NOT TARGET SuiteSparse::CHOLMOD) + # try again with the custom find modules for older versions of suitesparse + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/suitesparse") + find_package(CHOLMOD REQUIRED) + endif() - target_link_libraries(hipsolver PRIVATE ${CUDA_cusolver_LIBRARY}) + target_link_libraries(hipsolver PRIVATE roc::rocsparse SuiteSparse::CHOLMOD) + target_compile_definitions(hipsolver PRIVATE HAVE_ROCSPARSE) + endif() +else() + target_compile_definitions(hipsolver PRIVATE __HIP_PLATFORM_NVIDIA__) + target_link_libraries(hipsolver PRIVATE ${CUDA_cusolver_LIBRARY}) - # External header includes included as system files - target_include_directories(hipsolver - SYSTEM PRIVATE - $ - $ - ) + target_include_directories(hipsolver + SYSTEM PRIVATE + $ + $ + ) endif() -# Internal header includes +# --- Include directories --- + target_include_directories(hipsolver - PUBLIC $ - $ - $ - $ - $ - $ - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${CMAKE_CURRENT_SOURCE_DIR} + PUBLIC + $ + $ + $ + $ + $ + $ + PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/include" + "${CMAKE_CURRENT_SOURCE_DIR}" ) +# --- Target properties --- + rocm_set_soversion(hipsolver ${hipsolver_SOVERSION}) set_target_properties(hipsolver PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/staging") -# Package that helps me set visibility for function names exported from shared library +# Symbol visibility include(GenerateExportHeader) set_target_properties(hipsolver PROPERTIES CXX_VISIBILITY_PRESET "hidden" VISIBILITY_INLINES_HIDDEN ON) -generate_export_header(hipsolver EXPORT_FILE_NAME ${PROJECT_BINARY_DIR}/include/hipsolver/internal/hipsolver-export.h) +generate_export_header(hipsolver + EXPORT_FILE_NAME "${PROJECT_BINARY_DIR}/include/hipsolver/internal/hipsolver-export.h" +) + +# Copy public headers to build tree for consumers +execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory + "${PROJECT_SOURCE_DIR}/library/include" + "${PROJECT_BINARY_DIR}/include/hipsolver" +) -execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/library/include ${PROJECT_BINARY_DIR}/include/hipsolver) if(BUILD_FILE_REORG_BACKWARD_COMPATIBILITY) - rocm_wrap_header_file( - internal/hipsolver-version.h internal/hipsolver-export.h - GUARDS SYMLINK WRAPPER - WRAPPER_LOCATIONS ${CMAKE_INSTALL_INCLUDEDIR} hipsolver/${CMAKE_INSTALL_INCLUDEDIR} - ORIGINAL_FILES ${PROJECT_BINARY_DIR}/include/hipsolver/internal/hipsolver-version.h - ) + rocm_wrap_header_file( + internal/hipsolver-version.h internal/hipsolver-export.h + GUARDS SYMLINK WRAPPER + WRAPPER_LOCATIONS ${CMAKE_INSTALL_INCLUDEDIR} hipsolver/${CMAKE_INSTALL_INCLUDEDIR} + ORIGINAL_FILES "${PROJECT_BINARY_DIR}/include/hipsolver/internal/hipsolver-version.h" + ) endif() +# --- Windows DLL copy for clients --- -# Following Boost conventions of prefixing 'lib' on static built libraries, across all platforms -if(NOT BUILD_SHARED_LIBS) - set_target_properties(hipsolver PROPERTIES PREFIX "lib") +if(WIN32) + if(HIPSOLVER_ENABLE_BENCHMARKS OR HIPSOLVER_BUILD_TESTING) + add_custom_command(TARGET hipsolver POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + "${PROJECT_BINARY_DIR}/staging/$" + "${PROJECT_BINARY_DIR}/clients/staging/$" + ) + # Copy PDB in Debug config + add_custom_command(TARGET hipsolver POST_BUILD + COMMAND "$<$:${CMAKE_COMMAND}>" -E copy + "${PROJECT_BINARY_DIR}/staging/$" + "${PROJECT_BINARY_DIR}/clients/staging/$" + ) + endif() endif() -############################################################ -# Installation +# --- Installation --- rocm_install_targets( - TARGETS hipsolver - INCLUDE - ${CMAKE_BINARY_DIR}/include + TARGETS hipsolver + INCLUDE "${CMAKE_BINARY_DIR}/include" ) -if(NOT USE_CUDA) - rocm_export_targets( - TARGETS roc::hipsolver - DEPENDS PACKAGE hip - STATIC_DEPENDS - ${static_depends} - NAMESPACE roc:: - ) +if(NOT HIPSOLVER_ENABLE_CUDA) + rocm_export_targets( + TARGETS roc::hipsolver + DEPENDS PACKAGE hip + STATIC_DEPENDS ${static_depends} + NAMESPACE roc:: + ) else() - rocm_export_targets( - TARGETS roc::hipsolver - DEPENDS PACKAGE HIP - NAMESPACE roc:: - ) + rocm_export_targets( + TARGETS roc::hipsolver + DEPENDS PACKAGE HIP + NAMESPACE roc:: + ) endif() -if(BUILD_FORTRAN_MODULE) - # Exclude include folder for ASAN package - if(NOT ENABLE_ASAN_PACKAGING) - # Force installation of .f90 module files - install(FILES "hipsolver_module.f90" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/hipsolver") - endif() +if(HIPSOLVER_ENABLE_FORTRAN) + if(NOT HIPSOLVER_ENABLE_ASAN) + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/hipsolver_module.f90" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/hipsolver" + ) + endif() endif() if(BUILD_FILE_REORG_BACKWARD_COMPATIBILITY) - rocm_install( - DIRECTORY - "${PROJECT_BINARY_DIR}/hipsolver" - DESTINATION ".") - - if(NOT WIN32) - - # Create SymLink for Fortran Object Module for backward compatibility rocm_install( - CODE " - set(PREFIX \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}) - set(INPUT_FILE \${PREFIX}/include/hipsolver/hipsolver_module.f90) - set(SYMLINK_LOCATIONS \${PREFIX}/hipsolver/include \${PREFIX}/include) - foreach(LOCATION IN LISTS SYMLINK_LOCATIONS) - file(MAKE_DIRECTORY \${LOCATION}) - execute_process(COMMAND ln -sfr \${INPUT_FILE} \${LOCATION}) - message(STATUS \"Created symlink in \${LOCATION} to \${INPUT_FILE}.\") - endforeach() - " + DIRECTORY "${PROJECT_BINARY_DIR}/hipsolver" + DESTINATION "." ) - endif() # NOT WIN32 - message(STATUS "Backward Compatible Sym Link Created for include directories") -endif() + if(NOT WIN32) + rocm_install( + CODE " + set(PREFIX \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}) + set(INPUT_FILE \${PREFIX}/include/hipsolver/hipsolver_module.f90) + set(SYMLINK_LOCATIONS \${PREFIX}/hipsolver/include \${PREFIX}/include) + foreach(LOCATION IN LISTS SYMLINK_LOCATIONS) + file(MAKE_DIRECTORY \${LOCATION}) + execute_process(COMMAND ln -sfr \${INPUT_FILE} \${LOCATION}) + message(STATUS \"Created symlink in \${LOCATION} to \${INPUT_FILE}.\") + endforeach() + " + ) + endif() +endif()