diff --git a/OMP45Stream.cpp b/OMP45Stream.cpp index f849c39..b0562bc 100644 --- a/OMP45Stream.cpp +++ b/OMP45Stream.cpp @@ -111,6 +111,26 @@ void OMP45Stream::triad() a[i] = b[i] + scalar * c[i]; } } + +template +T OMP45Stream::dot() +{ + T sum = 0.0; + + unsigned int array_size = this->array_size; + T *a = this->a; + T *b = this->b; + #pragma omp target teams distribute parallel for simd reduction(+:sum) map(tofrom: sum) + for (int i = 0; i < array_size; i++) + { + sum += a[i] * b[i]; + } + + return sum; +} + + + void listDevices(void) { // Get number of devices diff --git a/OMP45Stream.h b/OMP45Stream.h index bd812a1..a1febb7 100644 --- a/OMP45Stream.h +++ b/OMP45Stream.h @@ -36,6 +36,7 @@ class OMP45Stream : public Stream virtual void add() override; virtual void mul() override; virtual void triad() override; + virtual T dot() override; virtual void write_arrays(const std::vector& a, const std::vector& b, const std::vector& c) override; virtual void read_arrays(std::vector& a, std::vector& b, std::vector& c) override;