forked from huawei/mindspore2022
243 lines
8.2 KiB
CMake
243 lines
8.2 KiB
CMake
# ==============================================================================
|
|
#
|
|
# Copyright 2022 <Huawei Technologies Co., Ltd>
|
|
#
|
|
# 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 <libs>...] # 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_<COMPONENT>_FOUND``
|
|
True if component ``<COMPONENT>`` was found (``<COMPONENT>`` name is upper-case).
|
|
|
|
``nccl_<COMPONENT>_LIBRARY``
|
|
Libraries to link for component ``<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_<COMPONENT>_LIBRARY_DEBUG``
|
|
Component ``<COMPONENT>`` library debug variant.
|
|
|
|
``nccl_<COMPONENT>_LIBRARY_RELEASE``
|
|
Component ``<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. ``<prefix>/include``.
|
|
|
|
``nccl_LIBRARYDIR``
|
|
Preferred library directory e.g. ``<prefix>/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_<COMPONENT>_LIBRARY_DEBUG`` and ``nccl_<COMPONENT>_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::<component>``
|
|
Target for specific component dependency (shared or static library); ``<component>`` 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)
|
|
|
|
# ==============================================================================
|