################################################################################ # # MIT License # # Copyright (c) 2017 Advanced Micro Devices, Inc. # # 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. # ################################################################################ cmake_minimum_required( VERSION 2.8.12 ) # 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 MSVC_IDE AND NOT CMAKE_BUILD_TYPE ) set( CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." ) endif() # Default installation path if(WIN32) set(CMAKE_INSTALL_PREFIX "/opt/rocm/x86_64-w64-mingw32" CACHE PATH "") else() set(CMAKE_INSTALL_PREFIX "/opt/rocm" CACHE PATH "") endif() project ( MIOpen C CXX ) enable_testing() find_package(ROCM REQUIRED PATHS /opt/rocm) include(ROCMInstallTargets) include(ROCMPackageConfigHelpers) include(ROCMSetupVersion) include(ROCMInstallSymlinks) include(ROCMCreatePackage) include(CheckCXXCompilerFlag) option( BUILD_DEV "Build for development only" OFF) # Strip symbols for release if(NOT WIN32 AND NOT APPLE) set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s") endif() rocm_setup_version(VERSION 2.1.0) list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ) include(TargetFlags) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.3") message(FATAL_ERROR "MIOpen requires at least gcc 5.3") endif() endif() ############################################################ # require C++14 add_compile_options(-std=c++14) ############################################################ # OPTION - MIOpen Backend # - OpenCL # - HCC check_cxx_compiler_flag("--cuda-host-only -x hip" HAS_HIP) if(CMAKE_CXX_COMPILER MATCHES ".*hcc" OR CMAKE_CXX_COMPILER MATCHES ".*hipcc" OR HAS_HIP) set(MIOPEN_DEFAULT_BACKEND "HIP") else() set(MIOPEN_DEFAULT_BACKEND "OpenCL") endif() if(WIN32 AND CMAKE_CROSSCOMPILING) set(WINE_CMD "wine") else() set(WINE_CMD) endif() list(APPEND CMAKE_PREFIX_PATH /opt/rocm /opt/rocm/hcc /opt/rocm/hip) option(ENABLE_HIP_WORKAROUNDS Off) set( MIOPEN_BACKEND ${MIOPEN_DEFAULT_BACKEND} CACHE STRING "Which of MIOpens's backends to use?" ) set_property( CACHE MIOPEN_BACKEND PROPERTY STRINGS OpenCL HIP HIPOC ) # HIP is always required find_package(hip REQUIRED PATHS /opt/rocm) target_flags(HIP_COMPILER_FLAGS hip::device) message(STATUS "Hip compiler flags: ${HIP_COMPILER_FLAGS}") add_definitions("-DHIP_COMPILER_FLAGS=${HIP_COMPILER_FLAGS}") # OpenCL 1.2 if( MIOPEN_BACKEND STREQUAL "OpenCL") set(MIOPEN_BACKEND_OPENCL 1) find_package( OpenCL REQUIRED ) find_program(MIOPEN_HIP_COMPILER hcc PATH_SUFFIXES bin PATHS /opt/rocm ) set(MIOPEN_USE_MIOPENGEMM ON CACHE BOOL "") if(MIOPEN_HIP_COMPILER) message("hip compiler: ${MIOPEN_HIP_COMPILER}") else() message(FATAL_ERROR "hip compiler not found") endif() # scgemm not support opencl backend yet. set(MIOPEN_USE_SCGEMM OFF) endif() # HIP if( MIOPEN_BACKEND STREQUAL "HIP" OR MIOPEN_BACKEND STREQUAL "HIPOC") set(MIOPEN_BACKEND_HIP 1) set(MIOPEN_USE_MIOPENGEMM OFF CACHE BOOL "") find_program(HIP_OC_COMPILER clang-ocl PATH_SUFFIXES bin PATHS /opt/rocm ) if(HIP_OC_COMPILER) message(STATUS "hip compiler: ${HIP_OC_COMPILER}") set(HIP_OC_COMPILER "${HIP_OC_COMPILER}") else() message(FATAL_ERROR "clang-ocl not found") endif() if(CMAKE_CXX_COMPILER MATCHES ".*hcc") link_libraries(stdc++) # A hack to make this work without the device enumerator link_libraries(-amdgpu-target=gfx803 -amdgpu-target=gfx900 -Wno-unused-command-line-argument) CHECK_CXX_COMPILER_FLAG("-amdgpu-target=gfx906 -Werror" GFX_906_FLAG_VALID) if(GFX_906_FLAG_VALID) link_libraries(-amdgpu-target=gfx906) endif() CHECK_CXX_COMPILER_FLAG(-amdgpu-target=gfx908 -Werror, GFX_908_FLAG_VALID) if(GFX_908_FLAG_VALID) link_libraries(-amdgpu-target=gfx908) endif() # end hack else() # Hcc's clang always defines __HCC__ even when not using hcc driver add_definitions(-U__HCC__) endif() # end hack set(MIOPEN_HIP_COMPILER ${CMAKE_CXX_COMPILER} CACHE PATH "") # rocblas set(MIOPEN_USE_ROCBLAS ON CACHE BOOL "") if(MIOPEN_USE_ROCBLAS) find_package(rocblas REQUIRED PATHS /opt/rocm) message(STATUS "Build with rocblas") else() message(STATUS "Build without rocblas") endif() # scgemm set(MIOPEN_USE_SCGEMM ON CACHE BOOL "") if(MIOPEN_USE_SCGEMM) message(STATUS "Build with scgemm") else() message(STATUS "Build without scgemm") endif() endif() message( STATUS "${MIOPEN_BACKEND} backend selected." ) # look for and register extractkernel find_program(EXTRACTKERNEL_BIN extractkernel PATH_SUFFIXES bin PATHS /opt/rocm ) if(EXTRACTKERNEL_BIN) message(STATUS "extractkernel found: ${EXTRACTKERNEL_BIN}") set(EXTRACTKERNEL_BIN "${EXTRACTKERNEL_BIN}") else() message(FATAL_ERROR "extractkernel not found") endif() # Online assembler find_program(MIOPEN_AMDGCN_ASSEMBLER NAMES clang PATHS ${MIOPEN_AMDGCN_ASSEMBLER_PATH} /opt/rocm PATH_SUFFIXES /opencl/bin/x86_64 NO_DEFAULT_PATH ) message(STATUS "AMDGCN assembler: ${MIOPEN_AMDGCN_ASSEMBLER}") # miopengemm if(MIOPEN_USE_MIOPENGEMM) find_package(miopengemm PATHS /opt/rocm) if(miopengemm_FOUND) message(STATUS "Build with miopengemm") set(MIOPEN_USE_MIOPENGEMM 1) else() message(STATUS "Build without miopengemm") set(MIOPEN_USE_MIOPENGEMM 0) endif() else() message(STATUS "Build without miopengemm") set(MIOPEN_USE_MIOPENGEMM 0) endif() option(Boost_USE_STATIC_LIBS "Use boost static libraries" ON) set(BOOST_COMPONENTS filesystem system) add_definitions(-DBOOST_ALL_NO_LIB=1) find_package(Boost REQUIRED COMPONENTS ${BOOST_COMPONENTS}) find_path(HALF_INCLUDE_DIR half.hpp) option( BUILD_SHARED_LIBS "Build as a shared library" ON ) option( MIOPEN_DEBUG_FIND_DB_CACHING "Use system find-db caching" ON) set( MIOPEN_INSTALL_DIR miopen) set( DATA_INSTALL_DIR ${MIOPEN_INSTALL_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/miopen ) set(MIOPEN_GPU_SYNC Off CACHE BOOL "") if(BUILD_DEV) set(MIOPEN_BUILD_DEV 1) set(MIOPEN_SYSTEM_DB_PATH "${CMAKE_SOURCE_DIR}/src/kernels" CACHE PATH "Default path of system db files") set(MIOPEN_USER_DB_PATH "${CMAKE_SOURCE_DIR}/src/kernels" CACHE PATH "Default path of user db files") set(MIOPEN_CACHE_DIR "" CACHE STRING "") else() set(MIOPEN_BUILD_DEV 0) set(MIOPEN_SYSTEM_DB_PATH "${CMAKE_INSTALL_PREFIX}/${DATA_INSTALL_DIR}/db" CACHE PATH "Default path of system db files") set(MIOPEN_USER_DB_PATH "~/.config/miopen/" CACHE STRING "Default path of user db files") set(MIOPEN_CACHE_DIR "~/.cache/miopen/" CACHE STRING "") endif() set(MIOPEN_USER_DB_SUFFIX "${MIOPEN_BACKEND}.${MIOpen_VERSION_MAJOR}_${MIOpen_VERSION_MINOR}_${MIOpen_VERSION_PATCH}" CACHE PATH "Filename suffix for the user find-db files") set(MIOPEN_SYSTEM_FIND_DB_SUFFIX "${MIOPEN_BACKEND}" CACHE PATH "Filename suffix for the system find-db files") set(MIOPEN_PACKAGE_REQS "rocm-utils, hip_hcc") if(MIOPEN_USE_MIOPENGEMM) set(MIOPEN_PACKAGE_REQS "${MIOPEN_PACKAGE_REQS}, miopengemm") endif() set(CPACK_DEBIAN_PACKAGE_DEPENDS "${MIOPEN_PACKAGE_REQS}, rocm-opencl-dev") set(CPACK_RPM_PACKAGE_REQUIRES "${MIOPEN_PACKAGE_REQS}, rocm-opencl-devel") rocm_create_package( NAME MIOpen-${MIOPEN_BACKEND} DESCRIPTION "AMD's DNN Library" MAINTAINER "Paul Fultz II " LDCONFIG # DEPENDS rocm-opencl rocm-utils hip_hcc tinygemm ) include(EnableCompilerWarnings) set(MIOPEN_TIDY_ERRORS ERRORS * -readability-inconsistent-declaration-parameter-name) if(CMAKE_CXX_COMPILER MATCHES ".*hcc") set(MIOPEN_TIDY_CHECKS -modernize-use-override -readability-non-const-parameter) # Enable tidy on hip # elseif(MIOPEN_BACKEND STREQUAL "HIP") # set(MIOPEN_TIDY_ERRORS ALL) endif() include(ClangTidy) enable_clang_tidy( CHECKS * -android-cloexec-fopen # Yea we shouldn't be using rand() -cert-msc30-c -bugprone-exception-escape -cert-env33-c -cert-msc32-c -cert-msc50-cpp -cert-msc51-cpp -clang-analyzer-alpha.core.CastToStruct -clang-analyzer-optin.performance.Padding -clang-diagnostic-deprecated-declarations -clang-diagnostic-extern-c-compat -clang-diagnostic-unused-command-line-argument -cppcoreguidelines-avoid-c-arrays -cppcoreguidelines-avoid-magic-numbers -cppcoreguidelines-explicit-virtual-functions -cppcoreguidelines-macro-usage -cppcoreguidelines-non-private-member-variables-in-classes -cppcoreguidelines-pro-bounds-array-to-pointer-decay -cppcoreguidelines-pro-bounds-constant-array-index -cppcoreguidelines-pro-bounds-pointer-arithmetic -cppcoreguidelines-pro-type-member-init -cppcoreguidelines-pro-type-reinterpret-cast -cppcoreguidelines-pro-type-union-access -cppcoreguidelines-pro-type-vararg -cppcoreguidelines-special-member-functions -fuchsia-* -google-explicit-constructor -google-readability-braces-around-statements -google-readability-todo -google-runtime-int -google-runtime-references -hicpp-braces-around-statements -hicpp-explicit-conversions -hicpp-no-array-decay # We really shouldn't use bitwise operators with signed integers, but # opencl leaves us no choice -hicpp-avoid-c-arrays -hicpp-signed-bitwise -hicpp-special-member-functions -hicpp-uppercase-literal-suffix -hicpp-use-auto -hicpp-use-equals-default -hicpp-use-override -llvm-header-guard -llvm-include-order -misc-misplaced-const -misc-non-private-member-variables-in-classes -modernize-avoid-c-arrays -modernize-pass-by-value -modernize-use-auto -modernize-use-default-member-init -modernize-use-equals-default -modernize-use-trailing-return-type -modernize-use-transparent-functors -performance-unnecessary-value-param -readability-braces-around-statements -readability-else-after-return -readability-isolate-declaration -readability-magic-numbers -readability-named-parameter -readability-uppercase-literal-suffix ${MIOPEN_TIDY_CHECKS} ${MIOPEN_TIDY_ERRORS} HEADER_FILTER ".*hpp" EXTRA_ARGS -DMIOPEN_USE_CLANG_TIDY ) include(CppCheck) enable_cppcheck( CHECKS all SUPPRESS ConfigurationNotChecked unmatchedSuppression unusedFunction # constStatement noExplicitConstructor passedByValue # preprocessorErrorDirective unusedStructMember # Ignore initializer lists in the tests useInitializationList:*test/*.cpp *:*.cl *:*src/kernels/*.h knownConditionTrueFalse:*src/kernels/composable_kernel/*/* wrongPrintfScanfArgNum:*src/kernels/composable_kernel/*/* unusedScopedObject:*src/kernels/composable_kernel/*/* FORCE SOURCES addkernels/ # driver/ include/ src/ test/ INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src/include DEFINE MIOPEN_USE_MIOPENGEMM=1 ) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) add_subdirectory(addkernels) add_subdirectory(doc) add_subdirectory(src) add_subdirectory(driver) add_subdirectory(test)