CUDA_RESOLVE_DEVICE_SYMBOLS should prevent consumer libraries from linking device code again
when setting property CUDA_RESOLVE_DEVICE_SYMBOLS
to true, the affected library links device code intermediately.
when adding this library to some other target link list, the consumer will execute the device code linkage again, resulting on more compilation steps and bloated build time.
My concerns are regarding the usefulness of such step: wont the dobule linking of the same symbols produce name clashes and violations of ODR?
CMake example:
cmake_minimum_required(VERSION 3.13)
project(test_static_cuda VERSION 0.0.0 LANGUAGES C CXX CUDA)
add_library(lib1 STATIC lib1.cu)
set_target_properties(lib1
PROPERTIES
CUDA_RESOLVE_DEVICE_SYMBOLS ON
CUDA_SEPARABLE_COMPILATION OFF
)
add_library(lib2 STATIC lib2.cu)
set_target_properties(lib2
PROPERTIES
CUDA_RESOLVE_DEVICE_SYMBOLS ON
CUDA_SEPARABLE_COMPILATION OFF
)
add_library(lib3 STATIC lib3.cpp)
target_link_libraries(lib3 lib1 lib2)
add_library(lib4 SHARED lib4.cpp)
target_link_libraries(lib4 lib1 lib2 )
add_executable(main main.cpp)
target_link_libraries(main lib3 lib4)
build
-- Configuring done
-- Generating done
-- Build files have been written to: /build
[ 7%] Building CUDA object CMakeFiles/lib2.dir/lib2.cu.o
[ 14%] Linking CUDA device code CMakeFiles/lib2.dir/cmake_device_link.o
[ 21%] Linking CUDA static library liblib2.a
[ 21%] Built target lib2
[ 28%] Building CUDA object CMakeFiles/lib1.dir/lib1.cu.o
[ 35%] Linking CUDA device code CMakeFiles/lib1.dir/cmake_device_link.o
[ 42%] Linking CUDA static library liblib1.a
[ 42%] Built target lib1
[ 50%] Building CXX object CMakeFiles/lib4.dir/lib4.cpp.o
[ 57%] Linking CUDA device code CMakeFiles/lib4.dir/cmake_device_link.o
[ 64%] Linking CXX shared library liblib4.so
[ 64%] Built target lib4
[ 71%] Building CXX object CMakeFiles/lib3.dir/lib3.cpp.o
[ 78%] Linking CXX static library liblib3.a
[ 78%] Built target lib3
[ 85%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[ 92%] Linking CUDA device code CMakeFiles/main.dir/cmake_device_link.o
[100%] Linking CXX executable main
[100%] Built target main
are the following steps superfluous when linking device code in lib1 and lib2?
- [ 57%] Linking CUDA device code CMakeFiles/lib4.dir/cmake_device_link.o
- [ 92%] Linking CUDA device code CMakeFiles/main.dir/cmake_device_link.o