diff --git a/CMakeLists.txt b/CMakeLists.txt index ebaca2c..d896e4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -463,8 +463,8 @@ if(WITH_OMPI OR WITH_MPICH) endif() if(WITH_NCCL) - if (NOT WITH_NVIDIA AND NOT WITH_ILUVATAR) - message(FATAL_ERROR "NCCL backend requires NVIDIA or Iluvatar GPU support. Please enable `WITH_NVIDIA` or `WITH_ILUVATAR`.") + if (NOT WITH_NVIDIA AND NOT WITH_ILUVATAR AND NOT WITH_HYGON) + message(FATAL_ERROR "NCCL-compatible backend requires NVIDIA, Iluvatar, or Hygon GPU support.") endif() find_library(NCCL_LIB NAMES nccl HINTS ${_NCCL_HINTS} PATH_SUFFIXES lib lib64 REQUIRED) diff --git a/README.md b/README.md index 071c38d..17c8057 100644 --- a/README.md +++ b/README.md @@ -355,7 +355,7 @@ export LD_LIBRARY_PATH=${INFINI_INSTALL}/lib:$LD_LIBRARY_PATH |---------|---------------|----------------------|---------------| | **OpenMPI** | Full | `WITH_OMPI=ON` | The default backend. Requires the OpenMPI development package.| | **MPICH** | Full | `WITH_MPICH=ON` | Requires the MPICH development package.| -| **NCCL** | Partial | `WITH_NCCL=ON` | Requires NVIDIA or Iluvatar NCCL. Currently available when `WITH_NVIDIA=ON` or `WITH_ILUVATAR=ON`.| +| **NCCL-compatible** | Partial | `WITH_NCCL=ON` | Uses NCCL on NVIDIA/Iluvatar and the NCCL-compatible RCCL interface on Hygon. | | **MCCL** | Partial | `WITH_MCCL=ON` | Requires MetaX or Moore MCCL. Currently available when `WITH_METAX=ON` or `WITH_MOORE=ON`.| diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 769c6e8..ce80e91 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -251,6 +251,9 @@ if(WITH_NCCL) target_sources(infiniccl PRIVATE ${NCCL_SRCS}) target_include_directories(infiniccl PRIVATE ${NCCL_INC}) target_link_libraries(infiniccl PRIVATE ${NCCL_LIB}) + if(WITH_HYGON) + target_compile_definitions(infiniccl PUBLIC INFINI_CCL_USE_RCCL=1) + endif() endif() # MCCL diff --git a/src/backend_device_map.h b/src/backend_device_map.h index 96766c0..7cf46b0 100644 --- a/src/backend_device_map.h +++ b/src/backend_device_map.h @@ -21,6 +21,10 @@ template <> struct IsSupportedCombination : std::true_type {}; +template <> +struct IsSupportedCombination + : std::true_type {}; + template <> struct IsSupportedCombination : std::true_type {}; diff --git a/src/backends/ccl/nccl/api.h b/src/backends/ccl/nccl/api.h index e7b6119..9acbb26 100644 --- a/src/backends/ccl/nccl/api.h +++ b/src/backends/ccl/nccl/api.h @@ -1,11 +1,10 @@ #ifndef INFINI_CCL_BACKENDS_CCL_NCCL_API_H_ #define INFINI_CCL_BACKENDS_CCL_NCCL_API_H_ -#include - #include #include "backends/ccl/common/api.h" +#include "backends/ccl/nccl/vendor.h" #include "logging.h" #include "return_status_impl.h" #include "runtime.h" diff --git a/src/backends/ccl/nccl/checks.h b/src/backends/ccl/nccl/checks.h index defdf17..da7d671 100644 --- a/src/backends/ccl/nccl/checks.h +++ b/src/backends/ccl/nccl/checks.h @@ -1,10 +1,9 @@ #ifndef INFINI_CCL_BACKENDS_CCL_NCCL_CHECKS_H_ #define INFINI_CCL_BACKENDS_CCL_NCCL_CHECKS_H_ -#include - #include +#include "backends/ccl/nccl/vendor.h" #include "return_status_impl.h" #define INFINI_CHECK_NCCL(result) \ diff --git a/src/backends/ccl/nccl/hygon/api.h b/src/backends/ccl/nccl/hygon/api.h new file mode 100644 index 0000000..401e8a7 --- /dev/null +++ b/src/backends/ccl/nccl/hygon/api.h @@ -0,0 +1,15 @@ +#ifndef INFINI_CCL_BACKENDS_CCL_NCCL_HYGON_API_H_ +#define INFINI_CCL_BACKENDS_CCL_NCCL_HYGON_API_H_ + +#include "backends/ccl/nccl/api.h" +#include "devices/hygon/runtime_.h" + +namespace infini::ccl { + +template <> +struct CclApi + : NcclApi {}; + +} // namespace infini::ccl + +#endif // INFINI_CCL_BACKENDS_CCL_NCCL_HYGON_API_H_ diff --git a/src/backends/ccl/nccl/type_map.h b/src/backends/ccl/nccl/type_map.h index 8b1d786..f134d7a 100644 --- a/src/backends/ccl/nccl/type_map.h +++ b/src/backends/ccl/nccl/type_map.h @@ -1,16 +1,15 @@ #ifndef INFINI_CCL_BACKENDS_CCL_NCCL_TYPE_MAP_H_ #define INFINI_CCL_BACKENDS_CCL_NCCL_TYPE_MAP_H_ -#include - #include "backends/ccl/common/api.h" +#include "backends/ccl/nccl/vendor.h" #include "comm_impl.h" #include "data_type_impl.h" #include "logging.h" namespace infini::ccl { -#if defined(__CUDA_BF16_TYPES_EXIST__) +#if defined(__CUDA_BF16_TYPES_EXIST__) || defined(RCCL_BFLOAT16) constexpr ncclDataType_t kNcclBFloat16Val = ncclBfloat16; #else constexpr ncclDataType_t kNcclBFloat16Val = ncclNumTypes; diff --git a/src/backends/ccl/nccl/vendor.h b/src/backends/ccl/nccl/vendor.h new file mode 100644 index 0000000..5213f9b --- /dev/null +++ b/src/backends/ccl/nccl/vendor.h @@ -0,0 +1,10 @@ +#ifndef INFINI_CCL_BACKENDS_CCL_NCCL_VENDOR_H_ +#define INFINI_CCL_BACKENDS_CCL_NCCL_VENDOR_H_ + +#if defined(INFINI_CCL_USE_RCCL) +#include +#else +#include +#endif + +#endif // INFINI_CCL_BACKENDS_CCL_NCCL_VENDOR_H_