Move the div operation out of the SIMD helper
This commit is contained in:
parent
4c3db6c2c8
commit
a5c72375a9
7 changed files with 44 additions and 24 deletions
|
|
@ -34,7 +34,7 @@ BENCHMARK_DEFINE_F(MeanSquaredArray, Scalar)
|
|||
(benchmark::State& state)
|
||||
{
|
||||
for (auto _ : state) {
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::meanSquared, false);
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::sumSquares, false);
|
||||
auto result = sfz::meanSquared<float>(input);
|
||||
benchmark::DoNotOptimize(result);
|
||||
}
|
||||
|
|
@ -44,7 +44,7 @@ BENCHMARK_DEFINE_F(MeanSquaredArray, SIMD)
|
|||
(benchmark::State& state)
|
||||
{
|
||||
for (auto _ : state) {
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::meanSquared, true);
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::sumSquares, true);
|
||||
auto result = sfz::meanSquared<float>(input);
|
||||
benchmark::DoNotOptimize(result);
|
||||
}
|
||||
|
|
@ -54,7 +54,7 @@ BENCHMARK_DEFINE_F(MeanSquaredArray, Scalar_Unaligned)
|
|||
(benchmark::State& state)
|
||||
{
|
||||
for (auto _ : state) {
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::meanSquared, false);
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::sumSquares, false);
|
||||
auto result = sfz::meanSquared<float>(absl::MakeSpan(input).subspan(1));
|
||||
benchmark::DoNotOptimize(result);
|
||||
}
|
||||
|
|
@ -64,7 +64,7 @@ BENCHMARK_DEFINE_F(MeanSquaredArray, SIMD_Unaligned)
|
|||
(benchmark::State& state)
|
||||
{
|
||||
for (auto _ : state) {
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::meanSquared, true);
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::sumSquares, true);
|
||||
auto result = sfz::meanSquared<float>(absl::MakeSpan(input).subspan(1));
|
||||
benchmark::DoNotOptimize(result);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ struct SIMDDispatch {
|
|||
decltype(&cumsumScalar<T>) cumsum = &cumsumScalar<T>;
|
||||
decltype(&diffScalar<T>) diff = &diffScalar<T>;
|
||||
decltype(&meanScalar<T>) mean = &meanScalar<T>;
|
||||
decltype(&meanSquaredScalar<T>) meanSquared = &meanSquaredScalar<T>;
|
||||
decltype(&sumSquaresScalar<T>) sumSquares = &sumSquaresScalar<T>;
|
||||
decltype(&clampAllScalar<T>) clampAll = &clampAllScalar<T>;
|
||||
decltype(&allWithinScalar<T>) allWithin = &allWithinScalar<T>;
|
||||
|
||||
|
|
@ -85,7 +85,7 @@ void SIMDDispatch<float>::setStatus(SIMDOps op, bool enable)
|
|||
SIMD_OP(cumsum)
|
||||
SIMD_OP(diff)
|
||||
SIMD_OP(mean)
|
||||
SIMD_OP(meanSquared)
|
||||
SIMD_OP(sumSquares)
|
||||
SIMD_OP(clampAll)
|
||||
SIMD_OP(allWithin)
|
||||
}
|
||||
|
|
@ -122,7 +122,7 @@ void SIMDDispatch<float>::setStatus(SIMDOps op, bool enable)
|
|||
SIMD_OP(cumsum)
|
||||
SIMD_OP(diff)
|
||||
SIMD_OP(mean)
|
||||
SIMD_OP(meanSquared)
|
||||
SIMD_OP(sumSquares)
|
||||
SIMD_OP(clampAll)
|
||||
SIMD_OP(allWithin)
|
||||
}
|
||||
|
|
@ -163,7 +163,7 @@ void SIMDDispatch<float>::resetStatus()
|
|||
setStatus(SIMDOps::diff, false);
|
||||
setStatus(SIMDOps::sfzInterpolationCast, true);
|
||||
setStatus(SIMDOps::mean, false);
|
||||
setStatus(SIMDOps::meanSquared, false);
|
||||
setStatus(SIMDOps::sumSquares, false);
|
||||
setStatus(SIMDOps::upsampling, true);
|
||||
setStatus(SIMDOps::clampAll, false);
|
||||
setStatus(SIMDOps::allWithin, true);
|
||||
|
|
@ -292,9 +292,9 @@ float mean<float>(const float* vector, unsigned size) noexcept
|
|||
}
|
||||
|
||||
template <>
|
||||
float meanSquared<float>(const float* vector, unsigned size) noexcept
|
||||
float sumSquares<float>(const float* vector, unsigned size) noexcept
|
||||
{
|
||||
return simdDispatch<float>().meanSquared(vector, size);
|
||||
return simdDispatch<float>().sumSquares(vector, size);
|
||||
}
|
||||
|
||||
template <>
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ enum class SIMDOps {
|
|||
diff,
|
||||
sfzInterpolationCast,
|
||||
mean,
|
||||
meanSquared,
|
||||
sumSquares,
|
||||
upsampling,
|
||||
clampAll,
|
||||
allWithin,
|
||||
|
|
@ -515,7 +515,7 @@ T mean(absl::Span<const T> vector) noexcept
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Computes the mean squared of a span
|
||||
* @brief Computes the sum of squares of a span
|
||||
*
|
||||
* @tparam T the underlying type
|
||||
* @tparam SIMD use the SIMD version or the scalar version
|
||||
|
|
@ -523,13 +523,33 @@ T mean(absl::Span<const T> vector) noexcept
|
|||
* @return T
|
||||
*/
|
||||
template <class T>
|
||||
T meanSquared(const T* vector, unsigned size) noexcept
|
||||
T sumSquares(const T* vector, unsigned size) noexcept
|
||||
{
|
||||
meanSquaredScalar(vector, size);
|
||||
return sumSquaresScalar(vector, size);
|
||||
}
|
||||
|
||||
template <>
|
||||
float meanSquared<float>(const float* vector, unsigned size) noexcept;
|
||||
float sumSquares<float>(const float* vector, unsigned size) noexcept;
|
||||
|
||||
template <class T>
|
||||
T sumSquares(absl::Span<const T> vector) noexcept
|
||||
{
|
||||
return sumSquares(vector.data(), vector.size());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Computes the mean squared of a span
|
||||
*
|
||||
* @tparam T the underlying type
|
||||
* @param vector
|
||||
* @return T
|
||||
*/
|
||||
template <class T>
|
||||
T meanSquared(const T* vector, unsigned size) noexcept
|
||||
{
|
||||
T sum = sumSquares(vector, size);
|
||||
return sum / size;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
T meanSquared(absl::Span<const T> vector) noexcept
|
||||
|
|
|
|||
|
|
@ -370,7 +370,7 @@ float meanSSE(const float* vector, unsigned size) noexcept
|
|||
return result / static_cast<float>(size);
|
||||
}
|
||||
|
||||
float meanSquaredSSE(const float* vector, unsigned size) noexcept
|
||||
float sumSquaresSSE(const float* vector, unsigned size) noexcept
|
||||
{
|
||||
const auto sentinel = vector + size;
|
||||
|
||||
|
|
@ -404,7 +404,7 @@ float meanSquaredSSE(const float* vector, unsigned size) noexcept
|
|||
vector++;
|
||||
}
|
||||
|
||||
return result / static_cast<float>(size);
|
||||
return result;
|
||||
}
|
||||
|
||||
void cumsumSSE(const float* input, float* output, unsigned size) noexcept
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ void subtractSSE(const float* input, float* output, unsigned size) noexcept;
|
|||
void subtract1SSE(float value, float* output, unsigned size) noexcept;
|
||||
void copySSE(const float* input, float* output, unsigned size) noexcept;
|
||||
float meanSSE(const float* vector, unsigned size) noexcept;
|
||||
float meanSquaredSSE(const float* vector, unsigned size) noexcept;
|
||||
float sumSquaresSSE(const float* vector, unsigned size) noexcept;
|
||||
void cumsumSSE(const float* input, float* output, unsigned size) noexcept;
|
||||
void diffSSE(const float* input, float* output, unsigned size) noexcept;
|
||||
void clampAllSSE(float* input, float low, float high, unsigned size) noexcept;
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ T meanScalar(const T* vector, unsigned size) noexcept
|
|||
}
|
||||
|
||||
template <class T>
|
||||
T meanSquaredScalar(const T* vector, unsigned size) noexcept
|
||||
T sumSquaresScalar(const T* vector, unsigned size) noexcept
|
||||
{
|
||||
T result{ 0.0 };
|
||||
if (size == 0)
|
||||
|
|
@ -154,7 +154,7 @@ T meanSquaredScalar(const T* vector, unsigned size) noexcept
|
|||
vector++;
|
||||
}
|
||||
|
||||
return result / static_cast<T>(size);
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
|
|
|
|||
|
|
@ -690,9 +690,9 @@ TEST_CASE("[Helpers] Mean (SIMD vs scalar)")
|
|||
TEST_CASE("[Helpers] Mean Squared")
|
||||
{
|
||||
std::array<float, 10> input { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f };
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::meanSquared, false);
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::sumSquares, false);
|
||||
REQUIRE(sfz::meanSquared<float>(input) == 38.5f);
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::meanSquared, true);
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::sumSquares, true);
|
||||
REQUIRE(sfz::meanSquared<float>(input) == 38.5f);
|
||||
}
|
||||
|
||||
|
|
@ -700,9 +700,9 @@ TEST_CASE("[Helpers] Mean Squared (SIMD vs scalar)")
|
|||
{
|
||||
std::vector<float> input(medBufferSize);
|
||||
absl::c_iota(input, 0.0f);
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::meanSquared, false);
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::sumSquares, false);
|
||||
auto scalarResult = sfz::meanSquared<float>(input);
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::meanSquared, true);
|
||||
sfz::setSIMDOpStatus<float>(sfz::SIMDOps::sumSquares, true);
|
||||
auto simdResult = sfz::meanSquared<float>(input);
|
||||
REQUIRE( scalarResult == Approx(simdResult).margin(1e-3) );
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue