// Copyright (c) 2020 Tom Deakin // University of Bristol HPC // // For full license terms please see the LICENSE file distributed with this // source code #include "STD20Stream.hpp" #include #include #include template STD20Stream::STD20Stream(const unsigned int ARRAY_SIZE, int device) : array_size{ARRAY_SIZE} { a = std::vector(array_size); b = std::vector(array_size); c = std::vector(array_size); } template void STD20Stream::init_arrays(T initA, T initB, T initC) { std::for_each_n( std::execution::par_unseq, std::views::iota(0).begin(), array_size, // loop range [&] (int i) { a[i] = initA; b[i] = initB; c[i] = initC; } ); } template void STD20Stream::read_arrays(std::vector& h_a, std::vector& h_b, std::vector& h_c) { // Element-wise copy. h_a = a; h_b = b; h_c = c; } template void STD20Stream::copy() { std::for_each_n( std::execution::par_unseq, std::views::iota(0).begin(), array_size, [&] (int i) { c[i] = a[i]; } ); } template void STD20Stream::mul() { const T scalar = startScalar; std::for_each_n( std::execution::par_unseq, std::views::iota(0).begin(), array_size, [&] (int i) { b[i] = scalar * c[i]; } ); } template void STD20Stream::add() { std::for_each_n( std::execution::par_unseq, std::views::iota(0).begin(), array_size, [&] (int i) { c[i] = a[i] + b[i]; } ); } template void STD20Stream::triad() { 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() { // sum += a[i] * b[i]; return std::transform_reduce( std::execution::par_unseq, a.begin(), a.end(), b.begin(), 0.0); } void listDevices(void) { std::cout << "C++20 does not expose devices" << 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 STD20Stream; template class STD20Stream;