diff --git a/CMakeLists.txt b/CMakeLists.txt index 78f4cec..882dcab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,18 +1,19 @@ cmake_minimum_required (VERSION 3.25) -project (WRAPPER DESCRIPTION "Vectoisation Wrapper with Unit tested" LANGUAGES CXX) +project (WRAPPER DESCRIPTION "Vectorisation Wrapper with Unit tested" LANGUAGES CXX) set (CMAKE_CXX_STANDARD 23) add_subdirectory (Catch2) if (APPLE) - add_executable (accelerate_DSP VectorisationWrappers/Accelerate/AccelerateArithmetic.h - VectorisationWrappers/Accelerate/AccelerateRange.h - VectorisationWrappers/Accelerate/AccelerateUtilities.h - VectorisationWrappers/AccelerateArithmeticUnitTests.cpp - VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp - VectorisationWrappers/AccelerateRangeUnitTests.cpp) + set (ACCELERATE_SOURCES VectorisationWrappers/Accelerate/AccelerateWrapper.cpp + VectorisationWrappers/Accelerate/Tests/AccelerateArithmeticUnitTests.cpp + VectorisationWrappers/Accelerate/Tests/AccelerateUtilitiesUnitTests.cpp + VectorisationWrappers/Accelerate/Tests/AccelerateRangeUnitTests.cpp + VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp) + + add_executable(accelerate_DSP ${ACCELERATE_SOURCES}) target_link_libraries (accelerate_DSP PRIVATE Catch2::Catch2WithMain "$") -ELSEIF (MSVC) - message ("No Wrapper is availble") -ENDIF() \ No newline at end of file +elseif (MSVC) + message ("No Wrapper") +endif() \ No newline at end of file diff --git a/VectorisationWrappers/Accelerate/AccelerateArithmetic.h b/VectorisationWrappers/Accelerate/AccelerateArithmetic.h index 4f5572c..1e8a206 100644 --- a/VectorisationWrappers/Accelerate/AccelerateArithmetic.h +++ b/VectorisationWrappers/Accelerate/AccelerateArithmetic.h @@ -1,8 +1,5 @@ #pragma once -#include - -// VDSP wrapper namespace in a vectorised way namespace Vectorised { // Vectorised Addition function for VDSP @@ -49,41 +46,4 @@ namespace Vectorised else if constexpr (std::is_same_v) vvdiv (OutputBuffer, BufferA, BufferB, &BufferSize); } - - - // Vectorised tanh function for VDSP - template - static void tanhVectorised (const T* InputBuffer, T* OutputBuffer, const int BufferSize) - { - if constexpr (std::is_same_v) - vvtanhf (OutputBuffer, InputBuffer, &BufferSize); - else if constexpr (std::is_same_v) - vvtanh (OutputBuffer, InputBuffer, &BufferSize); - else - static_assert (sizeof(T) == 0, "Unsupported type for tanh"); - } - - // Vectorised tanh function for hard clipping - template - static void hardClipVectorised(const T* InputBuffer, T* OutputBuffer, const int BufferSize, const T* ClipLowerLimit, const T* ClipUpperLimit) - { - if constexpr (std::is_same_v) - vDSP_vclip(InputBuffer, 1, ClipLowerLimit, ClipUpperLimit, OutputBuffer, 1, BufferSize); - else if constexpr (std::is_same_v) - vDSP_vclipD(InputBuffer, 1, ClipLowerLimit, ClipUpperLimit, OutputBuffer, 1, BufferSize); - else - static_assert (sizeof(T) == 0, "Unsupported type for hard clipping"); - } - - // Vectorised tanh function for sine - template - static void sineVectorised (T* InputBuffer, const int BufferSize) - { - if constexpr (std::is_same_v) - vvsinf (InputBuffer, InputBuffer, &BufferSize); - else if constexpr (std::is_same_v) - vvsin (InputBuffer, InputBuffer, &BufferSize); - else - static_assert (sizeof(T) == 0, "Unsupported type for sine"); - } }; \ No newline at end of file diff --git a/VectorisationWrappers/Accelerate/AccelerateRange.h b/VectorisationWrappers/Accelerate/AccelerateRange.h index 9b5f9ce..323cd90 100644 --- a/VectorisationWrappers/Accelerate/AccelerateRange.h +++ b/VectorisationWrappers/Accelerate/AccelerateRange.h @@ -1,6 +1,4 @@ #pragma once -#include -#include namespace Vectorised::Range { diff --git a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h new file mode 100644 index 0000000..752698c --- /dev/null +++ b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h @@ -0,0 +1,39 @@ +#pragma once + +namespace Vectorised::Trigonometry +{ + template + static void tanhVectorised (const T* WorkBuffer, T* OutputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvtanhf (OutputBuffer, WorkBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvtanh (OutputBuffer, WorkBuffer, &BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for tanh"); + } + + // Vectorised tanh function for hard clipping + template + static void hardClipVectorised(const T* InputBuffer, T* OutputBuffer, const int BufferSize, const T* ClipLowerLimit, const T* ClipUpperLimit) + { + if constexpr (std::is_same_v) + vDSP_vclip(InputBuffer, 1, ClipLowerLimit, ClipUpperLimit, OutputBuffer, 1, BufferSize); + else if constexpr (std::is_same_v) + vDSP_vclipD(InputBuffer, 1, ClipLowerLimit, ClipUpperLimit, OutputBuffer, 1, BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for hard clipping"); + } + + // Vectorised tanh function for sine + template + static void sineVectorised (T* InputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvsinf (InputBuffer, InputBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvsin (InputBuffer, InputBuffer, &BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for sine"); + } +} \ No newline at end of file diff --git a/VectorisationWrappers/Accelerate/AccelerateUtilities.h b/VectorisationWrappers/Accelerate/AccelerateUtilities.h index 422f238..af4562b 100644 --- a/VectorisationWrappers/Accelerate/AccelerateUtilities.h +++ b/VectorisationWrappers/Accelerate/AccelerateUtilities.h @@ -1,7 +1,5 @@ #pragma once -#include -// VDSP wrapper namespace in a vectorised way namespace Vectorised::Utilities { template diff --git a/VectorisationWrappers/Accelerate/AccelerateWrapper.cpp b/VectorisationWrappers/Accelerate/AccelerateWrapper.cpp index 5d0e7b4..d5fc61e 100644 --- a/VectorisationWrappers/Accelerate/AccelerateWrapper.cpp +++ b/VectorisationWrappers/Accelerate/AccelerateWrapper.cpp @@ -1,3 +1,5 @@ // -// Created by Kristian Mc Gurran on 12/06/2025. +// Including all the header files // + +#include "AccelerateWrapper.h" \ No newline at end of file diff --git a/VectorisationWrappers/Accelerate/AccelerateWrapper.h b/VectorisationWrappers/Accelerate/AccelerateWrapper.h new file mode 100644 index 0000000..39ed8be --- /dev/null +++ b/VectorisationWrappers/Accelerate/AccelerateWrapper.h @@ -0,0 +1,12 @@ +// +// Including all the header files +// + +#pragma once + +#include +#include +#include "AccelerateArithmetic.h" +#include "AccelerateRange.h" +#include "AccelerateTrigonometry.h" +#include "AccelerateUtilities.h" diff --git a/VectorisationWrappers/AccelerateArithmeticUnitTests.cpp b/VectorisationWrappers/Accelerate/Tests/AccelerateArithmeticUnitTests.cpp similarity index 76% rename from VectorisationWrappers/AccelerateArithmeticUnitTests.cpp rename to VectorisationWrappers/Accelerate/Tests/AccelerateArithmeticUnitTests.cpp index d948e61..e2ad059 100644 --- a/VectorisationWrappers/AccelerateArithmeticUnitTests.cpp +++ b/VectorisationWrappers/Accelerate/Tests/AccelerateArithmeticUnitTests.cpp @@ -1,6 +1,6 @@ // Unit tests for VDSP WRAPPER -#include "Accelerate/AccelerateArithmetic.h" +#include "../AccelerateWrapper.h" #include #include @@ -64,22 +64,4 @@ TEMPLATE_TEST_CASE ("VDSP wrapper testing", "[VDSP Wrapper]", float, double) REQUIRE (value == static_cast(1)); } } - - // SECTION ("Division Test") - // { - // Vectorised::tanhVectorised (input.data(), output.data(), 256); - // } - // - // SECTION ("Division Test") - // { - // Vectorised::sineVectorised (input.data(), 256); - // } - // - // SECTION ("Division Test") - // { - // const auto lowerLimit = -1.f; - // const auto upperLimit = -1.f; - // - // Vectorised::hardClipVectorised (input.data(), output.data(), 256, &lowerLimit, &upperLimit); - // } } \ No newline at end of file diff --git a/VectorisationWrappers/AccelerateRangeUnitTests.cpp b/VectorisationWrappers/Accelerate/Tests/AccelerateRangeUnitTests.cpp similarity index 92% rename from VectorisationWrappers/AccelerateRangeUnitTests.cpp rename to VectorisationWrappers/Accelerate/Tests/AccelerateRangeUnitTests.cpp index f8845c9..ff3afe0 100644 --- a/VectorisationWrappers/AccelerateRangeUnitTests.cpp +++ b/VectorisationWrappers/Accelerate/Tests/AccelerateRangeUnitTests.cpp @@ -1,6 +1,4 @@ -#include -#include "Accelerate/AccelerateRange.h" -#include "Accelerate/AccelerateUtilities.h" +#include "../AccelerateWrapper.h" #include #include diff --git a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp new file mode 100644 index 0000000..a22fa08 --- /dev/null +++ b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp @@ -0,0 +1,62 @@ +#include "../AccelerateWrapper.h" +#include +#include +#include +#include + +TEMPLATE_TEST_CASE("Accelerate Trigonometry Unit Testing", "[Accelerate Trigonometry]", float, double) +{ + using T = TestType; + + constexpr auto bufferSize = 1024; + + std::vector workingBuffer (bufferSize); + workingBuffer.assign (bufferSize, static_cast(1)); + + SECTION ("Sine Function Tests") + { + auto sinValue = static_cast (std::sin (1.f)); + + Vectorised::Trigonometry::sineVectorised (workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (sinValue)); + } + } + + SECTION ("Tanh Function Tests") + { + workingBuffer.assign (bufferSize, static_cast (10)); + const auto tanhValue = static_cast (std::tanh (10.f)); + + Vectorised::Trigonometry::tanhVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (tanhValue)); + } + } + + SECTION ("Sigmud Function Tests") + { + const auto minValue = static_cast(-1); + const auto maxValue = static_cast(1); + + workingBuffer.assign (bufferSize, static_cast (-10)); + Vectorised::Trigonometry::hardClipVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize, &minValue, &maxValue); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (minValue)); + } + + workingBuffer.assign (bufferSize, static_cast (10)); + Vectorised::Trigonometry::hardClipVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize, &minValue, &maxValue); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (maxValue)); + } + } +} \ No newline at end of file diff --git a/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp b/VectorisationWrappers/Accelerate/Tests/AccelerateUtilitiesUnitTests.cpp similarity index 95% rename from VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp rename to VectorisationWrappers/Accelerate/Tests/AccelerateUtilitiesUnitTests.cpp index 0994c08..ec826de 100644 --- a/VectorisationWrappers/AccelerateUtilitiesUnitTests.cpp +++ b/VectorisationWrappers/Accelerate/Tests/AccelerateUtilitiesUnitTests.cpp @@ -1,5 +1,4 @@ -#include -#include "Accelerate/AccelerateUtilities.h" +#include "../AccelerateWrapper.h" #include #include