// Copyright (c) 2015-16 Tom Deakin, Simon McIntosh-Smith, // University of Bristol HPC // // For full license terms please see the LICENSE file distributed with this // source code #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 = 0.3; #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 = 0.3; #pragma omp parallel for for (int i = 0; i < array_size; i++) { a[i] = b[i] + scalar * c[i]; } } template T OMP3Stream::dot() { T sum = 0.0; #pragma omp parallel for reduction(+:sum) for (int i = 0; i < array_size; i++) { sum += a[i] * b[i]; } return sum; } 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;