From 2609b6ff67a3108a7b6151cad4907d6b78b88197 Mon Sep 17 00:00:00 2001 From: Damien Nguyen Date: Tue, 22 Feb 2022 16:02:23 +0100 Subject: [PATCH] Add support for system pkgs: nccl --- cmake/external_libs/nccl.cmake | 11 +- cmake/modules/Findnccl.cmake | 242 +++++++++++++++++++++++++++++++++ 2 files changed, 247 insertions(+), 6 deletions(-) create mode 100644 cmake/modules/Findnccl.cmake diff --git a/cmake/external_libs/nccl.cmake b/cmake/external_libs/nccl.cmake index a33aee8577..4374e2cdf2 100644 --- a/cmake/external_libs/nccl.cmake +++ b/cmake/external_libs/nccl.cmake @@ -9,13 +9,12 @@ endif() set(nccl_CFLAGS "-D_FORTIFY_SOURCE=2 -O2") mindspore_add_pkg( nccl - VER 2.7.6-1 + VER 2.7.6 LIBS nccl URL ${REQ_URL} MD5 ${MD5} - BUILD_OPTION src.build - INSTALL_INCS build/include/* - INSTALL_LIBS build/lib/* - TARGET_ALIAS mindspore::nccl nccl::nccl -) + BUILD_OPTION src.install + BUILD_OPTION_PASS_PREFIX + GEN_CMAKE_CONFIG + TARGET_ALIAS mindspore::nccl nccl::nccl) include_directories(${nccl_INC}) diff --git a/cmake/modules/Findnccl.cmake b/cmake/modules/Findnccl.cmake new file mode 100644 index 0000000000..62ad793664 --- /dev/null +++ b/cmake/modules/Findnccl.cmake @@ -0,0 +1,242 @@ +# ============================================================================== +# +# Copyright 2022 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============================================================================== + +#[=======================================================================[.rst: +Findnccl +--------- + +Find nccl include dirs and libraries + +Use this module by invoking :command:`find_package` with the form: + +.. code-block:: cmake + + find_package(nccl + [version] [EXACT] # Minimum or EXACT version e.g. 2020.03 + [REQUIRED] # Fail with error if nccl is not found + [COMPONENTS ...] # nccl libraries by their canonical name + ) + +This module finds headers and requested component libraries OR a CMake package configuration file provided by a "nccl +CMake" build. For the latter case skip to the :ref:`nccl CMake` section below. + +Result Variables +^^^^^^^^^^^^^^^^ + +This module defines the following variables: + +``nccl_FOUND`` + True if headers and requested libraries were found. + +``nccl_INCLUDE_DIRS`` + nccl include directories. + +``nccl_LIBRARY_DIRS`` + Link directories for nccl libraries. + +``nccl_LIBRARIES`` + nccl component libraries to be linked. + +``nccl__FOUND`` + True if component ```` was found (```` name is upper-case). + +``nccl__LIBRARY`` + Libraries to link for component ```` (may include :command:`target_link_libraries` debug/optimized + keywords). + +``nccl_VERSION`` + nccl version number in ``X.Y`` format. + +``nccl_VERSION_MAJOR`` + nccl major version number (``X`` in ``X.Y``). + +``nccl_VERSION_MINOR`` + nccl minor version number (``Y`` in ``X.Y``). + +Cache variables +^^^^^^^^^^^^^^^ + +Search results are saved persistently in CMake cache entries: + +``nccl_INCLUDE_DIR`` + Directory containing nccl headers. + +``nccl_LIBRARY_DIR_RELEASE`` + Directory containing release nccl libraries. + +``nccl_LIBRARY_DIR_DEBUG`` + Directory containing debug nccl libraries. + +``nccl__LIBRARY_DEBUG`` + Component ```` library debug variant. + +``nccl__LIBRARY_RELEASE`` + Component ```` library release variant. + +Hints +^^^^^ + +This module reads hints about search locations from variables: + +``nccl_ROOT``, ``ncclROOT`` + Preferred installation prefix. + +``nccl_INCLUDEDIR`` + Preferred include directory e.g. ``/include``. + +``nccl_LIBRARYDIR`` + Preferred library directory e.g. ``/lib``. + +``nccl_NO_SYSTEM_PATHS`` + Set to ``ON`` to disable searching in locations not specified by these hint variables. Default is ``OFF``. + +Users may set these hints or results as ``CACHE`` entries. Projects should not read these entries directly but +instead use the above result variables. Note that some hint names start in upper-case ``nccl``. One may specify these +as environment variables if they are not specified as CMake variables or cache entries. + +This module first searches for the nccl header files using the above hint variables (excluding ``nccl_LIBRARYDIR``) and +saves the result in ``nccl_INCLUDE_DIR``. Then it searches for requested component libraries using the above hints +(excluding ``nccl_INCLUDEDIR``), "lib" directories near ``nccl_INCLUDE_DIR``, and the library name configuration +settings below. It saves the library directories in ``nccl_LIBRARY_DIR_DEBUG`` and ``nccl_LIBRARY_DIR_RELEASE`` and +individual library locations in ``nccl__LIBRARY_DEBUG`` and ``nccl__LIBRARY_RELEASE``. When one +changes settings used by previous searches in the same build tree (excluding environment variables) this module +discards previous search results affected by the changes and searches again. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module defines the following :prop_tgt:`IMPORTED` targets: + +``nccl::`` + Target for specific component dependency (shared or static library); ```` name is lower-case. + +It is important to note that the imported targets behave differently than variables created by this module: multiple +calls to :command:`find_package(nccl)` in the same directory or sub-directories with different options (e.g. static or +shared) will not override the values of the targets created by the first call. + +Other Variables +^^^^^^^^^^^^^^^ + +nccl libraries come in many variants encoded in their file name. Users or projects may tell this module which variant +to find by setting variables: + +``nccl_FIND_RELEASE_ONLY`` + Set to ``ON`` or ``OFF`` to specify whether to restrict the search to release libraries only. Default is ``OFF``. + +``nccl_USE_DEBUG_LIBS`` + Set to ``ON`` or ``OFF`` to specify whether to search and use the debug libraries. Default is ``ON`` (except when + nccl_FIND_RELEASE_ONLY is ``ON``). + +``nccl_USE_RELEASE_LIBS`` + Set to ``ON`` or ``OFF`` to specify whether to search and use the release libraries. Default is ``ON``. + +Other variables one may set to control this module are: + +``nccl_DEBUG`` + Set to ``ON`` to enable debug output from ``Findnccl``. Please enable this before filing any bug report. + +``nccl_LIBRARY_DIR`` + Default value for ``nccl_LIBRARY_DIR_RELEASE`` and ``nccl_LIBRARY_DIR_DEBUG``. + + +Examples +^^^^^^^^ + +Find nccl headers only: + +.. code-block:: cmake + + find_package(nccl 2.0.0) + if(nccl_FOUND) + include_directories(${nccl_INCLUDE_DIRS}) + add_executable(foo foo.cc) + target_link_libraries(foo PUBLIC nccl::nccl) + endif() + +Find nccl libraries and use imported targets: + +.. code-block:: cmake + + find_package(nccl 2.0.0 REQUIRED COMPONENTS nccl) + add_executable(foo foo.cc) + target_link_libraries(foo PUBLIC nccl::nccl) + +Find nccl headers and some *static* (release only) libraries: + +.. code-block:: cmake + + set(nccl_USE_DEBUG_LIBS OFF) # ignore debug libs and + set(nccl_USE_RELEASE_LIBS ON) # only find release libs + find_package(nccl 2.0.0 COMPONENTS nccl) + if(nccl_FOUND) + add_executable(foo foo.cc) + target_link_libraries(foo PUBLIC nccl::nccl) + endif() + +.. _`nccl CMake`: + +nccl CMake +^^^^^^^^^^ + +If nccl was built using CMake, it provides a package configuration file for use with find_package's config mode. +This module looks for the package configuration file called ``ncclConfig.cmake`` and stores the result in ``CACHE`` +entry ``nccl_DIR``. If found, the package configuration file is loaded and this module returns with no further action. +See documentation of the nccl CMake package configuration for details on what it provides. + +Set ``nccl_NO_CMAKE`` to ``ON``, to disable the search for the package using the CONFIG method. + +.. _`nccl pkg-config`: + +nccl CMake +^^^^^^^^^^ + +If nccl was installed with its pkg-config files, this module may attempt to look for nccl by relying on pkg-config. +If the components are found using this method, this module returns with no further action. + +Set ``nccl_NO_PKGCONFIG`` to ``ON``, to disable the search for the package using the pkg-config method. + +#]=======================================================================] + +# cmake-lint: disable=C0103 + +include(_find_utils_begin) + +set(_pkg nccl) +set(${_pkg}_INCLUDE_FILE nccl.h) +set(${_pkg}_INCLUDE_PATH_SUFFIXES include include/${_pkg} ${_pkg}) +set(${_pkg}_DEFAULT_COMPONENTS nccl) +set(${_pkg}_nccl_NAMES nccl) + +# Update NCCL library search directories with pre-built paths +function(nccl_update_library_search_dirs_with_prebuilt_paths componentlibvar basedir) + if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") + list(APPEND ${componentlibvar} ${basedir}/lib) + elseif(UNIX) + list(APPEND ${componentlibvar} ${basedir}/lib64) + list(APPEND ${componentlibvar} ${basedir}/lib) + list(APPEND ${componentlibvar} ${basedir}/lib/x86_64-linux-gnu) + endif() + + set(${componentlibvar} + ${${componentlibvar}} + PARENT_SCOPE) +endfunction() + +include(_find_utils_end) + +# ==============================================================================