From 490af521478771fc598515000142144a1d3a22fa Mon Sep 17 00:00:00 2001 From: Tom Deakin Date: Wed, 3 Feb 2021 10:54:33 +0000 Subject: [PATCH] Add nstream to C++ STD version -- untested as compilers not ready --- STD20Stream.cpp | 14 ++++++++++++++ STD20Stream.hpp | 1 + STDStream.cpp | 11 +++++++++++ STDStream.h | 1 + 4 files changed, 27 insertions(+) diff --git a/STD20Stream.cpp b/STD20Stream.cpp index 09f83d4..8290033 100644 --- a/STD20Stream.cpp +++ b/STD20Stream.cpp @@ -94,6 +94,20 @@ void STD20Stream::triad() ); } +template +void STD20Stream::nstream() +{ + const T scalar = startScalar; + + std::for_each_n( + std::execution::par_unseq, + std::views::iota(0).begin(), array_size, + [&] (int i) { + a[i] += b[i] + scalar * c[i]; + } + ); +} + template T STD20Stream::dot() { diff --git a/STD20Stream.hpp b/STD20Stream.hpp index a8a3c4f..e5daa3c 100644 --- a/STD20Stream.hpp +++ b/STD20Stream.hpp @@ -33,6 +33,7 @@ class STD20Stream : public Stream virtual void add() override; virtual void mul() override; virtual void triad() override; + virtual void nstream() override; virtual T dot() override; virtual void init_arrays(T initA, T initB, T initC) override; diff --git a/STDStream.cpp b/STDStream.cpp index cd966ae..30ad420 100644 --- a/STDStream.cpp +++ b/STDStream.cpp @@ -72,6 +72,17 @@ void STDStream::triad() std::transform(exe_policy, b, b+array_size, c, a, [](T bi, T ci){ return bi+startScalar*ci; }); } +template +void STDStream::nstream() +{ + // a[i] += b[i] + scalar * c[i]; + // Need to do in two stages with C++11 STL. + // 1: a[i] += b[i] + // 2: a[i] += scalar * c[i]; + std::transform(exe_policy, a, a+array_size, b, a, [](T ai, T bi){ return ai + bi; }); + std::transform(exe_policy, a, a+array_size, c, a, [](T ai, T ci){ return ai + startScalar*ci; }); +} + template T STDStream::dot() { diff --git a/STDStream.h b/STDStream.h index 538f857..9ff7800 100644 --- a/STDStream.h +++ b/STDStream.h @@ -31,6 +31,7 @@ class STDStream : public Stream virtual void add() override; virtual void mul() override; virtual void triad() override; + virtual void nstream() override; virtual T dot() override; virtual void init_arrays(T initA, T initB, T initC) override;