From 0f5d94a81aacf0c11c5c3c286842e23f3e002640 Mon Sep 17 00:00:00 2001 From: Viral Date: Mon, 8 Dec 2025 09:19:46 -0800 Subject: [PATCH 1/2] smoke test for exclusive_scan --- test/stdpar/tests/exclusive_scan.cpp | 46 ++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 test/stdpar/tests/exclusive_scan.cpp diff --git a/test/stdpar/tests/exclusive_scan.cpp b/test/stdpar/tests/exclusive_scan.cpp new file mode 100644 index 00000000000..b92eb3e70f6 --- /dev/null +++ b/test/stdpar/tests/exclusive_scan.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +int main() +{ + constexpr std::size_t N = 1 << 16; + + std::vector in(N); + std::vector out(N); + + for (std::size_t i = 0; i < N; ++i) + { + in[i] = static_cast(i + 1); + } + + // exclusive_scan with default initial value (0) + std::exclusive_scan(std::execution::par, in.begin(), in.end(), out.begin(), 0); + + int running_sum = 0; + for (std::size_t i = 0; i < N; ++i) + { + if (out[i] != running_sum) + { + return 1; + } + running_sum += in[i]; + } + + // exclusive_scan with non-zero initial value + const int init = 42; + std::exclusive_scan(std::execution::par, in.begin(), in.end(), out.begin(), init); + + running_sum = init; + for (std::size_t i = 0; i < N; ++i) + { + if (out[i] != running_sum) + { + return 1; + } + running_sum += in[i]; + } + + return 0; +} From b51f01ee38d4612584833bc056b7ab706dbdbc10 Mon Sep 17 00:00:00 2001 From: Viral Date: Thu, 11 Dec 2025 12:18:44 -0800 Subject: [PATCH 2/2] added test cases for binary ops --- test/stdpar/tests/exclusive_scan.cpp | 46 ++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/test/stdpar/tests/exclusive_scan.cpp b/test/stdpar/tests/exclusive_scan.cpp index b92eb3e70f6..a4273cade20 100644 --- a/test/stdpar/tests/exclusive_scan.cpp +++ b/test/stdpar/tests/exclusive_scan.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -10,15 +11,13 @@ int main() std::vector in(N); std::vector out(N); - for (std::size_t i = 0; i < N; ++i) - { - in[i] = static_cast(i + 1); - } + std::iota(in.begin(), in.end(), 1); - // exclusive_scan with default initial value (0) - std::exclusive_scan(std::execution::par, in.begin(), in.end(), out.begin(), 0); + // exclusive_scan with non-zero initial value + const int init = 42; + std::exclusive_scan(std::execution::par, in.begin(), in.end(), out.begin(), init); - int running_sum = 0; + int running_sum = init; for (std::size_t i = 0; i < N; ++i) { if (out[i] != running_sum) @@ -28,18 +27,39 @@ int main() running_sum += in[i]; } - // exclusive_scan with non-zero initial value - const int init = 42; - std::exclusive_scan(std::execution::par, in.begin(), in.end(), out.begin(), init); + // exclusive_scan with initial value & binary ops + const int mul_init = 1; + std::exclusive_scan(std::execution::par, in.begin(), in.end(), out.begin(), mul_init, std::multiplies{}); - running_sum = init; + int expected = mul_init; for (std::size_t i = 0; i < N; ++i) { - if (out[i] != running_sum) + if (out[i] != expected) + { + return 1; + } + expected *= 2; + } + + // exclusive_scan with initial value & custom binary ops + const int init2 = 7; + std::exclusive_scan( + std::execution::par, + in.begin(), + in.end(), + out.begin(), + init2, + [](int lhs, int rhs) { + return lhs + rhs + 1; + }) + + for (std::size_t i = 0; i < N; ++i) + { + const int expected = init2 + static_cast(2 * i); + if (out[i] != expected) { return 1; } - running_sum += in[i]; } return 0;