diff --git a/modules/SetCMakeCudaArchitectures.cmake b/modules/SetCMakeCudaArchitectures.cmake new file mode 100644 index 0000000000000000000000000000000000000000..43f555c7a41ba56d05c9b2f7250c715154b81193 --- /dev/null +++ b/modules/SetCMakeCudaArchitectures.cmake @@ -0,0 +1,220 @@ +### +# +# @copyright (c) 2012-2023 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, +# Univ. Bordeaux. All rights reserved. +# @copyright (c) 2009-2023 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# +### +# +# @file SetCMakeCudaArchitectures.cmake +# +# @project MORSE +# MORSE is a software package provided by: +# Inria Bordeaux - Sud-Ouest, +# Univ. of Tennessee, +# King Abdullah Univesity of Science and Technology +# Univ. of California Berkeley, +# Univ. of Colorado Denver. +# +# @version 1.0.0 +# @author Mathieu Faverge +# @date 04-07-2023 +# +### +if (NOT CUDAToolkit_FOUND) + message( STATUS "SetCMakeCudaArchitectures: This file should not be included if CUDA Toolkit has not bee found" ) + return() +endif() + +set(CMAKE_CUDA_STANDARD 11) + +# Define the architectures (inspired from the MAGMA project) +set( ${CMAKE_PROJECT_NAME}_CUDA_TARGETS "Kepler Maxwell Pascal Volta Ampere" CACHE STRING "CUDA architectures to compile for; one or more of Fermi, Kepler, Maxwell, Pascal, Volta, Turing, Ampere, Hopper, or valid sm_[0-9][0-9]" ) + +# NVCC options for the different cards +# sm_xx is binary, compute_xx is PTX for forward compatibility +# MIN_ARCH is the lowest requested version + +if(WIN32) + # Disable separable compilation on Windows because object linking list + # becomes too long when building multiple archs and MSVC throws errors + set(CUDA_SEPARABLE_COMPILATION OFF) +else() + set(CUDA_SEPARABLE_COMPILATION ON) +endif() + +set(__cuda_architectures) + +# Architectures by names +# ---------------------- +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES Fermi) + set( ${CMAKE_PROJECT_NAME}_CUDA_TARGETS "${${CMAKE_PROJECT_NAME}_CUDA_TARGETS} sm_20" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES Kepler) + set( ${CMAKE_PROJECT_NAME}_CUDA_TARGETS "${${CMAKE_PROJECT_NAME}_CUDA_TARGETS} sm_30 sm_35 sm_37" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES Maxwell) + set( ${CMAKE_PROJECT_NAME}_CUDA_TARGETS "${${CMAKE_PROJECT_NAME}_CUDA_TARGETS} sm_50" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES Pascal) + set( ${CMAKE_PROJECT_NAME}_CUDA_TARGETS "${${CMAKE_PROJECT_NAME}_CUDA_TARGETS} sm_60" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES Volta) + set( ${CMAKE_PROJECT_NAME}_CUDA_TARGETS "${${CMAKE_PROJECT_NAME}_CUDA_TARGETS} sm_70" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES Turing) + set( ${CMAKE_PROJECT_NAME}_CUDA_TARGETS "${${CMAKE_PROJECT_NAME}_CUDA_TARGETS} sm_75" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES Ampere) + set( ${CMAKE_PROJECT_NAME}_CUDA_TARGETS "${${CMAKE_PROJECT_NAME}_CUDA_TARGETS} sm_80" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES Hopper) + set( ${CMAKE_PROJECT_NAME}_CUDA_TARGETS "${${CMAKE_PROJECT_NAME}_CUDA_TARGETS} sm_90" ) +endif() + +# Architectures versions +# ---------------------- +if ( (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_20) AND (CUDA_VERSION VERSION_LESS "8.0") ) + if (NOT MIN_ARCH) + set( MIN_ARCH 200 ) + endif() + list(APPEND __cuda_architectures 20) + message( STATUS " compile for CUDA arch 2.0 (Fermi)" ) +endif() + +if ( (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_30) AND (CUDA_VERSION VERSION_LESS "10.0") ) + if (NOT MIN_ARCH) + set( MIN_ARCH 300 ) + endif() + list(APPEND __cuda_architectures 30) + message( STATUS " compile for CUDA arch 3.0 (Kepler)" ) +endif() + +if ( (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_35) AND (CUDA_VERSION VERSION_LESS "11.0") ) + if (NOT MIN_ARCH) + set( MIN_ARCH 300 ) + endif() + list(APPEND __cuda_architectures 35) + message( STATUS " compile for CUDA arch 3.5 (Kepler)" ) +endif() + +if ( (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_50) AND (CUDA_VERSION VERSION_LESS "11.0") ) + if (NOT MIN_ARCH) + set( MIN_ARCH 500 ) + endif() + list(APPEND __cuda_architectures 50) + message( STATUS " compile for CUDA arch 5.0 (Maxwell)" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_52) + if (NOT MIN_ARCH) + set( MIN_ARCH 520 ) + endif() + list(APPEND __cuda_architectures 52) + message( STATUS " compile for CUDA arch 5.2 (Maxwell)" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_53) + if (NOT MIN_ARCH) + set( MIN_ARCH 530 ) + endif() + list(APPEND __cuda_architectures 53) + message( STATUS " compile for CUDA arch 5.3 (Maxwell)" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_60) + if (NOT MIN_ARCH) + set( MIN_ARCH 600 ) + endif() + list(APPEND __cuda_architectures 60) + message( STATUS " compile for CUDA arch 6.0 (Pascal)" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_61) + if (NOT MIN_ARCH) + set( MIN_ARCH 610 ) + endif() + list(APPEND __cuda_architectures 61) + message( STATUS " compile for CUDA arch 6.1 (Pascal)" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_62) + if (NOT MIN_ARCH) + set( MIN_ARCH 620 ) + endif() + list(APPEND __cuda_architectures 62) + message( STATUS " compile for CUDA arch 6.2 (Pascal)" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_70) + if (NOT MIN_ARCH) + set( MIN_ARCH 700 ) + endif() + list(APPEND __cuda_architectures 70) + message( STATUS " compile for CUDA arch 7.0 (Volta)" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_71) + if (NOT MIN_ARCH) + set( MIN_ARCH 710 ) + endif() + list(APPEND __cuda_architectures 71) + message( STATUS " compile for CUDA arch 7.1 (Volta)" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_75) + if (NOT MIN_ARCH) + set( MIN_ARCH 750 ) + endif() + list(APPEND __cuda_architectures 75) + message( STATUS " compile for CUDA arch 7.5 (Turing)" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_80) + if (NOT MIN_ARCH) + set( MIN_ARCH 800 ) + endif() + list(APPEND __cuda_architectures 80) + message( STATUS " compile for CUDA arch 8.0 (Ampere)" ) +endif() + +if (${CMAKE_PROJECT_NAME}_CUDA_TARGETS MATCHES sm_90) + if (NOT MIN_ARCH) + set( MIN_ARCH 900 ) + endif() + list(APPEND __cuda_architectures 90) + message( STATUS " compile for CUDA arch 9.0 (Hopper)" ) +endif() + +if (NOT MIN_ARCH) + message( FATAL_ERROR "${CMAKE_PROJECT_NAME}_CUDA_TARGETS must contain one or more of Fermi, Kepler, Maxwell, Pascal, Volta, Turing, Ampere, or valid sm_[0-9][0-9]" ) +endif() + +# Remove extra +# ------------ +if(CUDA_VERSION VERSION_GREATER_EQUAL "8.0") + list(REMOVE_ITEM __cuda_architectures "20" "21") +endif() + +if(CUDA_VERSION VERSION_GREATER_EQUAL "9.0") + list(REMOVE_ITEM __cuda_architectures "20" "21") +endif() + +if(CUDA_VERSION VERSION_GREATER_EQUAL "10.0") + list(REMOVE_ITEM __cuda_architectures "30" "32") +endif() + +if(CUDA_VERSION VERSION_GREATER_EQUAL "11.0") + list(REMOVE_ITEM __cuda_architectures "35" "50") +endif() + +set(CMAKE_CUDA_ARCHITECTURES "${__cuda_architectures}")