Nektar++
Functions
Nektar::VmathSIMDUnitTests Namespace Reference

Functions

 BOOST_AUTO_TEST_CASE (TestVadd)
 
 BOOST_AUTO_TEST_CASE (TestVmul)
 
 BOOST_AUTO_TEST_CASE (TestVvtvp)
 
 BOOST_AUTO_TEST_CASE (TestVvtvvtp)
 
 BOOST_AUTO_TEST_CASE (TestGathrSizet)
 
 BOOST_AUTO_TEST_CASE (TestGathrInt)
 

Function Documentation

◆ BOOST_AUTO_TEST_CASE() [1/6]

Nektar::VmathSIMDUnitTests::BOOST_AUTO_TEST_CASE ( TestGathrInt  )

Definition at line 307 of file TestVmathSIMD.cpp.

308{
309 using dataType = double;
310 constexpr size_t n = 30;
311 std::array<dataType, n> x;
312 constexpr int ni = 13;
313 std::array<int, ni> y;
314 std::array<dataType, ni> z;
315
316 dataType epsilon = std::numeric_limits<dataType>::epsilon();
317
318 // init
319 for (size_t i = 0; i < n; ++i)
320 {
321 x[i] = i;
322 }
323
324 y[0] = 0;
325 y[1] = 3;
326 y[2] = 4;
327 y[3] = 7;
328 y[4] = 10;
329 y[5] = 11;
330 y[6] = 12;
331 y[7] = 15;
332 y[8] = 16;
333 y[9] = 20;
334 y[10] = 21;
335 y[11] = 22;
336 y[12] = 27;
337
338 // test z = x[y]
339 Vmath::SIMD::Gathr(ni, x.data(), y.data(), z.data());
340
341 for (size_t i = 0; i < ni; ++i)
342 {
343 BOOST_CHECK_CLOSE(z[i], x[y[i]], epsilon);
344 }
345}
std::vector< double > z(NPUPPER)
void Gathr(const I n, const T *x, const I *y, T *z)
Gather vector z[i] = x[y[i]].
Definition: VmathSIMD.hpp:474

References Vmath::SIMD::Gathr(), and Nektar::UnitTests::z().

◆ BOOST_AUTO_TEST_CASE() [2/6]

Nektar::VmathSIMDUnitTests::BOOST_AUTO_TEST_CASE ( TestGathrSizet  )

Definition at line 275 of file TestVmathSIMD.cpp.

276{
277 using dataType = double;
278 constexpr size_t n = 11;
279 std::array<dataType, n> x;
280 constexpr size_t ni = 5;
281 std::array<size_t, ni> y;
282 std::array<dataType, ni> z;
283
284 dataType epsilon = std::numeric_limits<dataType>::epsilon();
285
286 // init
287 for (size_t i = 0; i < n; ++i)
288 {
289 x[i] = i;
290 }
291
292 y[0] = 0;
293 y[1] = 3;
294 y[2] = 4;
295 y[3] = 7;
296 y[4] = 10;
297
298 // test z = x[y]
299 Vmath::SIMD::Gathr(ni, x.data(), y.data(), z.data());
300
301 for (size_t i = 0; i < ni; ++i)
302 {
303 BOOST_CHECK_CLOSE(z[i], x[y[i]], epsilon);
304 }
305}

References Vmath::SIMD::Gathr(), and Nektar::UnitTests::z().

◆ BOOST_AUTO_TEST_CASE() [3/6]

Nektar::VmathSIMDUnitTests::BOOST_AUTO_TEST_CASE ( TestVadd  )

Definition at line 46 of file TestVmathSIMD.cpp.

