From 03d24dba6c712737961644d578b45a37f476556b Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Tue, 22 Oct 2019 10:06:31 -0700 Subject: [PATCH] Fix static linking cuDNN without static CUDA (#28378) Summary: Fixes https://github.com/pytorch/pytorch/pull/27887#issuecomment-544649765 The logs show that `USE_STATIC_CUDNN` is used but not `CAFFE2_STATIC_LINK_CUDA`. Pull Request resolved: https://github.com/pytorch/pytorch/pull/28378 Differential Revision: D18061841 Pulled By: ezyang fbshipit-source-id: 3b9b49953094e02f808ff12107ba4226688d9986 --- cmake/Dependencies.cmake | 17 +++-------------- cmake/public/cuda.cmake | 25 ++++++++++++++++--------- torch/CMakeLists.txt | 2 +- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index e6855f345b1..4c2cb2ddbe3 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -898,29 +898,18 @@ if(USE_CUDA) # A helper variable recording the list of Caffe2 dependent libraries # torch::cudart is dealt with separately, due to CUDA_ADD_LIBRARY # design reason (it adds CUDA_LIBRARIES itself). - set(Caffe2_PUBLIC_CUDA_DEPENDENCY_LIBS caffe2::cufft caffe2::curand) + set(Caffe2_PUBLIC_CUDA_DEPENDENCY_LIBS + caffe2::cufft caffe2::curand caffe2::cublas) if(CAFFE2_USE_NVRTC) list(APPEND Caffe2_PUBLIC_CUDA_DEPENDENCY_LIBS caffe2::cuda caffe2::nvrtc) else() caffe2_update_option(USE_NVRTC OFF) endif() if(CAFFE2_USE_CUDNN) - IF(CUDNN_STATIC) - LIST(APPEND Caffe2_PUBLIC_CUDA_DEPENDENCY_LIBS - caffe2::cudnn "${CUDA_TOOLKIT_ROOT_DIR}/lib64/libculibos.a" "dl") - ELSE() - list(APPEND Caffe2_PUBLIC_CUDA_DEPENDENCY_LIBS caffe2::cudnn) - ENDIF() + list(APPEND Caffe2_PUBLIC_CUDA_DEPENDENCY_LIBS caffe2::cudnn) else() caffe2_update_option(USE_CUDNN OFF) endif() - if(CAFFE2_STATIC_LINK_CUDA) - # When statically linking, this must be the order of the libraries - LIST(APPEND Caffe2_PUBLIC_CUDA_DEPENDENCY_LIBS - "${CUDA_TOOLKIT_ROOT_DIR}/lib64/libculibos.a" caffe2::cublas) - else() - LIST(APPEND Caffe2_PUBLIC_CUDA_DEPENDENCY_LIBS caffe2::cublas) - endif() if(CAFFE2_USE_TENSORRT) list(APPEND Caffe2_PUBLIC_CUDA_DEPENDENCY_LIBS caffe2::tensorrt) else() diff --git a/cmake/public/cuda.cmake b/cmake/public/cuda.cmake index 8e3a0ca873a..03c59d3e76f 100644 --- a/cmake/public/cuda.cmake +++ b/cmake/public/cuda.cmake @@ -192,9 +192,10 @@ set_property( # library. add_library(torch::cudart INTERFACE IMPORTED) if(CAFFE2_STATIC_LINK_CUDA) - set_property( - TARGET torch::cudart PROPERTY INTERFACE_LINK_LIBRARIES - "${CUDA_TOOLKIT_ROOT_DIR}/lib64/libcudart_static.a" rt dl) + target_link_libraries(torch::cudart INTERFACE "${CUDA_cudart_static_LIBRARY}") + if (NOT WIN32) + target_link_libraries(torch::cudart INTERFACE rt dl) + endif() else() set_property( TARGET torch::cudart PROPERTY INTERFACE_LINK_LIBRARIES @@ -214,14 +215,20 @@ if(CAFFE2_USE_CUDNN) set_property( TARGET caffe2::cudnn PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CUDNN_INCLUDE_PATH}) + if(CUDNN_STATIC AND NOT WIN32) + target_link_libraries(caffe2::cudnn INTERFACE + "${CUDA_TOOLKIT_ROOT_DIR}/lib64/libculibos.a" dl) + endif() endif() # curand add_library(caffe2::curand UNKNOWN IMPORTED) -if(CAFFE2_STATIC_LINK_CUDA) +if(CAFFE2_STATIC_LINK_CUDA AND NOT WIN32) set_property( TARGET caffe2::curand PROPERTY IMPORTED_LOCATION "${CUDA_TOOLKIT_ROOT_DIR}/lib64/libcurand_static.a") + target_link_libraries(caffe2::curand INTERFACE + "${CUDA_TOOLKIT_ROOT_DIR}/lib64/libculibos.a" dl) else() set_property( TARGET caffe2::curand PROPERTY IMPORTED_LOCATION @@ -234,10 +241,10 @@ set_property( # cufft. CUDA_CUFFT_LIBRARIES is actually a list, so we will make an # interface library similar to cudart. add_library(caffe2::cufft INTERFACE IMPORTED) -if(CAFFE2_STATIC_LINK_CUDA) - set_property( - TARGET caffe2::cufft PROPERTY INTERFACE_LINK_LIBRARIES - "${CUDA_TOOLKIT_ROOT_DIR}/lib64/libcufft_static.a") +if(CAFFE2_STATIC_LINK_CUDA AND NOT WIN32) + target_link_libraries(caffe2::cufft INTERFACE + "${CUDA_TOOLKIT_ROOT_DIR}/lib64/libcufft_static.a" + "${CUDA_TOOLKIT_ROOT_DIR}/lib64/libculibos.a" dl) else() set_property( TARGET caffe2::cufft PROPERTY INTERFACE_LINK_LIBRARIES @@ -261,7 +268,7 @@ endif() # cublas. CUDA_CUBLAS_LIBRARIES is actually a list, so we will make an # interface library similar to cudart. add_library(caffe2::cublas INTERFACE IMPORTED) -if(CAFFE2_STATIC_LINK_CUDA) +if(CAFFE2_STATIC_LINK_CUDA AND NOT WIN32) set_property( TARGET caffe2::cublas PROPERTY INTERFACE_LINK_LIBRARIES "${CUDA_TOOLKIT_ROOT_DIR}/lib64/libcublas_static.a") diff --git a/torch/CMakeLists.txt b/torch/CMakeLists.txt index 22bdca210cd..a9b31b0fd04 100644 --- a/torch/CMakeLists.txt +++ b/torch/CMakeLists.txt @@ -123,7 +123,6 @@ set(TORCH_PYTHON_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/third_party ${CMAKE_BINARY_DIR}/third_party/onnx - ${TORCH_ROOT}/third_party/build/nccl/include ${TORCH_ROOT}/third_party/gloo ${TORCH_ROOT}/third_party/onnx ${TORCH_ROOT}/third_party/pybind11/include @@ -249,6 +248,7 @@ if (USE_NCCL) list(APPEND TORCH_PYTHON_SRCS ${TORCH_SRC_DIR}/csrc/cuda/python_nccl.cpp) list(APPEND TORCH_PYTHON_COMPILE_DEFINITIONS USE_NCCL) + list(APPEND TORCH_PYTHON_LINK_LIBRARIES __caffe2_nccl) endif() # In the most recent CMake versions, a new 'TRANSFORM' subcommand of 'list' allows much of the boilerplate of defining the lists