Nektar++
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Public Attributes | Static Public Attributes | List of all members
tinysimd::details::long_simd< SimdType, Width > Struct Template Reference

#include <tinysimd.hpp>

Public Types

using scalarType = typename SimdType::scalarType
 
using scalarIndexType = scalar_index_type_t< SimdType >
 
using chunkType = SimdType
 
using chunkIndexType = simd< scalarIndexType, chunkWidth >
 
using vectorType = std::array< chunkType, numChunks >
 
using scalarArray = scalarType[width]
 

Public Member Functions

 long_simd ()=default
 
 long_simd (const long_simd &rhs)=default
 
void broadcast (const chunkType &rhs)
 
 long_simd (const vectorType &rhs)
 
 long_simd (const chunkType *rhs)
 
 long_simd (const scalarType rhs)
 
long_simdoperator= (const long_simd &)=default
 
void store (scalarType *p) const
 
template<class flag , typename std::enable_if< is_load_tag_v< flag >, bool >::type = 0>
void store (scalarType *p, flag f) const
 
void load (const scalarType *p)
 
template<class flag , typename std::enable_if< is_load_tag_v< flag >, bool >::type = 0>
void load (const scalarType *p, flag f)
 
void broadcast (const scalarType rhs)
 
template<typename IndexType >
void gather (const scalarType *p, const IndexType *indices)
 
template<typename IndexType >
void scatter (scalarType *out, const IndexType *indices) const
 
void fma (const long_simd &a, const long_simd &b)
 
void fma (const long_simd &a, const chunkType &b)
 
void fma (const chunkType &a, const long_simd &b)
 
void fma (const chunkType &a, const chunkType &b)
 
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void fma (const long_simd &a, U b)
 
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void fma (U a, const long_simd &b)
 
template<typename U , typename V , typename std::enable_if< std::is_arithmetic_v< U > &&std::is_arithmetic_v< V >, bool >::type = 0>
void fma (U a, V b)
 
scalarType operator[] (size_t i) const
 
scalarTypeoperator[] (size_t i)
 
void operator+= (const long_simd &rhs)
 
void operator+= (const chunkType &rhs)
 
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void operator+= (U rhs)
 
void operator-= (const long_simd &rhs)
 
void operator-= (const chunkType &rhs)
 
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void operator-= (U rhs)
 
void operator*= (const long_simd &rhs)
 
void operator*= (const chunkType &rhs)
 
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void operator*= (U rhs)
 
void operator/= (const long_simd &rhs)
 
void operator/= (const chunkType &rhs)
 
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void operator/= (U rhs)
 

Public Attributes

chunkType _data [numChunks]
 

Static Public Attributes

static constexpr unsigned int width = Width
 
static constexpr unsigned int alignment = SimdType::alignment
 
static constexpr unsigned int chunkWidth = SimdType::width
 
static constexpr unsigned int numChunks = width / chunkWidth
 

Detailed Description

template<typename SimdType, unsigned int Width>
struct tinysimd::details::long_simd< SimdType, Width >

Definition at line 152 of file tinysimd.hpp.

Member Typedef Documentation

◆ chunkIndexType

template<typename SimdType , unsigned int Width>
using tinysimd::details::long_simd< SimdType, Width >::chunkIndexType = simd<scalarIndexType, chunkWidth>

Definition at line 170 of file tinysimd.hpp.

◆ chunkType

template<typename SimdType , unsigned int Width>
using tinysimd::details::long_simd< SimdType, Width >::chunkType = SimdType

Definition at line 169 of file tinysimd.hpp.

◆ scalarArray

template<typename SimdType , unsigned int Width>
using tinysimd::details::long_simd< SimdType, Width >::scalarArray = scalarType[width]

Definition at line 172 of file tinysimd.hpp.

◆ scalarIndexType

template<typename SimdType , unsigned int Width>
using tinysimd::details::long_simd< SimdType, Width >::scalarIndexType = scalar_index_type_t<SimdType>

Definition at line 168 of file tinysimd.hpp.

◆ scalarType

template<typename SimdType , unsigned int Width>
using tinysimd::details::long_simd< SimdType, Width >::scalarType = typename SimdType::scalarType

Definition at line 167 of file tinysimd.hpp.

◆ vectorType

