14 #include <type_traits>
19 #include <cuda_runtime_api.h>
24 using Clock = std::chrono::high_resolution_clock;
26 using Duration = std::chrono::duration<double>;
37 std::string to_precision(T value,
int precision = 2) {
39 ss.precision(precision);
52 std::string
inline format_nbytes(
double nbytes,
int precision = 2) {
53 constexpr std::array<const char*, 6> units = {
" B",
" KiB",
" MiB",
" GiB",
" TiB"};
55 for (
auto const& unit : units) {
56 if (std::abs(n) < 1024.0) {
57 return to_precision(n, precision) + unit;
61 return to_precision(n, precision) +
" PiB";
71 std::string
inline format_duration(
double seconds,
int precision = 2) {
72 double sec = std::abs(seconds);
74 return to_precision(seconds * 1e9, precision) +
" ns";
75 }
else if (sec < 1e-3) {
76 return to_precision(seconds * 1e6, precision) +
" us";
78 return to_precision(seconds * 1e3, precision) +
" ms";
80 return to_precision(seconds, precision) +
" s";
96 template <
typename MapType>
97 std::pair<typename MapType::key_type, typename MapType::mapped_type> extract_item(
98 MapType& map,
typename MapType::const_iterator position
100 auto node = map.extract(position);
102 throw std::out_of_range(
"Invalid iterator passed to extract");
104 return {std::move(node.key()), std::move(node.mapped())};
117 template <
typename MapType>
118 std::pair<typename MapType::key_type, typename MapType::mapped_type> extract_item(
119 MapType& map,
typename MapType::key_type
const& key
121 auto node = map.extract(key);
123 throw std::out_of_range(
"Invalid key passed to extract");
125 return {std::move(node.key()), std::move(node.mapped())};
139 template <
typename MapType>
140 typename MapType::mapped_type extract_value(
141 MapType& map,
typename MapType::key_type
const& key
143 return std::move(extract_item(map, key).second);
159 template <
typename MapType>
160 typename MapType::mapped_type extract_value(
161 MapType& map,
typename MapType::const_iterator position
163 return std::move(extract_item(map, position).second);
176 template <
typename MapType>
177 typename MapType::key_type extract_key(
178 MapType& map,
typename MapType::key_type
const& key
180 return std::move(extract_item(map, key).first);
195 template <
typename MapType>
196 typename MapType::key_type extract_key(
197 MapType& map,
typename MapType::const_iterator position
199 return std::move(extract_item(map, position).first);
212 template <
typename MapType>
213 auto to_vector(MapType&& map) {
214 using ValueType =
typename std::remove_reference_t<MapType>::mapped_type;
215 std::vector<ValueType> vec;
216 vec.reserve(map.size());
217 for (
auto&& [key, value] : map) {
218 vec.push_back(std::move(value));
228 bool is_running_under_valgrind();
238 template <
typename T>
239 constexpr T safe_div(T x, T y) {
240 return (y == 0) ? 0 : x / y;
249 std::string trim(std::string
const& str);
257 std::string to_lower(std::string str);
265 std::string to_upper(std::string str);
287 template <
typename T>
288 T parse_string(std::string
const& value) {
289 std::stringstream sstream(value);
292 if (sstream.fail()) {
293 throw std::invalid_argument(
"cannot parse \"" + std::string{value} +
"\"");
313 bool parse_string(std::string
const& value);
316 #define RAPIDSMPF_CONCAT_DETAIL_(x, y) x##y
317 #define RAPIDSMPF_CONCAT(x, y) RAPIDSMPF_CONCAT_DETAIL_(x, y)
320 #define RAPIDSMPF_STRINGIFY_DETAIL_(x) #x
321 #define RAPIDSMPF_STRINGIFY(x) RAPIDSMPF_STRINGIFY_DETAIL_(x)
339 #define RAPIDSMPF_OVERLOAD_BY_ARG_COUNT(_1, _2, NAME, ...) NAME
352 template <
typename T>
358 template <
typename T>
360 return std::addressof(ptr);
364 template <
typename T>
370 template <
typename T>
378 template <
class... Ts>
380 using Ts::operator()...;
386 #define RAPIDSMPF_CUDA_VERSION_AT_LEAST(version) (CUDART_VERSION >= version)
400 int get_current_numa_node_id();
constexpr T * to_pointer(T *ptr) noexcept
Returns the raw pointer from a pointer, reference, or smart pointer.
Helper for overloaded lambdas using std::visit.