From cc7c2050eb2a790b6bece09287c3b6d0921779bb Mon Sep 17 00:00:00 2001 From: Kristian McGurran Date: Wed, 25 Jun 2025 08:23:40 +0100 Subject: [PATCH 1/4] Adding basic test template & fixing function variable name --- .../Accelerate/AccelerateUtilities.h | 6 ++-- .../AccelerateUtilitiesUnitTests.cpp | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp diff --git a/VectorisationWrappers/Accelerate/AccelerateUtilities.h b/VectorisationWrappers/Accelerate/AccelerateUtilities.h index 051ff21..e1c62d1 100644 --- a/VectorisationWrappers/Accelerate/AccelerateUtilities.h +++ b/VectorisationWrappers/Accelerate/AccelerateUtilities.h @@ -32,11 +32,11 @@ namespace Vectorised::Utilities } template - static void zeroBuffer (T* ValueToFill, const int BufferSize, const int BufferStride = 1) + static void zeroBuffer (T* Buffer, const int BufferSize, const int BufferStride = 1) { if constexpr (std::is_same_v) - vdsp_vzero (ValueToFill, BufferStride, BufferSize); + vdsp_vzero (Buffer, BufferStride, BufferSize); if constexpr (std::is_same_v) - vdsp_vzeroD (ValueToFill, BufferStride, BufferSize); + vdsp_vzeroD (Buffer, BufferStride, BufferSize); } }; \ No newline at end of file diff --git a/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp b/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp new file mode 100644 index 0000000..3c24b74 --- /dev/null +++ b/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp @@ -0,0 +1,33 @@ +#include "Accelerate/AccelerateUtilities.h" +#include +#include + +TEMPLATE_TEST_CASE("Accelerate Ranges Unit Tests", "[Accelerate Ranges]", float, double) +{ + using T = TestType; + + std::vector inputBuffer; + std::vector outputBuffer; + + + + SECTION("Accelerate Abs Values") + { } + + SECTION ("Accelerate Fill Buffer") + { + T valueToFill = 1.0; + Vectorised::Utilities::fillBuffer (&valueToFill, inputBuffer.data(), 256); + } + + SECTION ("Accelerate Zero Buffer") + { + + Vectorised::Utilities::zeroBuffer (inputBuffer.data(), 256); + } + + SECTION ("Accelerate Scale Buffer") + { + Vectorised::Utilities::scalerMultiplication (inputBuffer.data(), outputBuffer.data(), 256); + } +} \ No newline at end of file From 376feb645d04cfa4220144219f7c94427b682237 Mon Sep 17 00:00:00 2001 From: Kristian McGurran Date: Wed, 25 Jun 2025 19:14:05 +0100 Subject: [PATCH 2/4] Adding test checks --- .../AccelerateUtilitiesUnitTests.cpp | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp b/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp index 3c24b74..cdaf6be 100644 --- a/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp +++ b/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp @@ -6,9 +6,13 @@ TEMPLATE_TEST_CASE("Accelerate Ranges Unit Tests", "[Accelerate Ranges]", float, { using T = TestType; - std::vector inputBuffer; - std::vector outputBuffer; + constexpr auto bufferSize = 1024; + std::vector inputBuffer (bufferSize); + std::vector outputBuffer (bufferSize); + + inputBuffer.assign (bufferSize, static_cast(0)); + outputBuffer.assign (bufferSize, static_cast(2)); SECTION("Accelerate Abs Values") @@ -17,17 +21,26 @@ TEMPLATE_TEST_CASE("Accelerate Ranges Unit Tests", "[Accelerate Ranges]", float, SECTION ("Accelerate Fill Buffer") { T valueToFill = 1.0; - Vectorised::Utilities::fillBuffer (&valueToFill, inputBuffer.data(), 256); + Vectorised::Utilities::fillBuffer (&valueToFill, inputBuffer.data(), bufferSize); + + for (const auto& Value : inputBuffer) + { + REQUIRE (Value == valueToFill); + } } SECTION ("Accelerate Zero Buffer") { + Vectorised::Utilities::zeroBuffer (outputBuffer.data(), bufferSize); - Vectorised::Utilities::zeroBuffer (inputBuffer.data(), 256); + for (const auto& Value : inputBuffer) + { + REQUIRE (Value == static_cast(0)); + } } SECTION ("Accelerate Scale Buffer") { - Vectorised::Utilities::scalerMultiplication (inputBuffer.data(), outputBuffer.data(), 256); + // Vectorised::Utilities::scalerMultiplication (inputBuffer.data(), outputBuffer.data(), 256); } } \ No newline at end of file From 0c75d7fae1a8b54322ba5336cfaf63ca4787bb4e Mon Sep 17 00:00:00 2001 From: Kristian McGurran Date: Thu, 26 Jun 2025 08:35:39 +0100 Subject: [PATCH 3/4] Vectorised Unit tests: Adding utilities .cpp --- CMakeLists.txt | 1 + .../Accelerate/AccelerateUtilities.h | 28 +++++++++---------- .../Accelerate/AccelerateWrapper.h | 18 ------------ .../AccelerateRangeUnitTests.cpp | 1 + .../AccelerateUtilitiesUnitTests.cpp | 28 +++++++++++++++---- 5 files changed, 38 insertions(+), 38 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 628787b..9f8f97d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ if (APPLE) VectorisationWrappers/Accelerate/AccelerateRange.h VectorisationWrappers/Accelerate/AccelerateUtilities.h VectorisationWrappers/AccelerateWrapperUnitTests.cpp + VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp VectorisationWrappers/AccelerateRangeUnitTests.cpp) target_link_libraries (accelerate_DSP PRIVATE Catch2::Catch2WithMain "$") diff --git a/VectorisationWrappers/Accelerate/AccelerateUtilities.h b/VectorisationWrappers/Accelerate/AccelerateUtilities.h index e1c62d1..90aee69 100644 --- a/VectorisationWrappers/Accelerate/AccelerateUtilities.h +++ b/VectorisationWrappers/Accelerate/AccelerateUtilities.h @@ -4,39 +4,39 @@ // VDSP wrapper namespace in a vectorised way namespace Vectorised::Utilities { - template - static void scalerMultiplication (T* InputBuffer, T* OutputBuffer, const int BufferSize, const int InputStride = 1, const int OutputStride = 1) - { - if constexpr (std::is_same_v) - VDSP_vscal (InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); - else if constexpr (std::is_same_v) - VDSP_vscalD (InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); - } + // template + // static void scalerMultiplication (const T* InputBuffer, T* OutputBuffer, const int BufferSize, T& ScalarValue, const int InputStride = 1, const int OutputStride = 1) + // { + // if constexpr (std::is_same_v) + // vDSP_vscal (&ScalarValue, InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); + // else if constexpr (std::is_same_v) + // vDSP_vscalD (&ScalarValue, InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); + // } template static void absBuffer (T* InputBuffer, T* OutputBuffer, const int BufferSize, const int InputStride = 1, const int OutputStride = 1) { if constexpr (std::is_same_v) - vDSP_abs (InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); + vDSP_vabs (InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); else if constexpr (std::is_same_v) - vDSP_absD (InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); + vDSP_vabsD (InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); } template static void fillBuffer (T* ValueToFill, T* Buffer, const int BufferSize, const int BufferStride = 1) { if constexpr (std::is_same_v) - VDSP_vfill (ValueToFill, Buffer, BufferStride, BufferSize); + vDSP_vfill (ValueToFill, Buffer, BufferStride, BufferSize); else if constexpr (std::is_same_v) - VDSP_vfill (ValueToFill, Buffer, BufferStride, BufferSize); + vDSP_vfillD (ValueToFill, Buffer, BufferStride, BufferSize); } template static void zeroBuffer (T* Buffer, const int BufferSize, const int BufferStride = 1) { if constexpr (std::is_same_v) - vdsp_vzero (Buffer, BufferStride, BufferSize); + vDSP_vclr (Buffer, BufferStride, BufferSize); if constexpr (std::is_same_v) - vdsp_vzeroD (Buffer, BufferStride, BufferSize); + vDSP_vclrD (Buffer, BufferStride, BufferSize); } }; \ No newline at end of file diff --git a/VectorisationWrappers/Accelerate/AccelerateWrapper.h b/VectorisationWrappers/Accelerate/AccelerateWrapper.h index 76e3529..53af170 100644 --- a/VectorisationWrappers/Accelerate/AccelerateWrapper.h +++ b/VectorisationWrappers/Accelerate/AccelerateWrapper.h @@ -41,24 +41,6 @@ namespace Vectorised static_assert (sizeof(T) == 0, "Unsupported type for addition"); } - template - static void scalerMultiplication (T* InputBuffer, T* OutputBuffer, const int BufferSize, const int InputStride = 1, const int OutputStride = 1) - { - if constexpr (std::is_same_v) - VDSP_vscal (InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); - else if constexpr (std::is_same_v) - VDSP_vscalD (InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); - } - - template - static void fillBuffer (T* ValueToFill, T* Buffer, const int BufferSize, const int BufferStride = 1) - { - if constexpr (std::is_same_v) - VDSP_vfill (ValueToFill, Buffer, BufferStride, BufferSize); - else if constexpr (std::is_same_v) - VDSP_vfill (ValueToFill, Buffer, BufferStride, BufferSize); - } - template static void divisionVectorised (T* OutputPtr, T* InputPtr, const int BufferSize) { diff --git a/VectorisationWrappers/AccelerateRangeUnitTests.cpp b/VectorisationWrappers/AccelerateRangeUnitTests.cpp index f840aa4..f8845c9 100644 --- a/VectorisationWrappers/AccelerateRangeUnitTests.cpp +++ b/VectorisationWrappers/AccelerateRangeUnitTests.cpp @@ -1,5 +1,6 @@ #include #include "Accelerate/AccelerateRange.h" +#include "Accelerate/AccelerateUtilities.h" #include #include diff --git a/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp b/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp index cdaf6be..cd1cb1b 100644 --- a/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp +++ b/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp @@ -1,8 +1,9 @@ +#include #include "Accelerate/AccelerateUtilities.h" #include #include -TEMPLATE_TEST_CASE("Accelerate Ranges Unit Tests", "[Accelerate Ranges]", float, double) +TEMPLATE_TEST_CASE("Accelerate Utils Unit Testing", "[Accelerate U]", float, double) { using T = TestType; @@ -16,7 +17,15 @@ TEMPLATE_TEST_CASE("Accelerate Ranges Unit Tests", "[Accelerate Ranges]", float, SECTION("Accelerate Abs Values") - { } + { + inputBuffer.assign (bufferSize, static_cast(-1)); + Vectorised::Utilities::absBuffer (inputBuffer.data(), outputBuffer.data(), bufferSize); + + for (const auto& value : outputBuffer) + { + REQUIRE (value == static_cast(1)); + } + } SECTION ("Accelerate Fill Buffer") { @@ -39,8 +48,15 @@ TEMPLATE_TEST_CASE("Accelerate Ranges Unit Tests", "[Accelerate Ranges]", float, } } - SECTION ("Accelerate Scale Buffer") - { - // Vectorised::Utilities::scalerMultiplication (inputBuffer.data(), outputBuffer.data(), 256); - } + // SECTION ("Accelerate Scale Buffer") + // { + // const auto scalarValue = static_cast(2); + // inputBuffer.assign (bufferSize, static_cast(1)); + // Vectorised::Utilities::scalerMultiplication (inputBuffer.data(), outputBuffer.data(), bufferSize, scalarValue); + // + // for (const auto& Value : outputBuffer) + // { + // REQUIRE (Value == 1); + // } + // } } \ No newline at end of file From aa0452f1f12f80dec8f4499939662fa9fcd98332 Mon Sep 17 00:00:00 2001 From: Kristian McGurran Date: Thu, 26 Jun 2025 09:02:19 +0100 Subject: [PATCH 4/4] Fixing Scaler vectorisation function --- .../Accelerate/AccelerateUtilities.h | 16 +++++++------- .../AccelerateUtilitiesUnitTests.cpp | 22 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/VectorisationWrappers/Accelerate/AccelerateUtilities.h b/VectorisationWrappers/Accelerate/AccelerateUtilities.h index 90aee69..422f238 100644 --- a/VectorisationWrappers/Accelerate/AccelerateUtilities.h +++ b/VectorisationWrappers/Accelerate/AccelerateUtilities.h @@ -4,14 +4,14 @@ // VDSP wrapper namespace in a vectorised way namespace Vectorised::Utilities { - // template - // static void scalerMultiplication (const T* InputBuffer, T* OutputBuffer, const int BufferSize, T& ScalarValue, const int InputStride = 1, const int OutputStride = 1) - // { - // if constexpr (std::is_same_v) - // vDSP_vscal (&ScalarValue, InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); - // else if constexpr (std::is_same_v) - // vDSP_vscalD (&ScalarValue, InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); - // } + template + static void scalerMultiplication (const T* InputBuffer, T* OutputBuffer, const int BufferSize, T& ScalarValue, const int InputStride = 1, const int OutputStride = 1) + { + if constexpr (std::is_same_v) + vDSP_vsmul (InputBuffer, InputStride, &ScalarValue, OutputBuffer, OutputStride, BufferSize); + else if constexpr (std::is_same_v) + vDSP_vsmulD (InputBuffer, InputStride, &ScalarValue, OutputBuffer, OutputStride, BufferSize); + } template static void absBuffer (T* InputBuffer, T* OutputBuffer, const int BufferSize, const int InputStride = 1, const int OutputStride = 1) diff --git a/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp b/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp index cd1cb1b..0994c08 100644 --- a/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp +++ b/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp @@ -48,15 +48,15 @@ TEMPLATE_TEST_CASE("Accelerate Utils Unit Testing", "[Accelerate U]", float, dou } } - // SECTION ("Accelerate Scale Buffer") - // { - // const auto scalarValue = static_cast(2); - // inputBuffer.assign (bufferSize, static_cast(1)); - // Vectorised::Utilities::scalerMultiplication (inputBuffer.data(), outputBuffer.data(), bufferSize, scalarValue); - // - // for (const auto& Value : outputBuffer) - // { - // REQUIRE (Value == 1); - // } - // } + SECTION ("Accelerate Scale Buffer") + { + auto scalarValue = static_cast(2); + inputBuffer.assign (bufferSize, static_cast(1)); + Vectorised::Utilities::scalerMultiplication (inputBuffer.data(), outputBuffer.data(), bufferSize, scalarValue); + + for (const auto& Value : outputBuffer) + { + REQUIRE (Value == 2); + } + } } \ No newline at end of file