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 051ff21..422f238 100644 --- a/VectorisationWrappers/Accelerate/AccelerateUtilities.h +++ b/VectorisationWrappers/Accelerate/AccelerateUtilities.h @@ -5,38 +5,38 @@ namespace Vectorised::Utilities { template - static void scalerMultiplication (T* InputBuffer, T* OutputBuffer, const int BufferSize, const int InputStride = 1, const int OutputStride = 1) + 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 (InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); + vDSP_vsmul (InputBuffer, InputStride, &ScalarValue, OutputBuffer, OutputStride, BufferSize); else if constexpr (std::is_same_v) - VDSP_vscalD (InputBuffer, InputStride, OutputBuffer, OutputStride, BufferSize); + 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) { 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* 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_vclr (Buffer, BufferStride, BufferSize); if constexpr (std::is_same_v) - vdsp_vzeroD (ValueToFill, 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 new file mode 100644 index 0000000..0994c08 --- /dev/null +++ b/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp @@ -0,0 +1,62 @@ +#include +#include "Accelerate/AccelerateUtilities.h" +#include +#include + +TEMPLATE_TEST_CASE("Accelerate Utils Unit Testing", "[Accelerate U]", float, double) +{ + using T = TestType; + + 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") + { + 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") + { + T valueToFill = 1.0; + 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); + + for (const auto& Value : inputBuffer) + { + REQUIRE (Value == static_cast(0)); + } + } + + 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