template<typename SimdType , unsigned int Width>
using tinysimd::details::long_simd< SimdType, Width >::vectorType = std::array<chunkType, numChunks>

Definition at line 171 of file tinysimd.hpp.

Constructor & Destructor Documentation

◆ long_simd() [1/5]

template<typename SimdType , unsigned int Width>
tinysimd::details::long_simd< SimdType, Width >::long_simd ( )
inlinedefault

◆ long_simd() [2/5]

template<typename SimdType , unsigned int Width>
tinysimd::details::long_simd< SimdType, Width >::long_simd ( const long_simd< SimdType, Width > &  rhs)
inlinedefault

◆ long_simd() [3/5]

template<typename SimdType , unsigned int Width>
tinysimd::details::long_simd< SimdType, Width >::long_simd ( const vectorType rhs)
inline

Definition at line 193 of file tinysimd.hpp.

194 {
196 for (size_t i = 0; i < numChunks; ++i)
197 {
198 _data[i] = rhs[i];
199 }
200 }
chunkType _data[numChunks]
Definition tinysimd.hpp:177
static constexpr unsigned int numChunks
Definition tinysimd.hpp:160
#define TINYSIMD_PRAGMA_UNROLL
Definition tinysimd.hpp:126

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ long_simd() [4/5]

template<typename SimdType , unsigned int Width>
tinysimd::details::long_simd< SimdType, Width >::long_simd ( const chunkType rhs)
inline

Definition at line 202 of file tinysimd.hpp.

