Agora  1.2.0
Agora project
utils.h
Go to the documentation of this file.
1 // Copyright (c) 2018-2021, Rice University
2 // RENEW OPEN SOURCE LICENSE: http://renew-wireless.org/license
3 
10 #ifndef UTILS_H_
11 #define UTILS_H_
12 
13 #define UNUSED __attribute__((unused))
14 #define unused(x) ((void)(x))
15 #define likely(x) __builtin_expect(!!(x), 1)
16 #define unlikely(x) __builtin_expect(!!(x), 0)
17 
18 #include <complex>
19 #include <cstddef>
20 #include <cstdint>
21 #include <fstream> // std::ifstream
22 #include <random>
23 #include <string>
24 #include <vector>
25 
26 #include "armadillo"
27 #include "symbols.h"
28 
29 // Default argument is to exclude core 0 from the list
31  bool verbose = false,
32  const std::vector<size_t>& cores_to_exclude = std::vector<size_t>(1, 0));
33 
34 size_t GetPhysicalCoreId(size_t core_id);
35 
36 /* Pin this thread to core with global index = core_id */
37 int PinToCore(size_t core_id);
38 
39 /* Pin this thread to core (base_core_offset + thread_id) */
40 void PinToCoreWithOffset(ThreadType thread, size_t base_core_offset,
41  size_t thread_id, bool allow_reuse = false,
42  bool verbose = false);
43 
45 
46 template <class T>
49  int id_;
50 };
51 
52 class Utils {
53  public:
54  Utils();
55  ~Utils();
56 
57  static std::vector<size_t> StrToChannels(const std::string& channel);
58  static std::vector<std::complex<int16_t>> DoubleToCint16(
59  const std::vector<std::vector<double>>& in);
60  static std::vector<std::complex<float>> DoubleToCfloat(
61  const std::vector<std::vector<double>>& in);
62  static std::vector<std::complex<float>> Uint32tocfloat(
63  const std::vector<uint32_t>& in, const std::string& order);
64  static std::vector<std::complex<float>> Cint16ToCfloat32(
65  const std::vector<std::complex<int16_t>>& in);
66  static std::vector<uint32_t> Cint16ToUint32(
67  const std::vector<std::complex<int16_t>>& in, bool conj,
68  const std::string& order);
69  static std::vector<uint32_t> Cfloat32ToUint32(
70  const std::vector<std::complex<float>>& in, bool conj,
71  const std::string& order);
72  static std::vector<std::vector<size_t>> LoadSymbols(
73  std::vector<std::string> const& frames, char sym);
74  static void LoadDevices(std::string filename, std::vector<std::string>& data);
75  static void LoadData(const char* filename,
76  std::vector<std::complex<int16_t>>& data, int samples);
77  static void LoadData(const char* filename, std::vector<unsigned>& data,
78  int samples);
79  static void LoadTddConfig(const std::string& filename, std::string& jconfig);
80  static std::vector<std::string> Split(const std::string& s, char delimiter);
81  static void PrintVector(const std::vector<std::complex<int16_t>>& data);
82  static void WriteBinaryFile(const std::string& name, size_t elem_size,
83  size_t buffer_size, void* buff);
84  static void PrintVec(const arma::cx_fvec& c, const std::string& ss);
85  static void SaveVec(const arma::cx_fvec& c, const std::string& filename,
86  const std::string& /*ss*/, const bool /*append*/);
87  static void PrintMat(const arma::cx_fmat& c, const std::string& ss);
88  static void SaveMat(const arma::cx_fmat& c, const std::string& filename,
89  const std::string& ss, const bool append);
90 };
91 
94 template <uint64_t PowerOfTwoNumber, typename T>
95 static constexpr T Roundup(T x) {
96  static_assert(IsPowerOfTwo(PowerOfTwoNumber),
97  "PowerOfTwoNumber must be a power of 2");
98  return ((x) + T(PowerOfTwoNumber - 1)) & (~T(PowerOfTwoNumber - 1));
99 }
100 
104 static inline void RtAssert(bool condition, const char* throw_str) {
105  if (unlikely(!condition)) {
106  throw std::runtime_error(throw_str);
107  }
108 }
109 
113 static inline void RtAssert(bool condition) {
114  if (unlikely(!condition)) {
115  throw std::runtime_error("Error");
116  }
117 }
118 
120 static inline void RtAssert(bool condition, const std::string& throw_str) {
121  if (unlikely(!condition)) {
122  throw std::runtime_error(throw_str);
123  }
124 }
125 
127 static inline void RtAssert(bool condition, const std::string& throw_str,
128  char* s) {
129  if (unlikely(!condition)) {
130  throw std::runtime_error(throw_str + std::string(s));
131  }
132 }
133 
135 inline size_t Gcd(size_t a, size_t b) {
136  if (a == 0) {
137  return b;
138  }
139  return Gcd(b % a, a);
140 }
141 
143 inline size_t Lcm(size_t a, size_t b) { return (a * b) / Gcd(a, b); }
144 
146 struct Range {
147  const size_t start_;
148  const size_t end_;
149 
152  Range(size_t start, size_t end) : start_(start), end_(end) {
153  RtAssert(end >= start, "Invalid range, end must be >= start");
154  }
155 
157  bool Contains(size_t value) const {
158  return (value >= start_) && (value < end_);
159  }
160 
161  std::string ToString() const {
162  std::ostringstream ret;
163  ret << "[" << start_ << ":" << end_ << ")";
164  return ret.str();
165  }
166 };
167 
168 class SlowRand {
169  std::random_device rand_dev_; // Non-pseudorandom seed for twister
170  std::mt19937_64 mt_;
171  std::uniform_int_distribution<uint64_t> dist_;
172 
173  public:
174  SlowRand() : mt_(rand_dev_()), dist_(0, UINT64_MAX) {}
175 
176  inline uint64_t NextU64() { return dist_(mt_); }
177 };
178 
179 class FastRand {
180  public:
181  uint64_t seed_;
182 
185  SlowRand slow_rand;
186  seed_ = slow_rand.NextU64();
187  }
188 
189  inline uint32_t NextU32() {
190  seed_ = seed_ * 1103515245 + 12345;
191  return static_cast<uint32_t>(seed_ >> 32);
192  }
193 };
194 #endif // UTILS_H_
Range::ToString
std::string ToString() const
Definition: utils.h:161
Utils::Cfloat32ToUint32
static std::vector< uint32_t > Cfloat32ToUint32(const std::vector< std::complex< float >> &in, bool conj, const std::string &order)
Definition: utils.cc:291
FastRand::seed_
uint64_t seed_
Definition: utils.h:181
cpu_layout
static std::vector< size_t > cpu_layout
Definition: utils.cc:44
Lcm
size_t Lcm(size_t a, size_t b)
Returns the least common multiple of a and b.
Definition: utils.h:143
Utils::~Utils
~Utils()
moodycamel::details::thread_id
thread_id_t thread_id()
Definition: concurrentqueue.h:157
PinToCoreWithOffset
void PinToCoreWithOffset(ThreadType thread_type, size_t core_offset, size_t thread_id, bool allow_reuse, bool verbose)
Definition: utils.cc:157
mm_gui.comp
comp
Definition: mm_gui.py:117
Utils::LoadDevices
static void LoadDevices(std::string filename, std::vector< std::string > &data)
Definition: utils.cc:327
fmt::v8::printf
auto printf(const S &fmt, const T &... args) -> int
Definition: printf.h:631
Utils::PrintVec
static void PrintVec(const arma::cx_fvec &c, const std::string &ss)
Definition: utils.cc:488
datatype_conversion.h
SlowRand
Definition: utils.h:168
PinToCore
int PinToCore(size_t core_id)
Definition: utils.cc:143
CoreInfo::operator>
bool operator>(const CoreInfo &comp) const
Definition: utils.cc:38
Utils::WriteBinaryFile
static void WriteBinaryFile(const std::string &name, size_t elem_size, size_t buffer_size, void *buff)
Definition: utils.cc:411
SlowRand::rand_dev_
std::random_device rand_dev_
Definition: utils.h:169
Catch::Generators::value
GeneratorWrapper< T > value(T &&value)
Definition: catch.hpp:3999
ThreadTypeStr
static std::string ThreadTypeStr(ThreadType thread_type)
Definition: symbols.h:229
Utils::Utils
Utils()
PinToCore
int PinToCore(size_t core_id)
Definition: utils.cc:143
Roundup
static constexpr T Roundup(T x)
Definition: utils.h:95
kEnableThreadPinning
static constexpr bool kEnableThreadPinning
Definition: symbols.h:137
fclose
fclose(fileID)
mm_gui.app
app
Definition: mm_gui.py:118
Utils::LoadTddConfig
static void LoadTddConfig(const std::string &filename, std::string &jconfig)
Definition: utils.cc:380
TOSTRING
#define TOSTRING(x)
Definition: symbols.h:14
x
x
Definition: simulate_performance.m:69
SlowRand::dist_
std::uniform_int_distribution< uint64_t > dist_
Definition: utils.h:171
ThreadType
ThreadType
Definition: symbols.h:213
EventHandlerContext::id_
int id_
Definition: utils.h:49
CoreInfo::operator<
bool operator<(const CoreInfo &comp) const
Definition: utils.cc:34
CoreInfo::mapped_core_
size_t mapped_core_
Definition: utils.cc:31
IsPowerOfTwo
static constexpr bool IsPowerOfTwo(T x)
Return true at compile time iff a constant is a power of two.
Definition: symbols.h:35
Utils
Definition: utils.h:52
T
T
Definition: simulate_performance.m:4
filename
filename
Definition: parse_all_dl.m:14
Utils::DoubleToCint16
static std::vector< std::complex< int16_t > > DoubleToCint16(const std::vector< std::vector< double >> &in)
Definition: utils.cc:219
SlowRand::mt_
std::mt19937_64 mt_
Definition: utils.h:170
fmt::v8::detail::find
auto find(Ptr first, Ptr last, T value, Ptr &out) -> bool
Definition: core.h:2258
SetCpuLayoutOnNumaNodes
void SetCpuLayoutOnNumaNodes(bool verbose=false, const std::vector< size_t > &cores_to_exclude=std::vector< size_t >(1, 0))
Definition: utils.cc:87
CoreInfo::CoreInfo
CoreInfo(size_t id, size_t mapped, size_t req, ThreadType type)
Definition: utils.cc:23
unlikely
#define unlikely(x)
Definition: utils.h:16
FastRand::FastRand
FastRand()
Create a FastRand using a seed from SlowRand.
Definition: utils.h:184
len
uint16_t len
Definition: eth_common.h:62
CoreInfo::thread_id_
size_t thread_id_
Definition: utils.cc:29
i
for i
Definition: generate_data.m:107
Utils::PrintVector
static void PrintVector(const std::vector< std::complex< int16_t >> &data)
Definition: utils.cc:405
Catch::cout
std::ostream & cout()
Range::start_
const size_t start_
Definition: utils.h:147
Range
A range type with an inclusive start bound and an exclusive end bound.
Definition: utils.h:146
Utils::Cint16ToUint32
static std::vector< uint32_t > Cint16ToUint32(const std::vector< std::complex< int16_t >> &in, bool conj, const std::string &order)
Definition: utils.cc:275
PinToCoreWithOffset
void PinToCoreWithOffset(ThreadType thread, size_t base_core_offset, size_t thread_id, bool allow_reuse=false, bool verbose=false)
Definition: utils.cc:157
fmt::v8::fprintf
auto fprintf(std::FILE *f, const S &fmt, const T &... args) -> int
Definition: printf.h:607
Utils::Cint16ToCfloat32
static std::vector< std::complex< float > > Cint16ToCfloat32(const std::vector< std::complex< int16_t >> &in)
Definition: utils.cc:264
start
end start
Definition: inspect_agora_results.m:95
SlowRand::NextU64
uint64_t NextU64()
Definition: utils.h:176
cpu_layout_initialized
static bool cpu_layout_initialized
Definition: utils.cc:45
s
s
Definition: simulate_performance.m:3
symbols.h
CoreInfo::type_
ThreadType type_
Definition: utils.cc:32
FastRand::NextU32
uint32_t NextU32()
Definition: utils.h:189
PrintCoreAssignmentSummary
void PrintCoreAssignmentSummary()
Definition: utils.cc:85
Utils::StrToChannels
static std::vector< size_t > StrToChannels(const std::string &channel)
Definition: utils.cc:207
extract_version.data
dictionary data
Definition: extract_version.py:8
Gcd
size_t Gcd(size_t a, size_t b)
Returns the greatest common divisor of a and b.
Definition: utils.h:135
Range::end_
const size_t end_
Definition: utils.h:148
CoreInfo
Definition: utils.cc:22
GetPhysicalCoreId
size_t GetPhysicalCoreId(size_t core_id)
Definition: utils.cc:128
PrintBitmask
static void PrintBitmask(const struct bitmask *bm)
Definition: utils.cc:79
Utils::SaveMat
static void SaveMat(const arma::cx_fmat &c, const std::string &filename, const std::string &ss, const bool append)
Definition: utils.cc:428
GetPhysicalCoreId
size_t GetPhysicalCoreId(size_t core_id)
Definition: utils.cc:128
Range::Contains
bool Contains(size_t value) const
Returns true if this range contains the given value.
Definition: utils.h:157
PrintCoreList
static void PrintCoreList(const std::list< CoreInfo > &clist)
Definition: utils.cc:62
GetCoreId
static size_t GetCoreId(size_t core)
Definition: utils.cc:51
Utils::Uint32tocfloat
static std::vector< std::complex< float > > Uint32tocfloat(const std::vector< uint32_t > &in, const std::string &order)
Definition: utils.cc:243
pin_core_mutex
static std::mutex pin_core_mutex
Definition: utils.cc:46
FastRand
Definition: utils.h:179
core_list
static std::list< CoreInfo > core_list
Definition: utils.cc:49
verbose
verbose
Definition: inspect_agora_results.m:5
CoreInfo::requested_core_
size_t requested_core_
Definition: utils.cc:30
SlowRand::SlowRand
SlowRand()
Definition: utils.h:174
fwrite
fwrite(fileID, pilot_f, 'float')
RtAssert
static void RtAssert(bool condition, const char *throw_str)
Definition: utils.h:104
PrintCoreAssignmentSummary
void PrintCoreAssignmentSummary()
Definition: utils.cc:85
Utils::LoadSymbols
static std::vector< std::vector< size_t > > LoadSymbols(std::vector< std::string > const &frames, char sym)
Definition: utils.cc:310
Utils::Split
static std::vector< std::string > Split(const std::string &s, char delimiter)
Definition: utils.cc:395
EventHandlerContext::obj_ptr_
T * obj_ptr_
Definition: utils.h:48
id
uint16_t id
Definition: eth_common.h:65
utils.h
Utility functions for file and text processing.
kShrtFltConvFactor
static constexpr float kShrtFltConvFactor
Definition: datatype_conversion.h:18
Utils::DoubleToCfloat
static std::vector< std::complex< float > > DoubleToCfloat(const std::vector< std::vector< double >> &in)
Definition: utils.cc:232
Utils::PrintMat
static void PrintMat(const arma::cx_fmat &c, const std::string &ss)
Definition: utils.cc:452
num_cores
num_cores
Definition: parse_all_dl.m:3
Utils::LoadData
static void LoadData(const char *filename, std::vector< std::complex< int16_t >> &data, int samples)
Definition: utils.cc:350
Utils::SaveVec
static void SaveVec(const arma::cx_fvec &c, const std::string &filename, const std::string &, const bool)
Definition: utils.cc:468
nlohmann::json_v3_11_1NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON::detail2::end
end_tag end(T &&...)
fmt::v8::detail::digits::result
result
Definition: format-inl.h:640
fmt::v8::detail::type
type
Definition: core.h:1131
EventHandlerContext
Definition: utils.h:47
Range::Range
Range(size_t start, size_t end)
Definition: utils.h:152
SetCpuLayoutOnNumaNodes
void SetCpuLayoutOnNumaNodes(bool verbose, const std::vector< size_t > &cores_to_exclude)
Definition: utils.cc:87