Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
SyclHelper.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
18#include "shambackends/sycl.hpp"
20#include <ostream>
21#include <random>
22
23namespace shamsys::syclhelper::mock {
24
25 template<class T>
26 sycl::buffer<T> mock_buffer(u32 len, std::mt19937 &eng);
27
28} // namespace shamsys::syclhelper::mock
29
30namespace shamsys::syclhelper {
31
32 template<class T>
33 inline void print_vec(std::ostream &ostream, T a);
34
35 template<class T>
36 inline T next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval);
37
38 template<class T>
39 inline void print_vec(std::ostream &ostream, sycl::vec<T, 2> a) {
40 ostream << "(" << a.x() << "," << a.y() << ")";
41 }
42
43 template<class T>
44 inline void print_vec(std::ostream &ostream, sycl::vec<T, 3> a) {
45 ostream << "(" << a.x() << "," << a.y() << "," << a.z() << ")";
46 }
47
48 template<class T>
49 inline void print_vec(std::ostream &ostream, sycl::vec<T, 4> a) {
50 ostream << "(" << a.x() << "," << a.y() << "," << a.z() << "," << a.w() << ")";
51 }
52
53 template<class T>
54 inline void print_vec(std::ostream &ostream, sycl::vec<T, 8> a) {
55 ostream << "(" << a.s0() << "," << a.s1() << "," << a.s2() << "," << a.s3() << a.s4() << ","
56 << a.s5() << "," << a.s6() << "," << a.s7() << ")";
57 }
58
59 template<class T>
60 inline void print_vec(std::ostream &ostream, sycl::vec<T, 16> a) {
61 ostream << "(" << a.s0() << "," << a.s1() << "," << a.s2() << "," << a.s3() << a.s4() << ","
62 << a.s5() << "," << a.s6() << "," << a.s7() << a.s8() << "," << a.s9() << ","
63 << a.sA() << "," << a.sB() << a.sC() << "," << a.sD() << "," << a.sE() << ","
64 << a.sF() << ")";
65 }
66
67 template<class T>
68 inline void print_vec(std::ostream &ostream, T a) {
69 ostream << a;
70 }
71
72 template<>
73 inline i64 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
74 return i64(distval(eng));
75 }
76 template<>
77 inline i32 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
78 return i32(distval(eng));
79 }
80 template<>
81 inline i16 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
82 return i16(distval(eng));
83 }
84 template<>
85 inline i8 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
86 return i8(distval(eng));
87 }
88 template<>
89 inline u64 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
90 return u64(distval(eng));
91 }
92 template<>
93 inline u32 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
94 return u32(distval(eng));
95 }
96 template<>
97 inline u16 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
98 return u16(distval(eng));
99 }
100 template<>
101 inline u8 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
102 return u8(distval(eng));
103 }
104#ifdef SYCL_COMP_INTEL_LLVM
105 template<>
106 inline f16 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
107 return f16(distval(eng));
108 }
109#endif
110 template<>
111 inline f32 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
112 return f32(distval(eng));
113 }
114 template<>
115 inline f64 next_obj(std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
116 return f64(distval(eng));
117 }
118
119 template<>
120 inline sycl::vec<f32, 2> next_obj(
121 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
122 return sycl::vec<f32, 2>{next_obj<f32>(eng, distval), next_obj<f32>(eng, distval)};
123 }
124 template<>
125 inline sycl::vec<f32, 3> next_obj(
126 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
127 return sycl::vec<f32, 3>{
128 next_obj<f32>(eng, distval), next_obj<f32>(eng, distval), next_obj<f32>(eng, distval)};
129 }
130 template<>
131 inline sycl::vec<f32, 4> next_obj(
132 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
133 return sycl::vec<f32, 4>{
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 }
139
140 template<>
141 inline sycl::vec<f32, 8> next_obj(
142 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
143 return sycl::vec<f32, 8>{
144 next_obj<f32>(eng, distval),
145 next_obj<f32>(eng, distval),
146 next_obj<f32>(eng, distval),
147 next_obj<f32>(eng, distval),
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 }
153
154 template<>
155 inline sycl::vec<f32, 16> next_obj(
156 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
157 return sycl::vec<f32, 16>{
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 next_obj<f32>(eng, distval),
165 next_obj<f32>(eng, distval),
166 next_obj<f32>(eng, distval),
167 next_obj<f32>(eng, distval),
168 next_obj<f32>(eng, distval),
169 next_obj<f32>(eng, distval),
170 next_obj<f32>(eng, distval),
171 next_obj<f32>(eng, distval),
172 next_obj<f32>(eng, distval),
173 next_obj<f32>(eng, distval)};
174 }
175
176 template<>
177 inline sycl::vec<f64, 2> next_obj(
178 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
179 return sycl::vec<f64, 2>{next_obj<f64>(eng, distval), next_obj<f64>(eng, distval)};
180 }
181 template<>
182 inline sycl::vec<f64, 3> next_obj(
183 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
184 return sycl::vec<f64, 3>{
185 next_obj<f64>(eng, distval), next_obj<f64>(eng, distval), next_obj<f64>(eng, distval)};
186 }
187 template<>
188 inline sycl::vec<f64, 4> next_obj(
189 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
190 return sycl::vec<f64, 4>{
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
197 template<>
198 inline sycl::vec<f64, 8> next_obj(
199 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
200 return sycl::vec<f64, 8>{
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 }
210
211 template<>
212 inline sycl::vec<f64, 16> next_obj(
213 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
214 return sycl::vec<f64, 16>{
215 next_obj<f64>(eng, distval),
216 next_obj<f64>(eng, distval),
217 next_obj<f64>(eng, distval),
218 next_obj<f64>(eng, distval),
219 next_obj<f64>(eng, distval),
220 next_obj<f64>(eng, distval),
221 next_obj<f64>(eng, distval),
222 next_obj<f64>(eng, distval),
223 next_obj<f64>(eng, distval),
224 next_obj<f64>(eng, distval),
225 next_obj<f64>(eng, distval),
226 next_obj<f64>(eng, distval),
227 next_obj<f64>(eng, distval),
228 next_obj<f64>(eng, distval),
229 next_obj<f64>(eng, distval),
230 next_obj<f64>(eng, distval)};
231 }
232
233 template<>
234 inline sycl::vec<u16, 3> next_obj(
235 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
236 return sycl::vec<u16, 3>{
237 next_obj<u16>(eng, distval), next_obj<u16>(eng, distval), next_obj<u16>(eng, distval)};
238 }
239
240 template<>
241 inline sycl::vec<u32, 3> next_obj(
242 std::mt19937 &eng, std::uniform_real_distribution<f64> &distval) {
243 return sycl::vec<u32, 3>{
244 next_obj<u32>(eng, distval), next_obj<u32>(eng, distval), next_obj<u32>(eng, distval)};
245 }
246
247 template<class T>
249 using type = T;
250 static const i32 int_len = 1;
251 };
252
253 template<class T, i32 N>
254 struct get_base_sycl_type<sycl::vec<T, N>> {
255 using type = T;
256 static const i32 int_len = N;
257 };
258
259} // namespace shamsys::syclhelper
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