56static constexpr std::size_t STACK_THRESHOLD = 1024;
58using BetaKernelFn = void(*)(
const double*, std::size_t,
double&,
double*)
noexcept;
59using GammaKernelFn = void(*)(
const double*, std::size_t,
double*)
noexcept;
62[[nodiscard]]
inline BetaKernelFn select_beta_kernel() noexcept {
71[[nodiscard]]
inline GammaKernelFn select_gamma_kernel() noexcept {
83std::vector<srfm::momentum::BetaVelocity>
85 double& running_max)
noexcept
87 const std::size_t n = velocities.size();
88 std::vector<srfm::momentum::BetaVelocity> result;
89 if (n == 0)
return result;
93 std::vector<double> buf(n);
96 static const BetaKernelFn kernel = select_beta_kernel();
97 kernel(velocities.data(), n, running_max, buf.data());
102 for (std::size_t i = 0; i < n; ++i) {
105 if (opt.has_value()) {
106 result.push_back(*opt);
118std::vector<srfm::momentum::LorentzFactor>
120 const std::vector<srfm::momentum::BetaVelocity>& betas)
noexcept
122 const std::size_t n = betas.size();
123 std::vector<srfm::momentum::LorentzFactor> result;
124 if (n == 0)
return result;
128 std::vector<double> beta_buf(n);
129 for (std::size_t i = 0; i < n; ++i) {
130 beta_buf[i] = betas[i].value();
134 std::vector<double> gamma_buf(n);
137 static const GammaKernelFn kernel = select_gamma_kernel();
138 kernel(beta_buf.data(), n, gamma_buf.data());
142 for (std::size_t i = 0; i < n; ++i) {
156std::vector<srfm::momentum::BetaVelocity>
158 const std::vector<double>& velocities)
noexcept
163std::vector<srfm::momentum::LorentzFactor>
165 const std::vector<srfm::momentum::BetaVelocity>& betas)
noexcept
static std::optional< BetaVelocity > make(double value) noexcept
Validate and construct a BetaVelocity.
std::vector< srfm::momentum::LorentzFactor > computeGammaBatch(const std::vector< srfm::momentum::BetaVelocity > &betas) noexcept
Compute γ_i = 1/√(1 − β_i²) for a batch of betas.
void reset() noexcept
Reset the running maximum to 0.0.
std::vector< srfm::momentum::BetaVelocity > computeBetaBatch(const std::vector< double > &velocities) noexcept
Compute β_i = |v_i| / running_max for a batch of velocities.
SimdLevel simd_level() const noexcept
Returns the SIMD level selected for this process.
double running_max() const noexcept
Returns the current running maximum (read-only).
BetaCalculator() noexcept
Construct a fresh calculator. running_max starts at 0.0.
Runtime SIMD capability detection for the SRFM acceleration layer.
void compute_gamma_avx512(const double *__restrict__ betas, std::size_t n, double *__restrict__ out) noexcept
AVX-512F (512-bit, 8-wide) gamma batch kernel.
void compute_beta_avx2(const double *__restrict__ velocities, std::size_t n, double &running_max, double *__restrict__ out) noexcept
AVX2 (256-bit, 4-wide) beta batch kernel.
void compute_gamma_scalar(const double *__restrict__ betas, std::size_t n, double *__restrict__ out) noexcept
Scalar reference implementation of the gamma batch kernel.
void compute_gamma_avx2(const double *__restrict__ betas, std::size_t n, double *__restrict__ out) noexcept
AVX2 (256-bit, 4-wide) gamma batch kernel.
void compute_beta_scalar(const double *__restrict__ velocities, std::size_t n, double &running_max, double *__restrict__ out) noexcept
Scalar reference implementation of the beta batch kernel.
void compute_beta_avx512(const double *__restrict__ velocities, std::size_t n, double &running_max, double *__restrict__ out) noexcept
AVX-512F (512-bit, 8-wide) beta batch kernel.
std::vector< srfm::momentum::LorentzFactor > computeGammaBatch(const std::vector< srfm::momentum::BetaVelocity > &betas) noexcept
Compute γ_i = 1/√(1 − β_i²) for every element.
SimdLevel
Ordered enumeration of SIMD capability tiers.
@ AVX512F
AVX-512F — 512-bit; 8 doubles per ZMM register.
@ AVX2
AVX2 — 256-bit; 4 doubles per YMM register.
std::vector< srfm::momentum::BetaVelocity > computeBetaBatch(const std::vector< double > &velocities, double &running_max) noexcept
SimdLevel detect_simd_level() noexcept
Internal raw-double compute signatures for SIMD batch kernels.
Public API for SIMD-accelerated β and γ batch computation.
static srfm::momentum::LorentzFactor make(double gamma_val) noexcept