46 static const int BLOCK_SIZE = 8;
57 AVX512SimdReal(__m512d _v0)
60 explicit AVX512SimdReal(
Real r)
61 : v0(_mm512_set1_pd(r))
67 : v0(_mm512_set_pd(a7, a6, a5, a4, a3, a2, a1, a0))
72 AVX512SimdReal(
const Real* base,
const Int32* idx)
74#ifdef ARCANE_USE_AVX512_SCATTERGATHER
75 __m256i idx2 = _mm256_loadu_si256((__m256i*)idx);
76 v0 = _mm512_i32gather_pd(idx2, (
Real*)base, 8);
78 v0 = _mm512_set_pd(base[idx[7]], base[idx[6]], base[idx[5]], base[idx[4]],
79 base[idx[3]], base[idx[2]], base[idx[1]], base[idx[0]]);
82 AVX512SimdReal(
const Real* base,
const Int32IndexType* simd_idx)
83 : AVX512SimdReal(base, (
const Int32*)simd_idx)
86 AVX512SimdReal(
const Real* base,
const Int32IndexType& simd_idx)
87#ifdef ARCANE_USE_AVX512_SCATTERGATHER
88 : v0(_mm512_i32gather_pd(simd_idx.v0, base, 8))
90 : AVX512SimdReal(base, (
const Int32*)simd_idx)
97 : v0(_mm512_load_pd(base))
101 Real& operator[](Integer i) {
return ((Real*)&v0)[i]; }
104 void set(ARCANE_RESTRICT Real* base,
const ARCANE_RESTRICT Int32* idx)
const
106#ifdef ARCANE_USE_AVX512_SCATTERGATHER
107 __m256i idx2 = _mm256_loadu_si256((__m256i*)idx);
108 _mm512_i32scatter_pd(base, idx2, v0, 8);
110 const Real* x = (
const Real*)(
this);
122 void set(ARCANE_RESTRICT Real* base,
const Int32IndexType* simd_idx)
const
124 this->set(base, (
const Int32*)simd_idx);
127 void set(ARCANE_RESTRICT Real* base,
const Int32IndexType& simd_idx)
const
129#ifdef ARCANE_USE_AVX512_SCATTERGATHER
130 _mm512_i32scatter_pd(base, simd_idx.v0, v0, 8);
132 this->set(base, &simd_idx);
139 _mm512_store_pd(base, v0);
148 inline AVX512SimdReal operator-()
const
150 return AVX512SimdReal(_mm512_sub_pd(_mm512_setzero_pd(), v0));
155 void operator=(Real _v);