Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
sycl_vector_utils.hpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
10#pragma once
11
23#include "shambackends/sycl.hpp"
24#include <ostream>
25#include <random>
26
27template<class T>
28inline void print_vec(std::ostream &ostream, T a);
29
30template<class T>
31inline T next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval);
32
33template<class T>
34inline void print_vec(std::ostream &ostream, sycl::vec<T, 2> a) {
35 ostream << "(" << a.x() << "," << a.y() << ")";
36}
37
38template<class T>
39inline void print_vec(std::ostream &ostream, sycl::vec<T, 3> a) {
40 ostream << "(" << a.x() << "," << a.y() << "," << a.z() << ")";
41}
42
43template<class T>
44inline void print_vec(std::ostream &ostream, sycl::vec<T, 4> a) {
45 ostream << "(" << a.x() << "," << a.y() << "," << a.z() << "," << a.w() << ")";
46}
47
48template<class T>
49inline void print_vec(std::ostream &ostream, sycl::vec<T, 8> a) {
50 ostream << "(" << a.s0() << "," << a.s1() << "," << a.s2() << "," << a.s3() << a.s4() << ","
51 << a.s5() << "," << a.s6() << "," << a.s7() << ")";
52}
53
54template<class T>
55inline void print_vec(std::ostream &ostream, sycl::vec<T, 16> a) {
56 ostream << "(" << a.s0() << "," << a.s1() << "," << a.s2() << "," << a.s3() << a.s4() << ","
57 << a.s5() << "," << a.s6() << "," << a.s7() << a.s8() << "," << a.s9() << "," << a.sA()
58 << "," << a.sB() << a.sC() << "," << a.sD() << "," << a.sE() << "," << a.sF() << ")";
59}
60
61template<class T>
62inline void print_vec(std::ostream &ostream, T a) {
63 ostream << a;
64}
65
66template<>
67inline i64 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
68 return i64(distval(eng));
69}
70template<>
71inline i32 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
72 return i32(distval(eng));
73}
74template<>
75inline i16 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
76 return i16(distval(eng));
77}
78template<>
79inline i8 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
80 return i8(distval(eng));
81}
82template<>
83inline u64 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
84 return u64(distval(eng));
85}
86template<>
87inline u32 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
88 return u32(distval(eng));
89}
90template<>
91inline u16 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
92 return u16(distval(eng));
93}
94template<>
95inline u8 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
96 return u8(distval(eng));
97}
98#ifdef SYCL_COMP_INTEL_LLVM
99template<>
100inline f16 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
101 return f16(distval(eng));
102}
103#endif
104template<>
105inline f32 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
106 return f32(distval(eng));
107}
108template<>
109inline f64 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
110 return f64(distval(eng));
111}
112
113template<>
114inline sycl::vec<f32, 2> next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
115 return sycl::vec<f32, 2>{next_obj<f32>(eng, distval), next_obj<f32>(eng, distval)};
116}
117template<>
118inline sycl::vec<f32, 3> next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
119 return sycl::vec<f32, 3>{
120 next_obj<f32>(eng, distval), next_obj<f32>(eng, distval), next_obj<f32>(eng, distval)};
121}
122template<>
123inline sycl::vec<f32, 4> next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
124 return sycl::vec<f32, 4>{
125 next_obj<f32>(eng, distval),
126 next_obj<f32>(eng, distval),
127 next_obj<f32>(eng, distval),
128 next_obj<f32>(eng, distval)};
129}
130
131template<>
132inline sycl::vec<f32, 8> next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
133 return sycl::vec<f32, 8>{
134 next_obj<f32>(eng, distval),
135 next_obj<f32>(eng, distval),
136 next_obj<f32>(eng, distval),
137 next_obj<f32>(eng, distval),
138 next_obj<f32>(eng, distval),
139 next_obj<f32>(eng, distval),
140 next_obj<f32>(eng, distval),
141 next_obj<f32>(eng, distval)};
142}
143
144template<>
145inline sycl::vec<f32, 16> next_obj(
146 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
147 return sycl::vec<f32, 16>{
148 next_obj<f32>(eng, distval),
149 next_obj<f32>(eng, distval),
150 next_obj<f32>(eng, distval),
151 next_obj<f32>(eng, distval),
152 next_obj<f32>(eng, distval),
153 next_obj<f32>(eng, distval),
154 next_obj<f32>(eng, distval),
155 next_obj<f32>(eng, distval),
156 next_obj<f32>(eng, distval),
157 next_obj<f32>(eng, distval),
158 next_obj<f32>(eng, distval),
159 next_obj<f32>(eng, distval),
160 next_obj<f32>(eng, distval),
161 next_obj<f32>(eng, distval),
162 next_obj<f32>(eng, distval),
163 next_obj<f32>(eng, distval)};
164}
165
166template<>
167inline sycl::vec<f64, 2> next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
168 return sycl::vec<f64, 2>{next_obj<f64>(eng, distval), next_obj<f64>(eng, distval)};
169}
170template<>
171inline sycl::vec<f64, 3> next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
172 return sycl::vec<f64, 3>{
173 next_obj<f64>(eng, distval), next_obj<f64>(eng, distval), next_obj<f64>(eng, distval)};
174}
175template<>
176inline sycl::vec<f64, 4> next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
177 return sycl::vec<f64, 4>{
178 next_obj<f64>(eng, distval),
179 next_obj<f64>(eng, distval),
180 next_obj<f64>(eng, distval),
181 next_obj<f64>(eng, distval)};
182}
183
184template<>
185inline sycl::vec<f64, 8> next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
186 return sycl::vec<f64, 8>{
187 next_obj<f64>(eng, distval),
188 next_obj<f64>(eng, distval),
189 next_obj<f64>(eng, distval),
190 next_obj<f64>(eng, distval),
191 next_obj<f64>(eng, distval),
192 next_obj<f64>(eng, distval),
193 next_obj<f64>(eng, distval),
194 next_obj<f64>(eng, distval)};
195}
196
197template<>
198inline sycl::vec<f64, 16> next_obj(
199 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
200 return sycl::vec<f64, 16>{
201 next_obj<f64>(eng, distval),
202 next_obj<f64>(eng, distval),
203 next_obj<f64>(eng, distval),
204 next_obj<f64>(eng, distval),
205 next_obj<f64>(eng, distval),
206 next_obj<f64>(eng, distval),
207 next_obj<f64>(eng, distval),
208 next_obj<f64>(eng, distval),
209 next_obj<f64>(eng, distval),
210 next_obj<f64>(eng, distval),
211 next_obj<f64>(eng, distval),
212 next_obj<f64>(eng, distval),
213 next_obj<f64>(eng, distval),
214 next_obj<f64>(eng, distval),
215 next_obj<f64>(eng, distval),
216 next_obj<f64>(eng, distval)};
217}
218
219template<>
220inline sycl::vec<u16, 3> next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
221 return sycl::vec<u16, 3>{
222 next_obj<u16>(eng, distval), next_obj<u16>(eng, distval), next_obj<u16>(eng, distval)};
223}
224
225template<>
226inline sycl::vec<u32, 3> next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
227 return sycl::vec<u32, 3>{
228 next_obj<u32>(eng, distval), next_obj<u32>(eng, distval), next_obj<u32>(eng, distval)};
229}
double f64
Alias for double.
float f32
Alias for float.
std::int8_t i8
8 bit integer
std::uint8_t u8
8 bit unsigned integer
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
std::uint16_t u16
16 bit unsigned integer
std::int16_t i16
16 bit integer
std::int64_t i64
64 bit integer
std::int32_t i32
32 bit integer