This PR adds optional support for loading nccl with `dlopen` as an alternative of compile time linking. This is to address the size bloat issue with the PyPI binary release. - Add CMake option to load `nccl` at runtime. - Add an NCCL stub. After this, `nccl` will be fetched from PyPI when using pip to install XGBoost, either by a user or by `pyproject.toml`. Others who want to link the nccl at compile time can continue to do so without any change. At the moment, this is Linux only since we only support MNMG on Linux.
97 lines
3.7 KiB
C++
97 lines
3.7 KiB
C++
/**
|
|
* Copyright 2021-2023, XGBoost Contributors
|
|
*/
|
|
#ifndef XGBOOST_STRING_VIEW_H_
|
|
#define XGBOOST_STRING_VIEW_H_
|
|
#include <xgboost/logging.h> // CHECK_LT
|
|
#include <xgboost/span.h> // Span
|
|
|
|
#include <algorithm> // for equal, min
|
|
#include <cstddef> // for size_t
|
|
#include <iterator> // for reverse_iterator
|
|
#include <ostream> // for ostream
|
|
#include <string> // for char_traits, string
|
|
|
|
namespace xgboost {
|
|
struct StringView {
|
|
private:
|
|
using CharT = char;
|
|
using Traits = std::char_traits<CharT>;
|
|
CharT const* str_{nullptr};
|
|
std::size_t size_{0};
|
|
|
|
public:
|
|
using value_type = CharT; // NOLINT
|
|
using iterator = const CharT*; // NOLINT
|
|
using const_iterator = iterator; // NOLINT
|
|
using reverse_iterator = std::reverse_iterator<const_iterator>; // NOLINT
|
|
using const_reverse_iterator = reverse_iterator; // NOLINT
|
|
|
|
public:
|
|
constexpr StringView() = default;
|
|
constexpr StringView(value_type const* str, std::size_t size) : str_{str}, size_{size} {}
|
|
StringView(std::string const& str) : str_{str.c_str()}, size_{str.size()} {} // NOLINT
|
|
constexpr StringView(value_type const* str) // NOLINT
|
|
: str_{str}, size_{str == nullptr ? 0ul : Traits::length(str)} {}
|
|
|
|
[[nodiscard]] value_type const& operator[](std::size_t p) const { return str_[p]; }
|
|
[[nodiscard]] explicit operator std::string() const { return {this->c_str(), this->size()}; }
|
|
[[nodiscard]] value_type const& at(std::size_t p) const { // NOLINT
|
|
CHECK_LT(p, size_);
|
|
return str_[p];
|
|
}
|
|
[[nodiscard]] constexpr std::size_t size() const { return size_; } // NOLINT
|
|
[[nodiscard]] constexpr bool empty() const { return size() == 0; } // NOLINT
|
|
[[nodiscard]] StringView substr(std::size_t beg, std::size_t n) const { // NOLINT
|
|
CHECK_LE(beg, size_);
|
|
std::size_t len = std::min(n, size_ - beg);
|
|
return {str_ + beg, len};
|
|
}
|
|
[[nodiscard]] value_type const* c_str() const { return str_; } // NOLINT
|
|
|
|
[[nodiscard]] constexpr const_iterator cbegin() const { return str_; } // NOLINT
|
|
[[nodiscard]] constexpr const_iterator cend() const { return str_ + size(); } // NOLINT
|
|
[[nodiscard]] constexpr iterator begin() const { return str_; } // NOLINT
|
|
[[nodiscard]] constexpr iterator end() const { return str_ + size(); } // NOLINT
|
|
|
|
[[nodiscard]] const_reverse_iterator rbegin() const noexcept { // NOLINT
|
|
return const_reverse_iterator(this->end());
|
|
}
|
|
[[nodiscard]] const_reverse_iterator crbegin() const noexcept { // NOLINT
|
|
return const_reverse_iterator(this->end());
|
|
}
|
|
[[nodiscard]] const_reverse_iterator rend() const noexcept { // NOLINT
|
|
return const_reverse_iterator(this->begin());
|
|
}
|
|
[[nodiscard]] const_reverse_iterator crend() const noexcept { // NOLINT
|
|
return const_reverse_iterator(this->begin());
|
|
}
|
|
};
|
|
|
|
inline std::ostream& operator<<(std::ostream& os, StringView const v) {
|
|
for (auto c : v) {
|
|
os.put(c);
|
|
}
|
|
return os;
|
|
}
|
|
|
|
inline bool operator==(StringView l, StringView r) {
|
|
if (l.size() != r.size()) {
|
|
return false;
|
|
}
|
|
return std::equal(l.cbegin(), l.cend(), r.cbegin());
|
|
}
|
|
|
|
inline bool operator!=(StringView l, StringView r) { return !(l == r); }
|
|
|
|
inline bool operator<(StringView l, StringView r) {
|
|
return common::Span<StringView::value_type const>{l.c_str(), l.size()} <
|
|
common::Span<StringView::value_type const>{r.c_str(), r.size()};
|
|
}
|
|
|
|
inline bool operator<(std::string const& l, StringView r) { return StringView{l} < r; }
|
|
|
|
inline bool operator<(StringView l, std::string const& r) { return l < StringView{r}; }
|
|
} // namespace xgboost
|
|
#endif // XGBOOST_STRING_VIEW_H_
|