You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

FindNCCL.cmake 3.2 kB

4 years ago
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # Try to find NCCL
  2. #
  3. # The following variables are optionally searched for defaults
  4. # NCCL_ROOT: Base directory where all NCCL components are found
  5. # NCCL_ROOT_DIR: Base directory where all NCCL components are found
  6. # NCCL_INCLUDE_DIR: Directory where NCCL header is found
  7. # NCCL_LIB_DIR: Directory where NCCL library is found
  8. #
  9. # The following are set after configuration is done:
  10. # NCCL_FOUND
  11. # NCCL_INCLUDE_DIRS
  12. # NCCL_LIBRARIES
  13. #
  14. # The path hints include CUDA_TOOLKIT_ROOT_DIR seeing as some folks
  15. # install NCCL in the same location as the CUDA toolkit.
  16. # See https://github.com/caffe2/caffe2/issues/1601
  17. if (NOT DEFINED NCCL_ROOT)
  18. set(NCCL_ROOT $ENV{CONDA_PREFIX})
  19. endif()
  20. set(NCCL_ROOT_DIR $ENV{NCCL_ROOT_DIR} CACHE PATH "Folder contains NVIDIA NCCL")
  21. find_path(NCCL_INCLUDE_DIRS
  22. NAMES nccl.h
  23. HINTS
  24. ${NCCL_ROOT}
  25. ${NCCL_ROOT}/include
  26. ${NCCL_INCLUDE_DIR}
  27. ${NCCL_ROOT_DIR}
  28. ${NCCL_ROOT_DIR}/include
  29. ${CUDA_TOOLKIT_ROOT_DIR}/include
  30. REQUIRED)
  31. if ($ENV{USE_STATIC_NCCL})
  32. message(STATUS "USE_STATIC_NCCL detected. Linking against static NCCL library")
  33. set(NCCL_LIBNAME "libnccl_static.a")
  34. else()
  35. set(NCCL_LIBNAME "nccl")
  36. endif()
  37. find_library(NCCL_LIBRARIES
  38. NAMES ${NCCL_LIBNAME}
  39. HINTS
  40. ${NCCL_LIB_DIR}
  41. ${NCCL_ROOT}
  42. ${NCCL_ROOT}/lib
  43. ${NCCL_ROOT}/lib/x86_64-linux-gnu
  44. ${NCCL_ROOT}/lib64
  45. ${NCCL_ROOT_DIR}
  46. ${NCCL_ROOT_DIR}/lib
  47. ${NCCL_ROOT_DIR}/lib/x86_64-linux-gnu
  48. ${NCCL_ROOT_DIR}/lib64
  49. ${CUDA_TOOLKIT_ROOT_DIR}/lib64
  50. REQUIRED)
  51. set (NCCL_HEADER_FILE "${NCCL_INCLUDE_DIRS}/nccl.h")
  52. message (STATUS "Determining NCCL version from ${NCCL_HEADER_FILE}...")
  53. set (OLD_CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
  54. list (APPEND CMAKE_REQUIRED_INCLUDES ${NCCL_INCLUDE_DIRS} ${CUDAToolkit_INCLUDE_DIR})
  55. include(CheckCXXSymbolExists)
  56. check_cxx_symbol_exists(NCCL_VERSION_CODE nccl.h NCCL_VERSION_DEFINED)
  57. if (NCCL_VERSION_DEFINED)
  58. set(file "${PROJECT_BINARY_DIR}/detect_nccl_version.cc")
  59. file(WRITE ${file} "
  60. #include <iostream>
  61. #include \"${NCCL_HEADER_FILE}\"
  62. int main()
  63. {
  64. std::cout << NCCL_MAJOR << '.' << NCCL_MINOR << '.' << NCCL_PATCH;
  65. int x;
  66. ncclGetVersion(&x);
  67. return x == NCCL_VERSION_CODE;
  68. }
  69. ")
  70. try_run(NCCL_VERSION_MATCHED compile_result ${PROJECT_BINARY_DIR} ${file}
  71. RUN_OUTPUT_VARIABLE NCCL_VERSION
  72. CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${CUDAToolkit_INCLUDE_DIR}"
  73. LINK_LIBRARIES ${NCCL_LIBRARIES})
  74. if (NOT NCCL_VERSION_MATCHED)
  75. message(FATAL_ERROR "Found NCCL header version and library version do not match! \
  76. (include: ${NCCL_INCLUDE_DIRS}, library: ${NCCL_LIBRARIES}). Please set NCCL_INCLUDE_DIR and NCCL_LIB_DIR manually.")
  77. endif()
  78. message(STATUS "NCCL version: ${NCCL_VERSION}")
  79. else()
  80. message(STATUS "NCCL version < 2.3.5-5")
  81. endif ()
  82. set (CMAKE_REQUIRED_INCLUDES ${OLD_CMAKE_REQUIRED_INCLUDES})
  83. mark_as_advanced(NCCL_ROOT_DIR NCCL_INCLUDE_DIRS NCCL_LIBRARIES)
  84. include(FindPackageHandleStandardArgs)
  85. find_package_handle_standard_args(
  86. NCCL
  87. REQUIRED_VARS NCCL_INCLUDE_DIRS NCCL_LIBRARIES
  88. VERSION_VAR NCCL_VERSION)

分布式深度学习系统

Contributors (1)