// 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 "KOKKOSStream.hpp" using namespace Kokkos; template KOKKOSStream::KOKKOSStream( const unsigned int ARRAY_SIZE, const int device_index) : array_size(ARRAY_SIZE) { Kokkos::initialize(); d_a = new View("d_a", ARRAY_SIZE); d_b = new View("d_b", ARRAY_SIZE); d_c = new View("d_c", ARRAY_SIZE); hm_a = new View::HostMirror(); hm_b = new View::HostMirror(); hm_c = new View::HostMirror(); *hm_a = create_mirror_view(*d_a); *hm_b = create_mirror_view(*d_b); *hm_c = create_mirror_view(*d_c); } template KOKKOSStream::~KOKKOSStream() { finalize(); } template void KOKKOSStream::init_arrays(T initA, T initB, T initC) { View a(*d_a); View b(*d_b); View c(*d_c); parallel_for(array_size, KOKKOS_LAMBDA (const int index) { a[index] = initA; b[index] = initB; c[index] = initC; }); Kokkos::fence(); } template void KOKKOSStream::read_arrays( std::vector& a, std::vector& b, std::vector& c) { deep_copy(*hm_a, *d_a); deep_copy(*hm_b, *d_b); deep_copy(*hm_c, *d_c); for(int ii = 0; ii < array_size; ++ii) { a[ii] = (*hm_a)(ii); b[ii] = (*hm_b)(ii); c[ii] = (*hm_c)(ii); } } template void KOKKOSStream::copy() { View a(*d_a); View b(*d_b); View c(*d_c); parallel_for(array_size, KOKKOS_LAMBDA (const int index) { c[index] = a[index]; }); Kokkos::fence(); } template void KOKKOSStream::mul() { View a(*d_a); View b(*d_b); View c(*d_c); const T scalar = startScalar; parallel_for(array_size, KOKKOS_LAMBDA (const int index) { b[index] = scalar*c[index]; }); Kokkos::fence(); } template void KOKKOSStream::add() { View a(*d_a); View b(*d_b); View c(*d_c); parallel_for(array_size, KOKKOS_LAMBDA (const int index) { c[index] = a[index] + b[index]; }); Kokkos::fence(); } template void KOKKOSStream::triad() { View a(*d_a); View b(*d_b); View c(*d_c); const T scalar = startScalar; parallel_for(array_size, KOKKOS_LAMBDA (const int index) { a[index] = b[index] + scalar*c[index]; }); Kokkos::fence(); } template T KOKKOSStream::dot() { View a(*d_a); View b(*d_b); T sum = 0.0; parallel_reduce(array_size, KOKKOS_LAMBDA (const int index, double &tmp) { tmp += a[index] * b[index]; }, sum); return sum; } void listDevices(void) { std::cout << "This is not the device you are looking for."; } std::string getDeviceName(const int device) { return "Kokkos"; } std::string getDeviceDriver(const int device) { return "Kokkos"; } //template class KOKKOSStream; template class KOKKOSStream;