CUDA: Add Device LTO support for nvcc

Fixes #22200
This commit is contained in:
Robert Maynard
2022-04-22 12:51:26 -04:00
parent 1527d48cd0
commit 96bc59b1ca
28 changed files with 412 additions and 58 deletions
+24 -13
View File
@@ -76,6 +76,23 @@ endmacro()
# Run IPO/LTO test
macro(_ipo_run_language_check language)
set(_C_ext "c")
set(_CXX_ext "cpp")
set(_Fortran_ext "f")
string(COMPARE EQUAL "${language}" "CUDA" is_cuda)
set(ext ${_${language}_ext})
if(NOT "${ext}" STREQUAL "")
set(copy_sources foo.${ext} main.${ext})
elseif(is_cuda)
if(_CMAKE_CUDA_IPO_SUPPORTED_BY_CMAKE)
set("${X_RESULT}" YES PARENT_SCOPE)
endif()
return()
else()
message(FATAL_ERROR "Language not supported")
endif()
set(testdir "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/_CMakeLTOTest-${language}")
file(REMOVE_RECURSE "${testdir}")
@@ -91,17 +108,6 @@ macro(_ipo_run_language_check language)
set(try_compile_src "${CMAKE_ROOT}/Modules/CheckIPOSupported")
set(_C_ext "c")
set(_CXX_ext "cpp")
set(_Fortran_ext "f")
set(ext ${_${language}_ext})
if(NOT "${ext}" STREQUAL "")
set(copy_sources foo.${ext} main.${ext})
else()
message(FATAL_ERROR "Language not supported")
endif()
# Use:
# * TRY_COMPILE_PROJECT_NAME
# * CMAKE_VERSION
@@ -211,6 +217,11 @@ function(check_ipo_supported)
list(APPEND languages "C")
endif()
list(FIND enabled_languages "CUDA" result)
if(NOT result EQUAL -1)
list(APPEND languages "CUDA")
endif()
list(FIND enabled_languages "Fortran" result)
if(NOT result EQUAL -1)
list(APPEND languages "Fortran")
@@ -219,7 +230,7 @@ function(check_ipo_supported)
string(COMPARE EQUAL "${languages}" "" no_languages)
if(no_languages)
_ipo_not_supported(
"no C/CXX/Fortran languages found in ENABLED_LANGUAGES global property"
"no C/CXX/CUDA/Fortran languages found in ENABLED_LANGUAGES global property"
)
return()
endif()
@@ -227,7 +238,7 @@ function(check_ipo_supported)
set(languages "${X_LANGUAGES}")
set(unsupported_languages "${languages}")
list(REMOVE_ITEM unsupported_languages "C" "CXX" "Fortran")
list(REMOVE_ITEM unsupported_languages "C" "CXX" "CUDA" "Fortran")
string(COMPARE NOTEQUAL "${unsupported_languages}" "" has_unsupported)
if(has_unsupported)
_ipo_not_supported(
+4
View File
@@ -35,6 +35,10 @@ set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_STATIC "cudadevrt;cudart_static")
set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_SHARED "cudadevrt;cudart")
set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_NONE "")
# Clang doesn't support CUDA device LTO
set(_CMAKE_CUDA_IPO_SUPPORTED_BY_CMAKE NO)
set(_CMAKE_CUDA_IPO_MAY_BE_SUPPORTED_BY_COMPILER NO)
if(UNIX)
list(APPEND CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_STATIC "rt" "pthread" "dl")
endif()
+8
View File
@@ -48,6 +48,13 @@ if((NOT DEFINED CMAKE_DEPENDS_USE_COMPILER OR CMAKE_DEPENDS_USE_COMPILER)
set(CMAKE_CUDA_DEPENDS_USE_COMPILER TRUE)
endif()
if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 11.2)
set(_CMAKE_CUDA_IPO_SUPPORTED_BY_CMAKE YES)
set(_CMAKE_CUDA_IPO_MAY_BE_SUPPORTED_BY_COMPILER YES)
set(CMAKE_CUDA_DEVICE_LINK_OPTIONS_IPO " -dlto")
endif()
if(NOT "x${CMAKE_CUDA_SIMULATE_ID}" STREQUAL "xMSVC")
set(CMAKE_CUDA_COMPILE_OPTIONS_PIE -Xcompiler=-fPIE)
set(CMAKE_CUDA_COMPILE_OPTIONS_PIC -Xcompiler=-fPIC)
@@ -61,6 +68,7 @@ if(NOT "x${CMAKE_CUDA_SIMULATE_ID}" STREQUAL "xMSVC")
string(APPEND CMAKE_CUDA_FLAGS_MINSIZEREL_INIT " -O1 -DNDEBUG")
string(APPEND CMAKE_CUDA_FLAGS_RELWITHDEBINFO_INIT " -O2 -g -DNDEBUG")
endif()
set(CMAKE_SHARED_LIBRARY_CREATE_CUDA_FLAGS -shared)
set(CMAKE_INCLUDE_SYSTEM_FLAG_CUDA -isystem=)