From f0afa0c1e43c43729dd26cca719d1db21844d279 Mon Sep 17 00:00:00 2001 From: Tom Deakin Date: Wed, 4 May 2016 10:41:41 +0100 Subject: [PATCH] Add reference OpenMP 3.0 version --- OMP3Stream.cpp | 106 +++++++++++++++++++++++++++++++++++++++++++++++++ OMP3Stream.h | 35 ++++++++++++++++ main.cpp | 7 ++++ 3 files changed, 148 insertions(+) create mode 100644 OMP3Stream.cpp create mode 100644 OMP3Stream.h diff --git a/OMP3Stream.cpp b/OMP3Stream.cpp new file mode 100644 index 0000000..8899cff --- /dev/null +++ b/OMP3Stream.cpp @@ -0,0 +1,106 @@ + +#include "OMP3Stream.h" + +template +OMP3Stream::OMP3Stream(const unsigned int ARRAY_SIZE, T *a, T *b, T *c) +{ + array_size = ARRAY_SIZE; + this->a = (T*)malloc(sizeof(T)*array_size); + this->b = (T*)malloc(sizeof(T)*array_size); + this->c = (T*)malloc(sizeof(T)*array_size); +} + +template +OMP3Stream::~OMP3Stream() +{ + free(a); + free(b); + free(c); +} + + +template +void OMP3Stream::write_arrays(const std::vector& h_a, const std::vector& h_b, const std::vector& h_c) +{ + #pragma omp parallel for + for (int i = 0; i < array_size; i++) + { + a[i] = h_a[i]; + b[i] = h_b[i]; + c[i] = h_c[i]; + } +} + +template +void OMP3Stream::read_arrays(std::vector& h_a, std::vector& h_b, std::vector& h_c) +{ + #pragma omp parallel for + for (int i = 0; i < array_size; i++) + { + h_a[i] = a[i]; + h_b[i] = b[i]; + h_c[i] = c[i]; + } +} + +template +void OMP3Stream::copy() +{ + #pragma omp parallel for + for (int i = 0; i < array_size; i++) + { + c[i] = a[i]; + } +} + +template +void OMP3Stream::mul() +{ + const T scalar = 3.0; + #pragma omp parallel for + for (int i = 0; i < array_size; i++) + { + b[i] = scalar * c[i]; + } +} + +template +void OMP3Stream::add() +{ + #pragma omp parallel for + for (int i = 0; i < array_size; i++) + { + c[i] = a[i] + b[i]; + } +} + +template +void OMP3Stream::triad() +{ + const T scalar = 3.0; + #pragma omp parallel for + for (int i = 0; i < array_size; i++) + { + a[i] = b[i] + scalar * c[i]; + } +} + +void listDevices(void) +{ + std::cout << "0: CPU" << std::endl; +} + +std::string getDeviceName(const int) +{ + return std::string("Device name unavailable"); +} + +std::string getDeviceDriver(const int) +{ + return std::string("Device driver unavailable"); +} + + +template class OMP3Stream; +template class OMP3Stream; + diff --git a/OMP3Stream.h b/OMP3Stream.h new file mode 100644 index 0000000..15172c3 --- /dev/null +++ b/OMP3Stream.h @@ -0,0 +1,35 @@ + +#pragma once + +#include +#include + +#include "Stream.h" + +#define IMPLEMENTATION_STRING "Reference OpenMP" + +template +class OMP3Stream : public Stream +{ + protected: + // Size of arrays + unsigned int array_size; + // Device side pointers + T *a; + T *b; + T *c; + + public: + OMP3Stream(const unsigned int, T*, T*, T*); + ~OMP3Stream(); + + virtual void copy() override; + virtual void add() override; + virtual void mul() override; + virtual void triad() 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; + +}; + diff --git a/main.cpp b/main.cpp index 59411b8..18b8c72 100644 --- a/main.cpp +++ b/main.cpp @@ -26,6 +26,8 @@ #include "ACCStream.h" #elif defined(SYCL) #include "SYCLStream.h" +#elif defined(OMP3) +#include "OMP3Stream.h" #endif @@ -92,6 +94,11 @@ void run() // Use the SYCL implementation stream = new SYCLStream(ARRAY_SIZE, deviceIndex); +#elif defined(OMP3) + // Use the "reference" OpenMP 3 implementation + stream = new OMP3Stream(ARRAY_SIZE, a.data(), b.data(), c.data()); + + #endif stream->write_arrays(a, b, c);