From 10aec5d6fcaf08d216f43c3ad1ca47705be080a8 Mon Sep 17 00:00:00 2001 From: Kristian McGurran Date: Fri, 27 Jun 2025 17:08:41 +0100 Subject: [PATCH 1/7] Adding cos with basic tests --- .../Accelerate/AccelerateTrigonometry.h | 18 ++++++++++++++---- .../Tests/AccelerateTrigonometryUnitTests.cpp | 14 +++++++++++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h index 752698c..e7b5788 100644 --- a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h +++ b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h @@ -25,14 +25,24 @@ namespace Vectorised::Trigonometry static_assert (sizeof(T) == 0, "Unsupported type for hard clipping"); } - // Vectorised tanh function for sine template - static void sineVectorised (T* InputBuffer, const int BufferSize) + static void sineVectorised (const T* InputBuffer, T* OutputBuffer,const int BufferSize) { if constexpr (std::is_same_v) - vvsinf (InputBuffer, InputBuffer, &BufferSize); + vvsinf (OutputBuffer, InputBuffer, &BufferSize); else if constexpr (std::is_same_v) - vvsin (InputBuffer, InputBuffer, &BufferSize); + vvsin (OutputBuffer, InputBuffer, &BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for sine"); + } + + template + static void cosVectorised (const T* InputBuffer, T* OutputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvcosf (OutputBuffer, InputBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvcos (OutputBuffer, InputBuffer, &BufferSize); else static_assert (sizeof(T) == 0, "Unsupported type for sine"); } diff --git a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp index a22fa08..b77ed70 100644 --- a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp +++ b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp @@ -17,7 +17,7 @@ TEMPLATE_TEST_CASE("Accelerate Trigonometry Unit Testing", "[Accelerate Trigonom { auto sinValue = static_cast (std::sin (1.f)); - Vectorised::Trigonometry::sineVectorised (workingBuffer.data(), bufferSize); + Vectorised::Trigonometry::sineVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); for (const auto& value : workingBuffer) { @@ -25,6 +25,18 @@ TEMPLATE_TEST_CASE("Accelerate Trigonometry Unit Testing", "[Accelerate Trigonom } } + SECTION ("Cos Function Tests") + { + auto cosValue = static_cast (std::cos (1.f)); + + Vectorised::Trigonometry::cosVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (cosValue)); + } + } + SECTION ("Tanh Function Tests") { workingBuffer.assign (bufferSize, static_cast (10)); From 1e3cdd387afdd87fa7f9368c9a00b20ccf9ce56c Mon Sep 17 00:00:00 2001 From: Kristian McGurran Date: Fri, 27 Jun 2025 17:10:44 +0100 Subject: [PATCH 2/7] Adding Tan function with test --- .../Accelerate/AccelerateTrigonometry.h | 11 +++++++++++ .../Tests/AccelerateTrigonometryUnitTests.cpp | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h index e7b5788..3507061 100644 --- a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h +++ b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h @@ -46,4 +46,15 @@ namespace Vectorised::Trigonometry else static_assert (sizeof(T) == 0, "Unsupported type for sine"); } + + template + static void tanVectorised (const T* InputBuffer, T* OutputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvtanf (OutputBuffer, InputBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvtan (OutputBuffer, InputBuffer, &BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for sine"); + } } \ No newline at end of file diff --git a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp index b77ed70..999ab32 100644 --- a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp +++ b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp @@ -37,6 +37,18 @@ TEMPLATE_TEST_CASE("Accelerate Trigonometry Unit Testing", "[Accelerate Trigonom } } + SECTION ("Tan Function Tests") + { + auto tanValue = static_cast (std::tan (1.f)); + + Vectorised::Trigonometry::tanVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (tanValue)); + } + } + SECTION ("Tanh Function Tests") { workingBuffer.assign (bufferSize, static_cast (10)); From bc6937373209d98e605c0b01f29e8cd20ce01077 Mon Sep 17 00:00:00 2001 From: Kristian McGurran Date: Fri, 27 Jun 2025 17:17:02 +0100 Subject: [PATCH 3/7] Adding arc functions --- .../Accelerate/AccelerateTrigonometry.h | 33 +++++++++++++++++ .../Tests/AccelerateTrigonometryUnitTests.cpp | 36 +++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h index 3507061..5d46258 100644 --- a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h +++ b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h @@ -57,4 +57,37 @@ namespace Vectorised::Trigonometry else static_assert (sizeof(T) == 0, "Unsupported type for sine"); } + + template + static void arcSinVectorised (const T* InputBuffer, T* OutputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvasinf (OutputBuffer, InputBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvasin (OutputBuffer, InputBuffer, &BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for sine"); + } + + template + static void arcCosVectorised (const T* InputBuffer, T* OutputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvacosf (OutputBuffer, InputBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvacos (OutputBuffer, InputBuffer, &BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for sine"); + } + + template + static void tanCosVectorised (const T* InputBuffer, T* OutputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvatanf (OutputBuffer, InputBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvatan (OutputBuffer, InputBuffer, &BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for sine"); + } } \ No newline at end of file diff --git a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp index 999ab32..22ca8dd 100644 --- a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp +++ b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp @@ -49,6 +49,42 @@ TEMPLATE_TEST_CASE("Accelerate Trigonometry Unit Testing", "[Accelerate Trigonom } } + SECTION ("Arcsin Function Tests") + { + auto asinValue = static_cast (std::asin (1.f)); + + Vectorised::Trigonometry::arcSinVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (asinValue)); + } + } + + SECTION ("Arccos Function Tests") + { + auto aCosValue = static_cast (std::acos (1.f)); + + Vectorised::Trigonometry::arcCosVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (aCosValue)); + } + } + + SECTION ("ArcTan Function Tests") + { + auto aTanValue = static_cast (std::acos (1.f)); + + Vectorised::Trigonometry::arcCosVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (aTanValue)); + } + } + SECTION ("Tanh Function Tests") { workingBuffer.assign (bufferSize, static_cast (10)); From 356c1436e92c90f91b5d5b269577ea33d365d413 Mon Sep 17 00:00:00 2001 From: Kristian McGurran Date: Fri, 27 Jun 2025 17:21:41 +0100 Subject: [PATCH 4/7] Hyperbolic functions with tests --- .../Accelerate/AccelerateTrigonometry.h | 37 +++++++++++++++---- .../Tests/AccelerateTrigonometryUnitTests.cpp | 24 ++++++++++++ 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h index 5d46258..2aadf2d 100644 --- a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h +++ b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h @@ -3,26 +3,47 @@ namespace Vectorised::Trigonometry { template - static void tanhVectorised (const T* WorkBuffer, T* OutputBuffer, const int BufferSize) + static void hardClipVectorised(const T* InputBuffer, T* OutputBuffer, const int BufferSize, const T* ClipLowerLimit, const T* ClipUpperLimit) { if constexpr (std::is_same_v) - vvtanhf (OutputBuffer, WorkBuffer, &BufferSize); + vDSP_vclip(InputBuffer, 1, ClipLowerLimit, ClipUpperLimit, OutputBuffer, 1, BufferSize); else if constexpr (std::is_same_v) - vvtanh (OutputBuffer, WorkBuffer, &BufferSize); + vDSP_vclipD(InputBuffer, 1, ClipLowerLimit, ClipUpperLimit, OutputBuffer, 1, BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for hard clipping"); + } + + template + static void sinhVectorised (const T* WorkBuffer, T* OutputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvsinhf (OutputBuffer, WorkBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvsinh (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) + static void coshVectorised (const T* WorkBuffer, T* OutputBuffer, const int BufferSize) { if constexpr (std::is_same_v) - vDSP_vclip(InputBuffer, 1, ClipLowerLimit, ClipUpperLimit, OutputBuffer, 1, BufferSize); + vvcoshf (OutputBuffer, WorkBuffer, &BufferSize); else if constexpr (std::is_same_v) - vDSP_vclipD(InputBuffer, 1, ClipLowerLimit, ClipUpperLimit, OutputBuffer, 1, BufferSize); + vvcosh (OutputBuffer, WorkBuffer, &BufferSize); else - static_assert (sizeof(T) == 0, "Unsupported type for hard clipping"); + static_assert (sizeof(T) == 0, "Unsupported type for tanh"); + } + + 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"); } template diff --git a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp index 22ca8dd..53dddec 100644 --- a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp +++ b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp @@ -85,6 +85,30 @@ TEMPLATE_TEST_CASE("Accelerate Trigonometry Unit Testing", "[Accelerate Trigonom } } + SECTION ("Sinh Function Tests") + { + const auto sinhValue = static_cast (std::sinh (1.f)); + + Vectorised::Trigonometry::sinhVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (sinhValue)); + } + } + + SECTION ("Cosh Function Tests") + { + const auto coshValue = static_cast (std::cosh (1.f)); + + Vectorised::Trigonometry::coshVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (coshValue)); + } + } + SECTION ("Tanh Function Tests") { workingBuffer.assign (bufferSize, static_cast (10)); From 8aff79826f1b097d8cb357fe47129d47384b7ca9 Mon Sep 17 00:00:00 2001 From: Kristian McGurran Date: Fri, 27 Jun 2025 17:37:03 +0100 Subject: [PATCH 5/7] Inverse hyperbolic sin with tests --- .../Accelerate/AccelerateTrigonometry.h | 33 +++++++++++++++ .../Tests/AccelerateTrigonometryUnitTests.cpp | 41 ++++++++++++++++++- 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h index 2aadf2d..0eee476 100644 --- a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h +++ b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h @@ -13,6 +13,39 @@ namespace Vectorised::Trigonometry static_assert (sizeof(T) == 0, "Unsupported type for hard clipping"); } + template + static void inverseSinhVectorised (const T* WorkBuffer, T* OutputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvasinhf (OutputBuffer, WorkBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvasinh (OutputBuffer, WorkBuffer, &BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for tanh"); + } + + template + static void inverseCoshVectorised (const T* WorkBuffer, T* OutputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvacoshf (OutputBuffer, WorkBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvacosh (OutputBuffer, WorkBuffer, &BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for tanh"); + } + + template + static void inverseTanhVectorised (const T* WorkBuffer, T* OutputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvatanhf (OutputBuffer, WorkBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvatanh (OutputBuffer, WorkBuffer, &BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for tanh"); + } + template static void sinhVectorised (const T* WorkBuffer, T* OutputBuffer, const int BufferSize) { diff --git a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp index 53dddec..8ee6db6 100644 --- a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp +++ b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp @@ -122,7 +122,46 @@ TEMPLATE_TEST_CASE("Accelerate Trigonometry Unit Testing", "[Accelerate Trigonom } } - SECTION ("Sigmud Function Tests") + SECTION ("Inverse Hyperbolic Cosine Function Tests") + { + workingBuffer.assign (bufferSize, static_cast (2)); + const auto compareValue = static_cast (std::asinh (2)); + + Vectorised::Trigonometry::inverseSinhVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (compareValue)); + } + } + + SECTION ("Inverse Hyperbolic Cosine Function Tests") + { + workingBuffer.assign (bufferSize, static_cast (2)); + const auto compareValue = static_cast (std::acosh (2)); + + Vectorised::Trigonometry::inverseCoshVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (compareValue)); + } + } + + SECTION ("Inverse Hyperbolic Tangent Function Tests") + { + workingBuffer.assign (bufferSize, static_cast (0.8)); + const auto compareValue = static_cast (std::atanh (0.8)); + + Vectorised::Trigonometry::inverseTanhVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (compareValue)); + } + } + + SECTION ("Sigmoid Function Tests") { const auto minValue = static_cast(-1); const auto maxValue = static_cast(1); From af29bae00d590d6cc44bd65d6e0e18120aca0ba8 Mon Sep 17 00:00:00 2001 From: Kristian McGurran Date: Fri, 27 Jun 2025 17:40:49 +0100 Subject: [PATCH 6/7] Naming bug --- VectorisationWrappers/Accelerate/AccelerateTrigonometry.h | 2 +- .../Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h index 0eee476..4810114 100644 --- a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h +++ b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h @@ -135,7 +135,7 @@ namespace Vectorised::Trigonometry } template - static void tanCosVectorised (const T* InputBuffer, T* OutputBuffer, const int BufferSize) + static void arcTanVectorised (const T* InputBuffer, T* OutputBuffer, const int BufferSize) { if constexpr (std::is_same_v) vvatanf (OutputBuffer, InputBuffer, &BufferSize); diff --git a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp index 8ee6db6..7614431 100644 --- a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp +++ b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp @@ -75,9 +75,9 @@ TEMPLATE_TEST_CASE("Accelerate Trigonometry Unit Testing", "[Accelerate Trigonom SECTION ("ArcTan Function Tests") { - auto aTanValue = static_cast (std::acos (1.f)); + auto aTanValue = static_cast (std::atan (1.f)); - Vectorised::Trigonometry::arcCosVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); + Vectorised::Trigonometry::arcTanVectorised (workingBuffer.data(), workingBuffer.data(), bufferSize); for (const auto& value : workingBuffer) { From c606a87e139eda5ae9dc5f2099aa10de121d5e75 Mon Sep 17 00:00:00 2001 From: Kristian McGurran Date: Fri, 27 Jun 2025 17:46:25 +0100 Subject: [PATCH 7/7] Arc Tang of X Y --- .../Accelerate/AccelerateTrigonometry.h | 11 +++++++++++ .../Tests/AccelerateTrigonometryUnitTests.cpp | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h index 4810114..7768ab8 100644 --- a/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h +++ b/VectorisationWrappers/Accelerate/AccelerateTrigonometry.h @@ -144,4 +144,15 @@ namespace Vectorised::Trigonometry else static_assert (sizeof(T) == 0, "Unsupported type for sine"); } + + template + static void arcTanXYVectorised (const T* XBuffer, const T* YBuffer, T* OutputBuffer, const int BufferSize) + { + if constexpr (std::is_same_v) + vvatan2f (OutputBuffer, YBuffer, XBuffer, &BufferSize); + else if constexpr (std::is_same_v) + vvatan2 (OutputBuffer, YBuffer, XBuffer, &BufferSize); + else + static_assert (sizeof(T) == 0, "Unsupported type for sine"); + } } \ No newline at end of file diff --git a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp index 7614431..b630463 100644 --- a/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp +++ b/VectorisationWrappers/Accelerate/Tests/AccelerateTrigonometryUnitTests.cpp @@ -182,4 +182,16 @@ TEMPLATE_TEST_CASE("Accelerate Trigonometry Unit Testing", "[Accelerate Trigonom REQUIRE (value == Catch::Approx (maxValue)); } } + + SECTION ("Arc tangent of X Y Function Tests") + { + auto normalValue = static_cast (std::atan2 (1.f, 1.f)); + + Vectorised::Trigonometry::arcTanXYVectorised (workingBuffer.data(), workingBuffer.data(), workingBuffer.data(), bufferSize); + + for (const auto& value : workingBuffer) + { + REQUIRE (value == Catch::Approx (normalValue)); + } + } } \ No newline at end of file