Skip to content

Commit

Permalink
SPQR: Use same objects for linking to shared and static libraries.
Browse files Browse the repository at this point in the history
Avoid building all objects twice (for the shared and the static library),
effectively reducing the build time approximately by a factor of two.
  • Loading branch information
mmuetzel committed Nov 13, 2024
1 parent 53bba39 commit 725ea9f
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 41 deletions.
27 changes: 18 additions & 9 deletions SPQR/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -96,13 +96,20 @@ configure_file ( "Config/spqr_version.tex.in"
NEWLINE_STYLE LF )

#-------------------------------------------------------------------------------
# dynamic spqr library properties
# object library
#-------------------------------------------------------------------------------

file ( GLOB SPQR_SOURCES "Source/spqr_*.cpp" "Source/SuiteSparseQR*.cpp" )

add_library ( spqr_obj OBJECT ${SPQR_SOURCES} )
target_include_directories ( spqr_obj PRIVATE Source Include )

#-------------------------------------------------------------------------------
# dynamic spqr library properties
#-------------------------------------------------------------------------------

if ( BUILD_SHARED_LIBS )
add_library ( SPQR SHARED ${SPQR_SOURCES} )
add_library ( SPQR SHARED $<TARGET_OBJECTS:spqr_obj> )

set_target_properties ( SPQR PROPERTIES
VERSION ${SPQR_VERSION_MAJOR}.${SPQR_VERSION_MINOR}.${SPQR_VERSION_SUB}
Expand All @@ -119,7 +126,6 @@ if ( BUILD_SHARED_LIBS )
endif ( )

target_include_directories ( SPQR
PRIVATE Source Include
INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Include>
$<INSTALL_INTERFACE:${SUITESPARSE_INCLUDEDIR}> )
endif ( )
Expand All @@ -129,7 +135,7 @@ endif ( )
#-------------------------------------------------------------------------------

if ( BUILD_STATIC_LIBS )
add_library ( SPQR_static STATIC ${SPQR_SOURCES} )
add_library ( SPQR_static STATIC $<TARGET_OBJECTS:spqr_obj> )

set_target_properties ( SPQR_static PROPERTIES
CXX_STANDARD 11
Expand All @@ -148,7 +154,6 @@ if ( BUILD_STATIC_LIBS )
endif ( )

target_include_directories ( SPQR_static
PRIVATE Source Include
INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Include>
$<INSTALL_INTERFACE:${SUITESPARSE_INCLUDEDIR}> )
endif ( )
Expand All @@ -158,6 +163,8 @@ endif ( )
#-------------------------------------------------------------------------------

# SuiteSparseConfig:
target_include_directories ( spqr_obj PRIVATE
"$<TARGET_PROPERTY:SuiteSparse::SuiteSparseConfig,INTERFACE_INCLUDE_DIRECTORIES>" )
if ( BUILD_SHARED_LIBS )
target_link_libraries ( SPQR PRIVATE SuiteSparse::SuiteSparseConfig )
endif ( )
Expand All @@ -171,6 +178,8 @@ endif ( )

# CHOLMOD:
# link with CHOLMOD and its dependencies
target_include_directories ( spqr_obj PRIVATE
"$<TARGET_PROPERTY:SuiteSparse::CHOLMOD,INTERFACE_INCLUDE_DIRECTORIES>" )
if ( BUILD_SHARED_LIBS )
target_link_libraries ( SPQR PRIVATE SuiteSparse::CHOLMOD )
endif ( )
Expand All @@ -183,6 +192,8 @@ if ( BUILD_STATIC_LIBS )
endif ( )

if ( SPQR_HAS_CUDA )
target_link_libraries ( spqr_obj PRIVATE GPUQREngine GPURuntime )
target_compile_definitions ( spqr_obj PRIVATE "SPQR_HAS_CUDA" )
if ( BUILD_SHARED_LIBS )
target_link_libraries ( SPQR PRIVATE GPUQREngine GPURuntime )
target_compile_definitions ( SPQR PUBLIC "SPQR_HAS_CUDA" )
Expand Down Expand Up @@ -215,28 +226,26 @@ endif ( )
message ( STATUS "LAPACK libraries: ${LAPACK_LIBRARIES} ")
message ( STATUS "LAPACK include: ${LAPACK_INCLUDE_DIRS} ")
message ( STATUS "LAPACK linker flags: ${LAPACK_LINKER_FLAGS} ")
target_include_directories ( spqr_obj PRIVATE ${LAPACK_INCLUDE_DIR} )
if ( BUILD_SHARED_LIBS )
target_link_libraries ( SPQR PRIVATE ${LAPACK_LIBRARIES} )
target_include_directories ( SPQR PRIVATE ${LAPACK_INCLUDE_DIR} )
endif ( )
if ( BUILD_STATIC_LIBS )
list ( APPEND SPQR_STATIC_LIBS ${LAPACK_LIBRARIES} )
target_link_libraries ( SPQR_static PUBLIC ${LAPACK_LIBRARIES} )
target_include_directories ( SPQR_static PRIVATE ${LAPACK_INCLUDE_DIR} )
endif ( )

# BLAS:
message ( STATUS "BLAS libraries: ${BLAS_LIBRARIES} ")
message ( STATUS "BLAS include: ${BLAS_INCLUDE_DIRS} ")
message ( STATUS "BLAS linker flags: ${BLAS_LINKER_FLAGS} ")
target_include_directories ( spqr_obj PRIVATE ${BLAS_INCLUDE_DIRS} )
if ( BUILD_SHARED_LIBS )
target_link_libraries ( SPQR PRIVATE ${BLAS_LIBRARIES} )
target_include_directories ( SPQR PRIVATE ${BLAS_INCLUDE_DIRS} )
endif ( )
if ( BUILD_STATIC_LIBS )
list ( APPEND SPQR_STATIC_LIBS ${BLAS_LIBRARIES} )
target_link_libraries ( SPQR_static PUBLIC ${BLAS_LIBRARIES} )
target_include_directories ( SPQR_static PRIVATE ${BLAS_INCLUDE_DIRS} )
endif ( )

#-------------------------------------------------------------------------------
Expand Down
28 changes: 17 additions & 11 deletions SPQR/GPUQREngine/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ configure_file ( "Config/GPUQREngine.hpp.in"
NEWLINE_STYLE LF )

#-------------------------------------------------------------------------------
# object library
#-------------------------------------------------------------------------------

file ( GLOB GPUQRENGINE_SOURCES "Source/*.cpp"
"Source/*.cu"
Expand All @@ -76,12 +78,25 @@ file ( GLOB GPUQRENGINE_SOURCES "Source/*.cpp"
set ( GPUQRENGINE_INCLUDES Include Include/Kernel
Include/Kernel/Apply Include/Kernel/Assemble Include/Kernel/Factorize )

add_library ( gpuqrengine_obj OBJECT ${GPUQRENGINE_SOURCES} )
target_include_directories ( gpuqrengine_obj PRIVATE ${GPUQRENGINE_INCLUDES} )

target_compile_definitions ( gpuqrengine_obj PRIVATE "SPQR_HAS_CUDA" )

target_include_directories ( gpuqrengine_obj PRIVATE
"$<TARGET_PROPERTY:gpuruntime_obj,INTERFACE_INCLUDE_DIRECTORIES>"
"$<TARGET_PROPERTY:SuiteSparse::SuiteSparseConfig,INTERFACE_INCLUDE_DIRECTORIES>" )

set_target_properties ( gpuqrengine_obj PROPERTIES
CXX_STANDARD 17
CXX_STANDARD_REQUIRED ON )

#-------------------------------------------------------------------------------
# dynamic gpuqrengine library properties
#-------------------------------------------------------------------------------

if ( BUILD_SHARED_LIBS )
add_library ( GPUQREngine SHARED ${GPUQRENGINE_SOURCES} )
add_library ( GPUQREngine SHARED $<TARGET_OBJECTS:gpuqrengine_obj> )

set_target_properties ( GPUQREngine PROPERTIES
VERSION ${SPQR_VERSION_MAJOR}.${SPQR_VERSION_MINOR}.${SPQR_VERSION_SUB}
Expand All @@ -92,9 +107,6 @@ if ( BUILD_SHARED_LIBS )
PUBLIC_HEADER "Include/GPUQREngine.hpp"
WINDOWS_EXPORT_ALL_SYMBOLS ON )

target_include_directories ( GPUQREngine PRIVATE
${GPUQRENGINE_INCLUDES} )

target_link_libraries ( GPUQREngine PRIVATE
GPURuntime SuiteSparse::SuiteSparseConfig )

Expand All @@ -105,7 +117,6 @@ if ( BUILD_SHARED_LIBS )
CUDA_RUNTIME_LIBRARY Static )
target_link_libraries ( GPUQREngine PRIVATE
CUDA::nvrtc CUDA::cudart_static CUDA::cublas )
target_compile_definitions ( GPUQREngine PRIVATE "SPQR_HAS_CUDA" )

target_include_directories ( GPUQREngine
INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Include>
Expand All @@ -117,7 +128,7 @@ endif ( )
#-------------------------------------------------------------------------------

if ( BUILD_STATIC_LIBS )
add_library ( GPUQREngine_static STATIC ${GPUQRENGINE_SOURCES} )
add_library ( GPUQREngine_static STATIC $<TARGET_OBJECTS:gpuqrengine_obj> )

set_target_properties ( GPUQREngine_static PROPERTIES
CXX_STANDARD 17
Expand All @@ -130,10 +141,6 @@ if ( BUILD_STATIC_LIBS )
OUTPUT_NAME gpuqrengine_static )
endif ( )

target_include_directories ( GPUQREngine_static PRIVATE
${CUDAToolkit_INCLUDE_DIRS}
${GPUQRENGINE_INCLUDES} )

target_link_libraries ( GPUQREngine_static PRIVATE GPURuntime_static )

if ( TARGET SuiteSparse::SuiteSparseConfig_static )
Expand All @@ -148,7 +155,6 @@ if ( BUILD_STATIC_LIBS )
CUDA_RESOLVE_DEVICE_SYMBOLS ON
CUDA_RUNTIME_LIBRARY Static )
target_link_libraries ( GPUQREngine_static PRIVATE CUDA::nvrtc CUDA::cudart_static )
target_compile_definitions ( GPUQREngine_static PRIVATE "SPQR_HAS_CUDA" )
# FIXME: Ok to hardcode CUDA library names like this?
set ( GPUQRENGINE_STATIC_LIBS "-L${CUDAToolkit_LIBRARY_DIR} -lcuda -lcudart_static" )
if ( TARGET CUDA::cublas_static )
Expand Down
26 changes: 13 additions & 13 deletions SPQR/GPURuntime/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,29 @@ configure_file ( "Config/SuiteSparse_GPURuntime.hpp.in"
NEWLINE_STYLE LF )

#-------------------------------------------------------------------------------
# object library
#-------------------------------------------------------------------------------

file ( GLOB SUITESPARSE_GPURUNTIME_SOURCES "Source/*.cpp" )

set ( SUITESPARSE_GPURUNTIME_INCLUDES Include )

include_directories ( ${SUITESPARSE_GPURUNTIME_INCLUDES} ${CUDAToolkit_INCLUDE_DIRS} )
add_library ( gpuruntime_obj OBJECT ${SUITESPARSE_GPURUNTIME_SOURCES} )
target_include_directories ( gpuruntime_obj PUBLIC
${SUITESPARSE_GPURUNTIME_INCLUDES}
${CUDAToolkit_INCLUDE_DIRS} )

target_compile_definitions ( gpuruntime_obj PRIVATE "SPQR_HAS_CUDA" )

target_include_directories ( gpuruntime_obj PRIVATE
"$<TARGET_PROPERTY:SuiteSparse::SuiteSparseConfig,INTERFACE_INCLUDE_DIRECTORIES>" )

#-------------------------------------------------------------------------------
# dynamic suitesparse_gpuruntime library properties
#-------------------------------------------------------------------------------

if ( BUILD_SHARED_LIBS )
add_library ( GPURuntime SHARED ${SUITESPARSE_GPURUNTIME_SOURCES} )
add_library ( GPURuntime SHARED $<TARGET_OBJECTS:gpuruntime_obj> )

set_target_properties ( GPURuntime PROPERTIES
VERSION ${SPQR_VERSION_MAJOR}.${SPQR_VERSION_MINOR}.${SPQR_VERSION_SUB}
Expand All @@ -66,10 +76,6 @@ if ( BUILD_SHARED_LIBS )
PUBLIC_HEADER "Include/SuiteSparse_GPURuntime.hpp"
WINDOWS_EXPORT_ALL_SYMBOLS ON )

target_include_directories ( GPURuntime PRIVATE
${CUDAToolkit_INCLUDE_DIRS}
${SUITESPARSE_GPURUNTIME_INCLUDES} )

target_link_libraries ( GPURuntime PRIVATE SuiteSparse::SuiteSparseConfig )

set_target_properties ( GPURuntime PROPERTIES
Expand All @@ -78,7 +84,6 @@ if ( BUILD_SHARED_LIBS )
CUDA_RUNTIME_LIBRARY Static )
target_link_libraries ( GPURuntime PRIVATE
CUDA::nvrtc CUDA::cudart_static CUDA::cublas )
target_compile_definitions ( GPURuntime PRIVATE "SPQR_HAS_CUDA" )

target_include_directories ( GPURuntime
INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Include>
Expand All @@ -90,7 +95,7 @@ endif ( )
#-------------------------------------------------------------------------------

if ( BUILD_STATIC_LIBS )
add_library ( GPURuntime_static STATIC ${SUITESPARSE_GPURUNTIME_SOURCES} )
add_library ( GPURuntime_static STATIC $<TARGET_OBJECTS:gpuruntime_obj> )

set_target_properties ( GPURuntime_static PROPERTIES
CXX_STANDARD 17
Expand All @@ -103,10 +108,6 @@ if ( BUILD_STATIC_LIBS )
OUTPUT_NAME suitesparse_gpuruntime_static )
endif ( )

target_include_directories ( GPURuntime_static PRIVATE
${CUDAToolkit_INCLUDE_DIRS}
${SUITESPARSE_GPURUNTIME_INCLUDES} )

if ( TARGET SuiteSparse::SuiteSparseConfig_static )
target_link_libraries ( GPURuntime_static PRIVATE SuiteSparse::SuiteSparseConfig_static )
else ( )
Expand All @@ -118,7 +119,6 @@ if ( BUILD_STATIC_LIBS )
CUDA_SEPARABLE_COMPILATION ON
CUDA_RUNTIME_LIBRARY Static )
target_link_libraries ( GPURuntime_static PRIVATE CUDA::nvrtc CUDA::cudart_static )
target_compile_definitions ( GPURuntime_static PRIVATE "SPQR_HAS_CUDA" )
# FIXME: Ok to hardcode CUDA library names like this?
set ( GPURUNTIME_STATIC_LIBS "-L${CUDAToolkit_LIBRARY_DIR} -lcuda -lcudart_static" )
if ( TARGET CUDA::cublas_static )
Expand Down
13 changes: 5 additions & 8 deletions SPQR/SPQRGPU/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,16 @@ message ( STATUS "C++ flags for CUDA: ${CMAKE_CXX_FLAGS}" )

file ( GLOB SPQR_CUDA_SOURCES "spqrgpu_*.cpp" )

if ( BUILD_SHARED_LIBS )
target_sources ( SPQR PRIVATE ${SPQR_CUDA_SOURCES} )
endif ( )
target_sources ( spqr_obj PRIVATE ${SPQR_CUDA_SOURCES} )

if ( BUILD_STATIC_LIBS )
target_sources ( SPQR_static PRIVATE ${SPQR_CUDA_SOURCES} )
endif ( )
set_target_properties ( spqr_obj PROPERTIES
POSITION_INDEPENDENT_CODE ON
CUDA_SEPARABLE_COMPILATION ON )
target_compile_definitions ( spqr_obj PRIVATE "SPQR_HAS_CUDA" )

if ( BUILD_SHARED_LIBS )
set_target_properties ( SPQR PROPERTIES POSITION_INDEPENDENT_CODE ON )
set_target_properties ( SPQR PROPERTIES CUDA_SEPARABLE_COMPILATION ON )
target_compile_definitions ( SPQR PRIVATE "SPQR_HAS_CUDA" )

target_link_libraries ( SPQR PRIVATE
CUDA::nvrtc CUDA::cudart_static CUDA::cublas )
Expand All @@ -46,7 +44,6 @@ endif ( )
if ( BUILD_STATIC_LIBS )
set_target_properties ( SPQR_static PROPERTIES CUDA_SEPARABLE_COMPILATION ON )
set_target_properties ( SPQR_static PROPERTIES POSITION_INDEPENDENT_CODE ON )
target_compile_definitions ( SPQR_static PRIVATE "SPQR_HAS_CUDA" )

target_link_libraries ( SPQR_static PRIVATE
CUDA::nvrtc CUDA::cudart_static CUDA::cublas )
Expand Down

0 comments on commit 725ea9f

Please sign in to comment.