Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SimdAVX512.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* SimdAVX512.h (C) 2000-2016 */
9/* */
10/* Vectorisation pour l'AVX512. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_SIMDAVX512_H
13#define ARCANE_UTILS_SIMDAVX512_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16/*
17 * Ce fichier ne doit pas être inclus directement.
18 * Utiliser 'Simd.h' à la place.
19 */
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23// A définir si on souhaite utiliser directement les instructions
24// de scatter/gather de l'AVX512.
25// Il n'y a priori aucune raison de ne pas le faire.
26#define ARCANE_USE_AVX512_SCATTERGATHER
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31ARCANE_BEGIN_NAMESPACE
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
40{
41 public:
42 static const int BLOCK_SIZE = 8;
43 enum
44 {
45 Length = 8
46 };
48 public:
49 __m512d v0;
52 explicit AVX512SimdReal(Real r)
53 : v0(_mm512_set1_pd(r)){}
54 protected:
55 AVX512SimdReal(Real a7,Real a6,Real a5,Real a4,Real a3,Real a2,Real a1,Real a0)
56 : v0(_mm512_set_pd(a7,a6,a5,a4,a3,a2,a1,a0)){}
57 public:
58 AVX512SimdReal(const Real* base,const Int32* idx)
59 {
60#ifdef ARCANE_USE_AVX512_SCATTERGATHER
62 v0 = _mm512_i32gather_pd(idx2,(Real*)base, 8);
63#else
64 v0 = _mm512_set_pd(base[idx[7]],base[idx[6]],base[idx[5]],base[idx[4]],
65 base[idx[3]],base[idx[2]],base[idx[1]],base[idx[0]]);
66#endif
67 }
68 AVX512SimdReal(const Real* base,const Int32IndexType* simd_idx)
69 : AVX512SimdReal(base,(const Int32*)simd_idx) { }
70
71 AVX512SimdReal(const Real* base,const Int32IndexType& simd_idx)
72#ifdef ARCANE_USE_AVX512_SCATTERGATHER
73 : v0(_mm512_i32gather_pd(simd_idx.v0,base,8))
74#else
75 : AVX512SimdReal(base,(const Int32*)simd_idx)
76#endif
77 {
78 }
79
81 explicit AVX512SimdReal(const Real* base)
82 : v0(_mm512_load_pd(base)) { }
83
84 Real operator[](Integer i) const { return ((const Real*)&v0)[i]; }
85 Real& operator[](Integer i) { return ((Real*)&v0)[i]; }
86
87 // TODO: faire une surcharge qui prend directement un vecteur de Int32 avec alignement.
88 void set(ARCANE_RESTRICT Real* base,const ARCANE_RESTRICT Int32* idx) const
89 {
90#ifdef ARCANE_USE_AVX512_SCATTERGATHER
91 __m256i idx2 = _mm256_loadu_si256((__m256i*)idx);
92 _mm512_i32scatter_pd(base,idx2,v0, 8);
93#else
94 const Real* x = (const Real*)(this);
95 base[idx[0]] = x[0];
96 base[idx[1]] = x[1];
97 base[idx[2]] = x[2];
98 base[idx[3]] = x[3];
99 base[idx[4]] = x[4];
100 base[idx[5]] = x[5];
101 base[idx[6]] = x[6];
102 base[idx[7]] = x[7];
103#endif
104 }
105
106 void set(ARCANE_RESTRICT Real* base,const Int32IndexType* simd_idx) const
107 {
108 this->set(base,(const Int32*)simd_idx);
109 }
110
111 void set(ARCANE_RESTRICT Real* base,const Int32IndexType& simd_idx) const
112 {
113#ifdef ARCANE_USE_AVX512_SCATTERGATHER
114 _mm512_i32scatter_pd(base,simd_idx.v0,v0, 8);
115#else
116 this->set(base,&simd_idx);
117#endif
118 }
119
121 void set(ARCANE_RESTRICT Real* base) const
122 {
123 _mm512_store_pd(base,v0);
124 }
125
126 static AVX512SimdReal fromScalar(Real a0,Real a1,Real a2,Real a3,Real a4,Real a5,Real a6,Real a7)
127 {
128 return AVX512SimdReal(a7,a6,a5,a4,a3,a2,a1,a0);
129 }
130
131 // Unary operation operator-
132 inline AVX512SimdReal operator- () const
133 {
134 return AVX512SimdReal(_mm512_sub_pd(_mm512_setzero_pd(),v0));
135 }
136
137 private:
138 void operator=(Real _v);
139};
140
141/*---------------------------------------------------------------------------*/
142/*---------------------------------------------------------------------------*/
143
145{
146 public:
147 static const char* name() { return "AVX512"; }
148 enum
149 {
150 Int32IndexSize = 8
151 };
152 typedef AVX512SimdReal SimdReal;
154};
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
159ARCANE_UTILS_EXPORT std::ostream& operator<<(std::ostream& o,const AVX512SimdReal& s);
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
164ARCANE_END_NAMESPACE
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168
169#endif
#define ARCANE_ALIGNAS_PACKED(value)
Macro pour garantir le compactage et l'alignement d'une classe sur value octets.
Vectorisation des réels en utilisant la vectorisation du AVX512.
Definition SimdAVX512.h:40
void set(ARCANE_RESTRICT Real *base) const
Stocke les valeurs de l'instance à l'adresse base qui doit être alignée.
Definition SimdAVX512.h:121
AVX512SimdReal(const Real *base)
Charge les valeurs continues situées à l'adresse base qui doit être alignée.
Definition SimdAVX512.h:81
Vectorisation des entiers Int32 en utilisant AVX.
Definition SimdAVX.h:44
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120