203 {
205 for (size_t i = 0; i < numChunks; ++i)
206 {
207 _data[i] = rhs[i];
208 }
209 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ long_simd() [5/5]

template<typename SimdType , unsigned int Width>
tinysimd::details::long_simd< SimdType, Width >::long_simd ( const scalarType  rhs)
inline

Definition at line 211 of file tinysimd.hpp.

212 {
213 broadcast(chunkType(rhs));
214 }
void broadcast(const chunkType &rhs)
Definition tinysimd.hpp:182

References tinysimd::details::long_simd< SimdType, Width >::broadcast().

Member Function Documentation

◆ broadcast() [1/2]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::broadcast ( const chunkType rhs)
inline

◆ broadcast() [2/2]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::broadcast ( const scalarType  rhs)
inline

Definition at line 258 of file tinysimd.hpp.

259 {
260 broadcast(chunkType(rhs));
261 }

References tinysimd::details::long_simd< SimdType, Width >::broadcast().

◆ fma() [1/7]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::fma ( const chunkType a,
const chunkType b 
)
inline

Definition at line 310 of file tinysimd.hpp.

311 {
312 const chunkType ab = a * b;
313 *this += ab;
314 }

◆ fma() [2/7]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::fma ( const chunkType a,
const long_simd< SimdType, Width > &  b 
)
inline

Definition at line 301 of file tinysimd.hpp.

302 {
304 for (size_t i = 0; i < numChunks; ++i)
305 {
306 _data[i].fma(a, b._data[i]);
307 }
308 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ fma() [3/7]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::fma ( const long_simd< SimdType, Width > &  a,
const chunkType b 
)
inline

Definition at line 292 of file tinysimd.hpp.

293 {
295 for (size_t i = 0; i < numChunks; ++i)
296 {
297 _data[i].fma(a._data[i], b);
298 }
299 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ fma() [4/7]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::fma ( const long_simd< SimdType, Width > &  a,
const long_simd< SimdType, Width > &  b 
)
inline

◆ fma() [5/7]

template<typename SimdType , unsigned int Width>
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void tinysimd::details::long_simd< SimdType, Width >::fma ( const long_simd< SimdType, Width > &  a,
b 
)
inline

Definition at line 318 of file tinysimd.hpp.

319 {
320 fma(a, chunkType(static_cast<scalarType>(b)));
321 }
void fma(const long_simd &a, const long_simd &b)
Definition tinysimd.hpp:283
typename SimdType::scalarType scalarType
Definition tinysimd.hpp:167

References tinysimd::details::long_simd< SimdType, Width >::fma().

◆ fma() [6/7]

template<typename SimdType , unsigned int Width>
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void tinysimd::details::long_simd< SimdType, Width >::fma ( a,
const long_simd< SimdType, Width > &  b 
)
inline

Definition at line 325 of file tinysimd.hpp.

326 {
327 fma(chunkType(static_cast<scalarType>(a)), b);
328 }

References tinysimd::details::long_simd< SimdType, Width >::fma().

◆ fma() [7/7]

template<typename SimdType , unsigned int Width>
template<typename U , typename V , typename std::enable_if< std::is_arithmetic_v< U > &&std::is_arithmetic_v< V >, bool >::type = 0>
void tinysimd::details::long_simd< SimdType, Width >::fma ( a,
b 
)
inline

Definition at line 334 of file tinysimd.hpp.

335 {
336 fma(chunkType(static_cast<scalarType>(a)),
337 chunkType(static_cast<scalarType>(b)));
338 }

References tinysimd::details::long_simd< SimdType, Width >::fma().

◆ gather()

template<typename SimdType , unsigned int Width>
template<typename IndexType >
void tinysimd::details::long_simd< SimdType, Width >::gather ( const scalarType p,
const IndexType *  indices 
)
inline

Definition at line 264 of file tinysimd.hpp.

265 {
267 for (size_t i = 0; i < numChunks; ++i)
268 {
269 _data[i].gather(p, indices[i]);
270 }
271 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ load() [1/2]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::load ( const scalarType p)
inline

◆ load() [2/2]

template<typename SimdType , unsigned int Width>
template<class flag , typename std::enable_if< is_load_tag_v< flag >, bool >::type = 0>
void tinysimd::details::long_simd< SimdType, Width >::load ( const scalarType p,
flag  f 
)
inline

◆ operator*=() [1/3]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::operator*= ( const chunkType rhs)
inline

Definition at line 412 of file tinysimd.hpp.

413 {
415 for (size_t i = 0; i < numChunks; ++i)
416 {
417 _data[i] *= rhs;
418 }
419 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ operator*=() [2/3]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::operator*= ( const long_simd< SimdType, Width > &  rhs)
inline

Definition at line 403 of file tinysimd.hpp.

404 {
406 for (size_t i = 0; i < numChunks; ++i)
407 {
408 _data[i] *= rhs._data[i];
409 }
410 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ operator*=() [3/3]

template<typename SimdType , unsigned int Width>
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void tinysimd::details::long_simd< SimdType, Width >::operator*= ( rhs)
inline

Definition at line 423 of file tinysimd.hpp.

424 {
425 *this *= chunkType(static_cast<scalarType>(rhs));
426 }

◆ operator+=() [1/3]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::operator+= ( const chunkType rhs)
inline

Definition at line 362 of file tinysimd.hpp.

363 {
365 for (size_t i = 0; i < numChunks; ++i)
366 {
367 _data[i] += rhs;
368 }
369 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ operator+=() [2/3]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::operator+= ( const long_simd< SimdType, Width > &  rhs)
inline

Definition at line 353 of file tinysimd.hpp.

354 {
356 for (size_t i = 0; i < numChunks; ++i)
357 {
358 _data[i] += rhs._data[i];
359 }
360 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ operator+=() [3/3]

template<typename SimdType , unsigned int Width>
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void tinysimd::details::long_simd< SimdType, Width >::operator+= ( rhs)
inline

Definition at line 373 of file tinysimd.hpp.

374 {
375 *this += chunkType(static_cast<scalarType>(rhs));
376 }

◆ operator-=() [1/3]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::operator-= ( const chunkType rhs)
inline

Definition at line 387 of file tinysimd.hpp.

388 {
390 for (size_t i = 0; i < numChunks; ++i)
391 {
392 _data[i] -= rhs;
393 }
394 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ operator-=() [2/3]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::operator-= ( const long_simd< SimdType, Width > &  rhs)
inline

Definition at line 378 of file tinysimd.hpp.

379 {
381 for (size_t i = 0; i < numChunks; ++i)
382 {
383 _data[i] -= rhs._data[i];
384 }
385 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ operator-=() [3/3]

template<typename SimdType , unsigned int Width>
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void tinysimd::details::long_simd< SimdType, Width >::operator-= ( rhs)
inline

Definition at line 398 of file tinysimd.hpp.

399 {
400 *this -= chunkType(static_cast<scalarType>(rhs));
401 }

◆ operator/=() [1/3]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::operator/= ( const chunkType rhs)
inline

Definition at line 437 of file tinysimd.hpp.

438 {
440 for (size_t i = 0; i < numChunks; ++i)
441 {
442 _data[i] /= rhs;
443 }
444 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ operator/=() [2/3]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::operator/= ( const long_simd< SimdType, Width > &  rhs)
inline

Definition at line 428 of file tinysimd.hpp.

429 {
431 for (size_t i = 0; i < numChunks; ++i)
432 {
433 _data[i] /= rhs._data[i];
434 }
435 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ operator/=() [3/3]

template<typename SimdType , unsigned int Width>
template<typename U , typename std::enable_if< std::is_arithmetic_v< U >, bool >::type = 0>
void tinysimd::details::long_simd< SimdType, Width >::operator/= ( rhs)
inline

Definition at line 448 of file tinysimd.hpp.

449 {
450 *this /= chunkType(static_cast<scalarType>(rhs));
451 }

◆ operator=()

template<typename SimdType , unsigned int Width>
long_simd & tinysimd::details::long_simd< SimdType, Width >::operator= ( const long_simd< SimdType, Width > &  )
inlinedefault

◆ operator[]() [1/2]

template<typename SimdType , unsigned int Width>
scalarType & tinysimd::details::long_simd< SimdType, Width >::operator[] ( size_t  i)
inline

Definition at line 347 of file tinysimd.hpp.

348 {
349 scalarType *tmp = reinterpret_cast<scalarType *>(_data);
350 return tmp[i];
351 }

References tinysimd::details::long_simd< SimdType, Width >::_data.

◆ operator[]() [2/2]

template<typename SimdType , unsigned int Width>
scalarType tinysimd::details::long_simd< SimdType, Width >::operator[] ( size_t  i) const
inline

Definition at line 340 of file tinysimd.hpp.

341 {
342 alignas(alignment) scalarArray tmp;
343 store(tmp, is_aligned);
344 return tmp[i];
345 }
static constexpr struct tinysimd::is_aligned_t is_aligned
scalarType[width] scalarArray
Definition tinysimd.hpp:172
void store(scalarType *p) const
Definition tinysimd.hpp:218
static constexpr unsigned int alignment
Definition tinysimd.hpp:158

References tinysimd::details::long_simd< SimdType, Width >::alignment, tinysimd::is_aligned, and tinysimd::details::long_simd< SimdType, Width >::store().

◆ scatter()

template<typename SimdType , unsigned int Width>
template<typename IndexType >
void tinysimd::details::long_simd< SimdType, Width >::scatter ( scalarType out,
const IndexType *  indices 
) const
inline

Definition at line 274 of file tinysimd.hpp.

275 {
277 for (size_t i = 0; i < numChunks; ++i)
278 {
279 _data[i].scatter(out, indices[i]);
280 }
281 }

References tinysimd::details::long_simd< SimdType, Width >::_data, tinysimd::details::long_simd< SimdType, Width >::numChunks, and TINYSIMD_PRAGMA_UNROLL.

◆ store() [1/2]

template<typename SimdType , unsigned int Width>
void tinysimd::details::long_simd< SimdType, Width >::store ( scalarType p) const
inline

◆ store() [2/2]

template<typename SimdType , unsigned int Width>
template<class flag , typename std::enable_if< is_load_tag_v< flag >, bool >::type = 0>
void tinysimd::details::long_simd< SimdType, Width >::store ( scalarType p,
flag  f 
) const
inline

Member Data Documentation

◆ _data

template<typename SimdType , unsigned int Width>
chunkType tinysimd::details::long_simd< SimdType, Width >::_data[numChunks]

◆ alignment

template<typename SimdType , unsigned int Width>
constexpr unsigned int tinysimd::details::long_simd< SimdType, Width >::alignment = SimdType::alignment
staticconstexpr

◆ chunkWidth

template<typename SimdType , unsigned int Width>
constexpr unsigned int tinysimd::details::long_simd< SimdType, Width >::chunkWidth = SimdType::width
staticconstexpr

◆ numChunks

template<typename SimdType , unsigned int Width>
constexpr unsigned int tinysimd::details::long_simd< SimdType, Width >::numChunks = width / chunkWidth
staticconstexpr

◆ width

template<typename SimdType , unsigned int Width>
constexpr unsigned int tinysimd::details::long_simd< SimdType, Width >::width = Width
staticconstexpr

Definition at line 157 of file tinysimd.hpp.