47{
48 using dataType = double;
49 constexpr size_t n = 31;
50 alignas(tinysimd::simd<dataType>::alignment) std::array<dataType, n> x, y,
51 z;
52 dataType epsilon = std::numeric_limits<dataType>::epsilon();
53
54 // init
55 for (size_t i = 0; i < n; ++i)
56 {
57 x[i] = 1.0;
58 y[i] = 1.0;
59 }
60 // test z = x + y
61 Vmath::SIMD::Vadd(n, x.data(), y.data(), z.data());
62
63 for (size_t i = 0; i < n; ++i)
64 {
65 BOOST_CHECK_CLOSE(z[i], 2.0, epsilon);
66 }
67
68 // ---------------------------------------------------------------------
69
70 // init
71 for (size_t i = 0; i < n; ++i)
72 {
73 x[i] = 2.0;
74 y[i] = 0.0;
75 }
76 // test z = x + y
77 Vmath::SIMD::Vadd(n, x.data(), y.data(), z.data());
78
79 for (size_t i = 0; i < n; ++i)
80 {
81 BOOST_CHECK_CLOSE(z[i], 2.0, epsilon);
82 }
83
84 // ---------------------------------------------------------------------
85
86 // init
87 for (size_t i = 0; i < n; ++i)
88 {
89 x[i] = 0.0;
90 y[i] = -2.0;
91 }
92 // test z = x + y
93 Vmath::SIMD::Vadd(n, x.data(), y.data(), z.data());
94
95 for (size_t i = 0; i < n; ++i)
96 {
97 BOOST_CHECK_CLOSE(z[i], -2.0, epsilon);
98 }
99}
void Vadd(const size_t n, const T *x, const T *y, T *z)
Add vector z = x + y.
Definition: VmathSIMD.hpp:49
typename abi< ScalarType, width >::type simd
Definition: tinysimd.hpp:80

References Vmath::SIMD::Vadd(), and Nektar::UnitTests::z().

◆ BOOST_AUTO_TEST_CASE() [4/6]

Nektar::VmathSIMDUnitTests::BOOST_AUTO_TEST_CASE ( TestVmul  )

Definition at line 101 of file TestVmathSIMD.cpp.

102{
103 using dataType = double;
104 constexpr size_t n = 31;
105 alignas(tinysimd::simd<dataType>::alignment) std::array<dataType, n> x, y,
106 z;
107 dataType epsilon = std::numeric_limits<dataType>::epsilon();
108
109 // init
110 for (size_t i = 0; i < n; ++i)
111 {
112 x[i] = 1.0;
113 y[i] = i;
114 }
115 // test z = x + y
116 Vmath::SIMD::Vmul(n, x.data(), y.data(), z.data());
117
118 for (size_t i = 0; i < n; ++i)
119 {
120 BOOST_CHECK_CLOSE(z[i], i, epsilon);
121 }
122
123 // ---------------------------------------------------------------------
124
125 // init
126 for (size_t i = 0; i < n; ++i)
127 {
128 x[i] = 2.0;
129 y[i] = 0.0;
130 }
131 // test z = x + y
132 Vmath::SIMD::Vmul(n, x.data(), y.data(), z.data());
133
134 for (size_t i = 0; i < n; ++i)
135 {
136 BOOST_CHECK_CLOSE(z[i], 0.0, epsilon);
137 }
138
139 // ---------------------------------------------------------------------
140
141 // init
142 for (size_t i = 0; i < n; ++i)
143 {
144 x[i] = -1.0;
145 y[i] = 2.0;
146 }
147 // test z = x + y
148 Vmath::SIMD::Vmul(n, x.data(), y.data(), z.data());
149
150 for (size_t i = 0; i < n; ++i)
151 {
152 BOOST_CHECK_CLOSE(z[i], -2.0, epsilon);
153 }
154}
void Vmul(const size_t n, const T *x, const T *y, T *z)
Multiply vector z = x * y.
Definition: VmathSIMD.hpp:155

References Vmath::SIMD::Vmul(), and Nektar::UnitTests::z().

◆ BOOST_AUTO_TEST_CASE() [5/6]

Nektar::VmathSIMDUnitTests::BOOST_AUTO_TEST_CASE ( TestVvtvp  )

Definition at line 156 of file TestVmathSIMD.cpp.

