File device.h
File List > code_source > templat > include > TempLat > parallel > device.h
Go to the documentation of this file
#ifndef TEMPLAT_PARALLEL_DEVICE_H
#define TEMPLAT_PARALLEL_DEVICE_H
/* This file is part of TempLat, available at https://cosmolattice.github.io/templat .
Copyright 2021-2026 The TempLat authors, see AUTHORS.md.
Released under the MIT license, see LICENSE.md. */
// File info: Main contributor(s): Franz R. Sattler, Year: 2025
#ifdef DEVICE_KOKKOS
#include "TempLat/parallel/devices/kokkos/kokkos.h"
namespace TempLat
{
namespace export_device_namespace = device_kokkos;
} // namespace TempLat
#elif defined(DEVICE_STD)
#include "TempLat/parallel/devices/std/std.h"
namespace TempLat
{
namespace export_device_namespace = std_device;
} // namespace TempLat
#else
static_assert(false, "Unknown device type. Please define DEVICE_KOKKOS or DEVICE_STD.");
#endif
namespace TempLat
{
namespace device
{
using export_device_namespace::reverse_access_pattern;
// ------------------------------------------------
// Tuple and logic defaults
// ------------------------------------------------
using export_device_namespace::apply;
using export_device_namespace::array;
using export_device_namespace::forward_as_tuple;
using export_device_namespace::get;
using export_device_namespace::index_sequence;
using export_device_namespace::make_index_sequence;
using export_device_namespace::make_pair;
using export_device_namespace::make_tuple;
using export_device_namespace::pair;
using export_device_namespace::tie;
using export_device_namespace::tuple;
using export_device_namespace::tuple_cat;
using export_device_namespace::Idx;
using export_device_namespace::IdxArray;
// ------------------------------------------------
// Atomics
// ------------------------------------------------
using export_device_namespace::atomic_add;
using export_device_namespace::atomic_inc;
using export_device_namespace::atomic_max;
using export_device_namespace::atomic_min;
// ------------------------------------------------
// Arithmetic defaults
// ------------------------------------------------
using export_device_namespace::abs;
using export_device_namespace::acos;
using export_device_namespace::acosh;
using export_device_namespace::asin;
using export_device_namespace::asinh;
using export_device_namespace::atan;
using export_device_namespace::atan2;
using export_device_namespace::atanh;
using export_device_namespace::ceil;
using export_device_namespace::conj;
using export_device_namespace::cos;
using export_device_namespace::cosh;
using export_device_namespace::exp;
using export_device_namespace::floor;
using export_device_namespace::fmod;
using export_device_namespace::imag;
using export_device_namespace::log;
using export_device_namespace::max;
using export_device_namespace::min;
using export_device_namespace::pow;
using export_device_namespace::real;
using export_device_namespace::round;
using export_device_namespace::sin;
using export_device_namespace::sinh;
using export_device_namespace::sqrt;
using export_device_namespace::tan;
using export_device_namespace::tanh;
using export_device_namespace::complex;
} // namespace device
// The complex type is used in many places, so we re-export it at the top level.
using device::complex;
template <typename T, size_t N>
requires(!std::is_same_v<device::array<T, N>, std::array<T, N>>)
std::ostream &operator<<(std::ostream &stream, const device::array<T, N> &vec)
{
stream << "{{ ";
bool first = true;
int limiter = 0;
for (auto &&it : vec) {
if (++limiter > 10) {
stream << ", ...";
break;
}
if (first) {
first = false;
} else {
stream << ", ";
}
stream << it;
}
stream << " }}";
return stream;
};
} // namespace TempLat
// Including this here, as we need that anywhere basically, where Kokkos is explicitly used.
#include "TempLat/lattice/algebra/helpers/isvariadicindex.h"
#endif