Skip to content

Commit a1d7d53

Browse files
committed
Make PFFFT functions non-blocking
1 parent fdac368 commit a1d7d53

2 files changed

Lines changed: 27 additions & 19 deletions

File tree

common/pffft.cpp

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ force_inline constexpr auto ld_ps1(float a) noexcept -> v4sf { return a; }
328328
[[maybe_unused, nodiscard]] inline
329329
auto valigned(const float *ptr) noexcept -> bool
330330
{
331-
static constexpr auto alignmask = uintptr_t{SimdSize*sizeof(float) - 1};
331+
constexpr auto alignmask = uintptr_t{SimdSize*sizeof(float) - 1};
332332
return (std::bit_cast<uintptr_t>(ptr) & alignmask) == 0;
333333
}
334334
#endif
@@ -812,9 +812,9 @@ void radf3_ps(const size_t ido, const size_t l1, const v4sf *RESTRICT cc, v4sf *
812812
void radb3_ps(const size_t ido, const size_t l1, const v4sf *RESTRICT cc, v4sf *RESTRICT ch,
813813
const float *const wa1)
814814
{
815-
static constexpr auto taur = -0.5f;
816-
static constexpr auto taui = 0.866025403784439f;
817-
static constexpr auto taui_2 = taui*2.0f;
815+
constexpr auto taur = -0.5f;
816+
constexpr auto taui = 0.866025403784439f;
817+
constexpr auto taui_2 = taui*2.0f;
818818

819819
const auto vtaur = ld_ps1(taur);
820820
const auto vtaui_2 = ld_ps1(taui_2);
@@ -1789,7 +1789,7 @@ force_inline void pffft_real_finalize_4x4(const v4sf *in0, const v4sf *in1, cons
17891789
NOINLINE void pffft_real_finalize(const size_t Ncvec, const v4sf *in, v4sf *RESTRICT out,
17901790
const v4sf *e)
17911791
{
1792-
static constexpr auto s = std::numbers::sqrt2_v<float>/2.0f;
1792+
constexpr auto s = std::numbers::sqrt2_v<float>/2.0f;
17931793

17941794
Expects(in != out);
17951795
const auto dk = size_t{Ncvec/SimdSize}; // number of 4x4 matrix blocks
@@ -1890,7 +1890,7 @@ force_inline void pffft_real_preprocess_4x4(const v4sf *in, const v4sf *e, v4sf
18901890
NOINLINE void pffft_real_preprocess(const size_t Ncvec, const v4sf *in, v4sf *RESTRICT out,
18911891
const v4sf *e)
18921892
{
1893-
static constexpr auto sqrt2 = std::numbers::sqrt2_v<float>;
1893+
constexpr auto sqrt2 = std::numbers::sqrt2_v<float>;
18941894

18951895
Expects(in != out);
18961896
const auto dk = size_t{Ncvec/SimdSize}; // number of 4x4 matrix blocks
@@ -2172,7 +2172,7 @@ void pffft_zconvolve_accumulate_internal(const PFFFT_Setup *s, const v4sf *RESTR
21722172
* vectors, these casts are needed.
21732173
*/
21742174
void pffft_zreorder(const PFFFT_Setup *setup, const float *in, float *out,
2175-
pffft_direction_t direction)
2175+
pffft_direction_t direction) noexcept NONBLOCKING
21762176
{
21772177
Expects(in != out);
21782178
Expects(valigned(in) && valigned(out));
@@ -2181,22 +2181,23 @@ void pffft_zreorder(const PFFFT_Setup *setup, const float *in, float *out,
21812181
}
21822182

21832183
void pffft_zconvolve_scale_accumulate(const PFFFT_Setup *s, const float *a, const float *b,
2184-
float *ab, float scaling)
2184+
float *ab, float scaling) noexcept NONBLOCKING
21852185
{
21862186
Expects(valigned(a) && valigned(b) && valigned(ab));
21872187
pffft_zconvolve_scale_accumulate_internal(s, reinterpret_cast<const v4sf*>(a),
21882188
reinterpret_cast<const v4sf*>(b), reinterpret_cast<v4sf*>(ab), scaling);
21892189
}
21902190

21912191
void pffft_zconvolve_accumulate(const PFFFT_Setup *s, const float *a, const float *b, float *ab)
2192+
noexcept NONBLOCKING
21922193
{
21932194
Expects(valigned(a) && valigned(b) && valigned(ab));
21942195
pffft_zconvolve_accumulate_internal(s, reinterpret_cast<const v4sf*>(a),
21952196
reinterpret_cast<const v4sf*>(b), reinterpret_cast<v4sf*>(ab));
21962197
}
21972198

21982199
void pffft_transform(const PFFFT_Setup *setup, const float *input, float *output, float *work,
2199-
pffft_direction_t direction)
2200+
pffft_direction_t direction) noexcept NONBLOCKING
22002201
{
22012202
Expects(valigned(input) && valigned(output) && valigned(work));
22022203
pffft_transform_internal(setup, reinterpret_cast<const v4sf*>(std::assume_aligned<16>(input)),
@@ -2205,7 +2206,7 @@ void pffft_transform(const PFFFT_Setup *setup, const float *input, float *output
22052206
}
22062207

22072208
void pffft_transform_ordered(const PFFFT_Setup *setup, const float *input, float *output,
2208-
float *work, pffft_direction_t direction)
2209+
float *work, pffft_direction_t direction) noexcept NONBLOCKING
22092210
{
22102211
Expects(valigned(input) && valigned(output) && valigned(work));
22112212
pffft_transform_internal(setup, reinterpret_cast<const v4sf*>(std::assume_aligned<16>(input)),
@@ -2273,7 +2274,7 @@ void pffft_transform_internal(const PFFFT_Setup *setup, const float *input, floa
22732274
} // namespace
22742275

22752276
void pffft_zreorder(const PFFFT_Setup *setup, const float *in, float *RESTRICT out,
2276-
pffft_direction_t direction)
2277+
pffft_direction_t direction) noexcept NONBLOCKING
22772278
{
22782279
const auto N = size_t{setup->N};
22792280
if(setup->transform == PFFFT_COMPLEX)
@@ -2300,7 +2301,7 @@ void pffft_zreorder(const PFFFT_Setup *setup, const float *in, float *RESTRICT o
23002301
}
23012302

23022303
void pffft_zconvolve_scale_accumulate(const PFFFT_Setup *s, const float *a, const float *b,
2303-
float *ab, float scaling)
2304+
float *ab, float scaling) noexcept NONBLOCKING
23042305
{
23052306
auto Ncvec = size_t{s->Ncvec};
23062307

@@ -2324,6 +2325,7 @@ void pffft_zconvolve_scale_accumulate(const PFFFT_Setup *s, const float *a, cons
23242325
}
23252326

23262327
void pffft_zconvolve_accumulate(const PFFFT_Setup *s, const float *a, const float *b, float *ab)
2328+
noexcept NONBLOCKING
23272329
{
23282330
auto Ncvec = size_t{s->Ncvec};
23292331

@@ -2348,13 +2350,13 @@ void pffft_zconvolve_accumulate(const PFFFT_Setup *s, const float *a, const floa
23482350

23492351

23502352
void pffft_transform(const PFFFT_Setup *setup, const float *input, float *output, float *work,
2351-
pffft_direction_t direction)
2353+
pffft_direction_t direction) noexcept NONBLOCKING
23522354
{
23532355
pffft_transform_internal(setup, input, output, work, direction, false);
23542356
}
23552357

23562358
void pffft_transform_ordered(const PFFFT_Setup *setup, const float *input, float *output,
2357-
float *work, pffft_direction_t direction)
2359+
float *work, pffft_direction_t direction) noexcept NONBLOCKING
23582360
{
23592361
pffft_transform_internal(setup, input, output, work, direction, true);
23602362
}

common/pffft.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
#include <memory>
8585

8686
#include "almalloc.h"
87+
#include "opthelpers.h"
8788

8889

8990
/* opaque struct holding internal stuff (precomputed twiddle factors) this
@@ -125,7 +126,8 @@ PFFFTSetupPtr pffft_new_setup(unsigned int N, pffft_transform_t transform);
125126
*
126127
* The input and output parameters may alias.
127128
*/
128-
void pffft_transform(const PFFFT_Setup *setup, const float *input, float *output, float *work, pffft_direction_t direction);
129+
void pffft_transform(const PFFFT_Setup *setup, const float *input, float *output, float *work,
130+
pffft_direction_t direction) noexcept NONBLOCKING;
129131

130132
/**
131133
* Similar to pffft_transform, but handles the complex values in the usual form
@@ -137,7 +139,8 @@ void pffft_transform(const PFFFT_Setup *setup, const float *input, float *output
137139
*
138140
* The input and output parameters may alias.
139141
*/
140-
void pffft_transform_ordered(const PFFFT_Setup *setup, const float *input, float *output, float *work, pffft_direction_t direction);
142+
void pffft_transform_ordered(const PFFFT_Setup *setup, const float *input, float *output,
143+
float *work, pffft_direction_t direction) noexcept NONBLOCKING;
141144

142145
/**
143146
* Reorder the z-domain data. For PFFFT_FORWARD, it reorders from the internal
@@ -148,7 +151,8 @@ void pffft_transform_ordered(const PFFFT_Setup *setup, const float *input, float
148151
*
149152
* The input and output parameters should not alias.
150153
*/
151-
void pffft_zreorder(const PFFFT_Setup *setup, const float *input, float *output, pffft_direction_t direction);
154+
void pffft_zreorder(const PFFFT_Setup *setup, const float *input, float *output,
155+
pffft_direction_t direction) noexcept NONBLOCKING;
152156

153157
/**
154158
* Perform a multiplication of the z-domain data in dft_a and dft_b, and scale
@@ -161,7 +165,8 @@ void pffft_zreorder(const PFFFT_Setup *setup, const float *input, float *output,
161165
*
162166
* The dft_a, dft_b, and dft_ab parameters may alias.
163167
*/
164-
void pffft_zconvolve_scale_accumulate(const PFFFT_Setup *setup, const float *dft_a, const float *dft_b, float *dft_ab, float scaling);
168+
void pffft_zconvolve_scale_accumulate(const PFFFT_Setup *setup, const float *dft_a,
169+
const float *dft_b, float *dft_ab, float scaling) noexcept NONBLOCKING;
165170

166171
/**
167172
* Perform a multiplication of the z-domain data in dft_a and dft_b, and
@@ -171,7 +176,8 @@ void pffft_zconvolve_scale_accumulate(const PFFFT_Setup *setup, const float *dft
171176
*
172177
* The dft_a, dft_b, and dft_ab parameters may alias.
173178
*/
174-
void pffft_zconvolve_accumulate(const PFFFT_Setup *setup, const float *dft_a, const float *dft_b, float *dft_ab);
179+
void pffft_zconvolve_accumulate(const PFFFT_Setup *setup, const float *dft_a, const float *dft_b,
180+
float *dft_ab) noexcept NONBLOCKING;
175181

176182

177183
struct PFFFTSetup {

0 commit comments

Comments
 (0)