157{
158 using dataType = double;
159 constexpr size_t n = 11;
160 alignas(tinysimd::simd<dataType>::alignment) std::array<dataType, n> w, x,
161 y, z;
162 dataType epsilon = std::numeric_limits<dataType>::epsilon();
163
164 // init
165 for (size_t i = 0; i < n; ++i)
166 {
167 w[i] = 1.0;
168 x[i] = 1.0;
169 y[i] = 1.0;
170 }
171 // test z = w * x + y
172 Vmath::SIMD::Vvtvp(n, w.data(), x.data(), y.data(), z.data());
173
174 for (size_t i = 0; i < n; ++i)
175 {
176 BOOST_CHECK_CLOSE(z[i], 2.0, epsilon);
177 }
178
179 // ---------------------------------------------------------------------
180
181 // init
182 for (size_t i = 0; i < n; ++i)
183 {
184 w[i] = 0.0;
185 x[i] = 1.5;
186 y[i] = 0.5;
187 }
188 // test z = w * x + y
189 Vmath::SIMD::Vvtvp(n, w.data(), x.data(), y.data(), z.data());
190
191 for (size_t i = 0; i < n; ++i)
192 {
193 BOOST_CHECK_CLOSE(z[i], 0.5, epsilon);
194 }
195
196 // ---------------------------------------------------------------------
197
198 // init
199 for (size_t i = 0; i < n; ++i)
200 {
201 w[i] = 1.0;
202 x[i] = 0.5;
203 y[i] = 0.0;
204 }
205 // test z = w * x + y
206 Vmath::SIMD::Vvtvp(n, w.data(), x.data(), y.data(), z.data());
207
208 for (size_t i = 0; i < n; ++i)
209 {
210 BOOST_CHECK_CLOSE(z[i], 0.5, epsilon);
211 }
212}
std::vector< double > w(NPUPPER)
void Vvtvp(const size_t n, const T *w, const T *x, const T *y, T *z)
vvtvp (vector times vector plus vector): z = w*x + y
Definition: VmathSIMD.hpp:261

References Vmath::SIMD::Vvtvp(), Nektar::UnitTests::w(), and Nektar::UnitTests::z().

◆ BOOST_AUTO_TEST_CASE() [6/6]

Nektar::VmathSIMDUnitTests::BOOST_AUTO_TEST_CASE ( TestVvtvvtp  )

Definition at line 214 of file TestVmathSIMD.cpp.

215{
216 using dataType = double;
217 constexpr size_t n = 11;
218 alignas(tinysimd::simd<dataType>::alignment) std::array<dataType, n> v, w,
219 x, y, z;
220 dataType epsilon = std::numeric_limits<dataType>::epsilon();
221
222 // init
223 for (size_t i = 0; i < n; ++i)
224 {
225 v[i] = 1.0;
226 w[i] = 1.0;
227 x[i] = 1.0;
228 y[i] = 1.0;
229 }
230 // test z = v * w + y * z;
231 Vmath::SIMD::Vvtvvtp(n, v.data(), w.data(), x.data(), y.data(), z.data());
232
233 for (size_t i = 0; i < n; ++i)
234 {
235 BOOST_CHECK_CLOSE(z[i], 2.0, epsilon);
236 }
237
238 // ---------------------------------------------------------------------
239
240 // init
241 for (size_t i = 0; i < n; ++i)
242 {
243 v[i] = 1.0;
244 w[i] = 0.0;
245 x[i] = 0.5;
246 y[i] = 1.0;
247 }
248 // test z = v * w + y * z;
249 Vmath::SIMD::Vvtvvtp(n, v.data(), w.data(), x.data(), y.data(), z.data());
250
251 for (size_t i = 0; i < n; ++i)
252 {
253 BOOST_CHECK_CLOSE(z[i], 0.5, epsilon);
254 }
255
256 // ---------------------------------------------------------------------
257
258 // init
259 for (size_t i = 0; i < n; ++i)
260 {
261 v[i] = 0.5;
262 w[i] = 1.0;
263 x[i] = 0.0;
264 y[i] = 1.0;
265 }
266 // test z = v * w + y * z;
267 Vmath::SIMD::Vvtvvtp(n, v.data(), w.data(), x.data(), y.data(), z.data());
268
269 for (size_t i = 0; i < n; ++i)
270 {
271 BOOST_CHECK_CLOSE(z[i], 0.5, epsilon);
272 }
273}
void Vvtvvtp(const size_t n, const T *v, const T *w, const T *x, const T *y, T *z)
vvtvvtp (vector times vector plus vector times vector):
Definition: VmathSIMD.hpp:358

References Vmath::SIMD::Vvtvvtp(), Nektar::UnitTests::w(), and Nektar::UnitTests::z().