Namespaces | |
namespace | detail |
namespace | profiling |
Classes | |
class | basic_static_string |
statically known interned strings these have O(1) comparison for equality More... | |
struct | bf16 |
struct | c_free |
std::unique_ptr Deleter that calls free() More... | |
struct | c_munmap |
std::unique_ptr Deleter for memory mapped data More... | |
struct | cpuid_t |
result from calling the CPUID instruction More... | |
struct | fp16 |
struct | imm_t |
A compile time constant passed as an empty struct. More... | |
struct | mwaitx |
waiter using MONITORX/MWAITX for AMD More... | |
struct | reify |
struct | simd |
simd primitive definition More... | |
struct | spin |
spin waiter using PAUSE More... | |
class | static_c_string |
struct | umwait |
waiter using UMONITOR/UMWAIT for Intel More... | |
Concepts | |
concept | trivially_destructible |
a type where the destructor does no work, and therefore it is safe to simply discard. | |
concept | one_of |
N is one of the candidates | |
concept | not_one_of |
N is not one of the candidates | |
concept | simd_type |
recognizes any valid simd type | |
concept | has_storage_type |
concept | has_lifted_operations |
Does this type have operations that semantically correct when lifted to the simd_data_t level? | |
concept | has_simd_type |
ein::simd_data_t<T ,N> is defined | |
concept | has_builtin_convertvector |
can we convert simd_data_t<U,N> -> simd_data_t<T,N> automatically using gcc vector extensions? | |
concept | simd_builtin |
is this type one of the types that is handed well automatically by clang/gcc vector extensions? | |
concept | has_mmask |
Do we want to use AVX512's notion of an _mmask8, _mmask16, _mmask32, or _mmask64 for masking operations. | |
concept | one_of_t |
type T is one of the candidates | |
concept | not_one_of_t |
type T is not one of the candidates | |
concept | waiter |
some way to wait for a value to change | |
Typedefs | |
using | mmap_ptr = std::unique_ptr<void,c_munmap> |
memory mapped data, managed by std::unique_ptr. calls munmap to free. | |
template<trivially_destructible T> | |
using | unique_c_ptr = std::unique_ptr<T, c_free> |
a unique_ptr managed c pointer, deleted by free() | |
using | unique_str = unique_c_ptr<char const> |
a c string, managed by unique_ptr | |
template<typename T > | |
using | int_t |
returns a signed integer type of the same size as T suitable for std::bitcast | |
template<typename T > | |
using | uint_t |
returns an unsigned integer type of the same size as T suitable for std::bitcast | |
template<typename T > | |
using | storage_type |
The type used to store T in a simd_data_t. | |
template<typename T , size_t N> | |
using | simd_data_t = storage_type<T> __attribute__((__vector_size__(N*sizeof(storage_type<T>)),__aligned__(N*sizeof(storage_type<T>)))) |
template<typename T , size_t N> | |
using | simd_intrinsic_t |
Returns the Intel intrinsic type associated with a simd register full of N values of type T . | |
template<size_t N> | |
using | mmask_t |
If AVX512 is enabled returns the type of an n-bit mmask. | |
template<typename T , size_t N> | |
using | simd_mask_t |
What type of mask should I use? | |
using | static_string = basic_static_string<char> |
using | static_wstring = basic_static_string<wchar_t> |
using | static_u8string = basic_static_string<char8_t> |
using | static_u16string = basic_static_string<char16_t> |
using | static_u32string = basic_static_string<char32_t> |
Enumerations | |
enum class | cpu_vendor : uint8_t { intel =0 , amd =1 , unknown =2 } |
CPU vendor id. More... | |
enum class | CMPINT : size_t { CMPINT::EQ = 0x0uz , CMPINT::LT = 0x1uz , CMPINT::LE = 0x2uz , CMPINT::FALSE = 0x3uz , CMPINT::NE = 0x4uz , CMPINT::NLT = 0x5uz , CMPINT::NLE = 0x6uz , CMPINT::TRUE = 0x7uz } |
enum class | CMP : size_t { CMP::EQ_OQ = 0x00uz , CMP::LT_OS = 0x01uz , CMP::LE_OS = 0x02uz , CMP::UNORD_Q = 0x03uz , CMP::NEQ_UQ = 0x04uz , CMP::NLT_US = 0x05uz , CMP::NLE_US = 0x06uz , CMP::ORD_Q = 0x07uz , CMP::EQ_UQ = 0x08uz , CMP::NGE_US = 0x09uz , CMP::NGT_US = 0x0Auz , CMP::FALSE_OQ = 0x0Buz , CMP::NEQ_OQ = 0x0Cuz , CMP::GE_OS = 0x0Duz , CMP::GT_OS = 0x0Euz , CMP::TRUE_UQ = 0x0Fuz , CMP::EQ_OS = 0x10uz , CMP::LT_OQ = 0x11uz , CMP::LE_OQ = 0x12uz , CMP::UNORD_S = 0x13uz , CMP::NEQ_US = 0x14uz , CMP::NLT_UQ = 0x15uz , CMP::NLE_UQ = 0x16uz , CMP::ORD_S = 0x17uz , CMP::EQ_US = 0x18uz , CMP::NGE_UQ = 0x19uz , CMP::NGT_UQ = 0x1Auz , CMP::FALSE_OS = 0x1Buz , CMP::NEQ_OS = 0x1Cuz , CMP::GE_OQ = 0x1Duz , CMP::GT_OQ = 0x1Euz , CMP::TRUE_US = 0x1Fuz } |
Functions | |
cpuid_t | cpuid (int32_t eax, int32_t ecx) noexcept |
calls CPUID and returns all of the registers that it responds with. | |
mmap_ptr | make_mmap_ptr (void *p, size_t size) noexcept |
construct a mmap_ptr using a base pointer and its size for munmap | |
unique_str | dup (char const *str) noexcept |
duplicate a C string using strdup and manage it as a unique_str | |
template bool | cmp_unord (float, float) noexcept |
template bool | cmp_unord (double, double) noexcept |
template bool | cmp_ord (float, float) noexcept |
template bool | cmp_ord (double, double) noexcept |
X template float | scalef (float, float) noexcept |
cond xmacro | |
X template double | scalef (double, double) noexcept |
template<typename T > | |
constexpr bool | cmp_unord (T a, T b) noexcept |
Return true if either argument is NaN. | |
template<typename T > | |
constexpr bool | cmp_ord (T a, T b) noexcept |
Return true if neither argument is NaN. | |
template<one_of_t< float, double > T> | |
constexpr T | scalef (T x, T y) noexcept |
template<CMPINT imm8, typename T > requires (one_of_t<T,uint8_t,int8_t,uint16_t,int16_t,uint32_t,int32_t,uint64_t,int64_t> && (size_t(imm8) < 8uz)) | |
constexpr bool | cmpint (T a, T b) noexcept |
template<CMP imm8, typename T > requires (one_of_t<T,float,double> && (size_t(imm8) < 32uz)) | |
constexpr bool | cmp (T a, T b) noexcept |
perform an avx512 style floating point comparison for scalar values. | |
constexpr bf16 | operator""_bf16 (long double v) noexcept |
constexpr bf16 | fast_to_bf16 (float f) noexcept |
constexpr bf16 | fast_to_bf16 (bf16 f) noexcept |
constexpr fp16 | operator""_fp16 (long double v) noexcept |
__m128 | cast_ps (__m128i a) noexcept |
__m128 | cast_ps (__m128 a) noexcept |
__m256 | cast_ps (__m256i a) noexcept |
__m256 | cast_ps (__m256 a) noexcept |
__m128d | cast_pd (__m128i a) noexcept |
__m128d | cast_pd (__m128d a) noexcept |
__m256d | cast_pd (__m256i a) noexcept |
__m256d | cast_pd (__m256d a) noexcept |
__m128i | cast_si (__m128 a) noexcept |
__m128i | cast_si (__m128d a) noexcept |
__m128i | cast_si (__m128i a) noexcept |
__m256i | cast_si (__m256 a) noexcept |
__m256i | cast_si (__m256d a) noexcept |
__m256i | cast_si (__m256i a) noexcept |
__m512 | cast_ps (__m512i a) noexcept |
__m512d | cast_pd (__m512i a) noexcept |
__m512 | cast_ps (__m512 a) noexcept |
__m512d | cast_pd (__m512d a) noexcept |
__m512i | cast_si (__m512 a) noexcept |
__m512i | cast_si (__m512d a) noexcept |
__m512i | cast_si (__m512i a) noexcept |
template<typename CharT , typename Traits > | |
void | to_json (nlohmann::json &j, const basic_static_string< CharT, Traits > &s) |
template<class T , T ... xs> | |
consteval basic_static_string< T, std::char_traits< T > > | operator""_ss () noexcept |
template<one_of_t< char > T, T ... xs> | |
consteval static_c_string | operator""_scs () noexcept |
void | to_json (nlohmann::json &j, static_c_string const &s) |
const string_view | type_of (auto const &t) noexcept |
returns the unmangled name of a the type of the (unused) argument passed to this function | |
template<waiter W> | |
ein_flatten void | wait_until (volatile auto *p, auto f) noexcept ein_blocking |
Wait until a predicate holds about a given memory location. | |
auto | with_waiter (auto k) noexcept |
finds an appropriate waiter for the current CPU | |
argument deduction | |
template<typename T , size_t N> requires ( has_simd_type<T,N> && (N % sizeof(T) == 0) ) | |
simd (T __attribute((__vector_size__(N)))) -> simd< T, N/sizeof(T)> | |
guidance when loading data from clang/gcc vector extensions | |
template<typename ... Args> requires has_simd_type<std::common_type<Args...>, sizeof...(Args)> | |
simd (Args &&...) -> simd< std::common_type< Args... >, sizeof...(Args)> | |
guidance for loading from arguments | |
template<typename T > requires has_simd_type<T,max_simd_size/sizeof(T)> | |
simd (T) -> simd< T, has_simd_type< T, max_simd_size/sizeof(T)> > | |
default to max simd size for broadcast | |
shuffles | |
template<size_t ... is> | |
auto | shuffle (simd_type auto x) |
create a new simd register with contents drawn from this one | |
template<size_t ... is> | |
auto | shuffle (simd_type auto x, simd_type auto y) |
create a new simd register with contents drawn from these two | |
Variables | |
enum cpu_vendor | cpu_vendor |
Reports the vendor of the CPU encountered at runtime. Cached. | |
template<size_t N> | |
constinit imm_t< N > | imm {} |
A compile time constant passed as an empty struct. | |
constexpr size_t | max_fp_comparison_predicate |
AVX512 added many more floating point comparison types. Do we have them? | |
constexpr size_t | max_simd_size = 64 |
largest simd register width supported on this platform in bytes | |
template<typename T > | |
const string_view | type |
returns the unmangled name of a the type T | |
struct ein::cpuid_t |
using ein::mmap_ptr = std::unique_ptr<void,c_munmap> |
memory mapped data, managed by std::unique_ptr. calls munmap to free.
Definition at line 39 of file memory.hpp.
using ein::static_string = basic_static_string<char> |
Definition at line 247 of file static_string.hpp.
using ein::static_u16string = basic_static_string<char16_t> |
Definition at line 250 of file static_string.hpp.
using ein::static_u32string = basic_static_string<char32_t> |
Definition at line 251 of file static_string.hpp.
using ein::static_u8string = basic_static_string<char8_t> |
Definition at line 249 of file static_string.hpp.
using ein::static_wstring = basic_static_string<wchar_t> |
Definition at line 248 of file static_string.hpp.
using ein::unique_c_ptr = std::unique_ptr<T, c_free> |
a unique_ptr managed c pointer, deleted by free()
Definition at line 61 of file memory.hpp.
using ein::unique_str = unique_c_ptr<char const> |
a c string, managed by unique_ptr
Definition at line 66 of file memory.hpp.
|
strong |
|
noexcept |
|
noexcept |
|
noexcept |
|
noexcept |
|
noexcept[[pure]] |
calls CPUID and returns all of the registers that it responds with.
this can take a 100+ cycles and stalls everything waiting for writes, so please, do this outside of the critical path.
Definition at line 19 of file cpuid.cpp.
References ein::cpuid_t::eax, ein::cpuid_t::ebx, ein::cpuid_t::ecx, and ein::cpuid_t::edx.
|
noexcept[[nodiscard]][[always_inline]][[artificial]][[pure]][[nonnull( 1 )]][[noescape]] |
duplicate a C string using strdup
and manage it as a unique_str
string
is non-null Definition at line 74 of file memory.hpp.
|
constexprnoexcept[[nodiscard]][[always_inline]][[artificial]][[const]] |
|
noexcept[[always_inline]][[artificial]][[nonnull( 1 )]] |
construct a mmap_ptr using a base pointer and its size for munmap
p
is non-null Definition at line 45 of file memory.hpp.
|
constexprnoexcept[[nodiscard]][[always_inline]][[artificial]] |
|
constexprnoexcept[[nodiscard]][[always_inline]][[artificial]][[const]] |
|
constevalnoexcept |
Definition at line 381 of file static_string.hpp.
|
constevalnoexcept |
Definition at line 376 of file static_string.hpp.
|
noexcept |
|
noexcept |
cond xmacro
void ein::to_json | ( | nlohmann::json & | j, |
const basic_static_string< CharT, Traits > & | s ) |
Definition at line 233 of file static_string.hpp.
|
inline |
Definition at line 389 of file static_string.hpp.