Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Simd.cc
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/* Simd.cc (C) 2000-2018 */
9/* */
10/* Types pour la vectorisation. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArcanePrecomp.h"
15
16#include "arcane/utils/Simd.h"
17#include "arcane/utils/Iostream.h"
18#include "arcane/utils/FatalErrorException.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23ARCANE_BEGIN_NAMESPACE
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27/*!
28 * \defgroup ArcaneSimd Vectorisation
29 *
30 * Ensemble des classes gérant la vectorisation.
31 * Pour plus d'informations, se reporter à la page \ref arcanedoc_parallel_simd.
32 */
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36namespace
37{
38template<typename SimdRealType> void
39_printSimd(std::ostream& o,const SimdRealType& s)
40{
41 for( Integer z=0, n=SimdRealType::BLOCK_SIZE; z<n; ++z ){
42 if (z!=0)
43 o << ' ';
44 o << s[z];
45 }
46}
47}
48
49/*---------------------------------------------------------------------------*/
50/*---------------------------------------------------------------------------*/
51
52#ifdef ARCANE_HAS_AVX512
53std::ostream&
54operator<<(std::ostream& o,const AVX512SimdReal& s)
55{
56 _printSimd(o,s);
57 return o;
58}
59#endif
60
61#ifdef ARCANE_HAS_AVX
62std::ostream&
63operator<<(std::ostream& o,const AVXSimdReal& s)
64{
65 _printSimd(o,s);
66 return o;
67}
68#endif
69
70#ifdef ARCANE_HAS_SSE
71std::ostream&
72operator<<(std::ostream& o,const SSESimdReal& s)
73{
74 _printSimd(o,s);
75 return o;
76}
77#endif
78
79std::ostream&
80operator<<(std::ostream& o,const EMULSimdReal& s)
81{
82 _printSimd(o,s);
83 return o;
84}
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88
89void SimdEnumeratorBase::
90_checkValidHelper()
91{
92 arcaneCheckAlignment(m_local_ids,SimdIndexType::Alignment);
93 if (!arcaneIsCheck())
94 return;
95 Integer size = m_count;
96 if (size==0)
97 return;
98 Integer padding_size = arcaneSizeWithPadding(size);
99 if (padding_size==size)
100 return;
101
102 // Vérifie que le padding est fait avec la dernière valeur valide.
103 Int32 last_local_id = m_local_ids[size-1];
104 for( Integer k=size; k<padding_size; ++k )
105 if (m_local_ids[k]!=last_local_id)
106 ARCANE_FATAL("Bad padding value i={0} expected={1} value={2}",
107 k,last_local_id,m_local_ids[k]);
108}
109
110/*---------------------------------------------------------------------------*/
111/*---------------------------------------------------------------------------*/
112
113ARCANE_END_NAMESPACE
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:151
Integer arcaneSizeWithPadding(Integer size)
Retourne la taille avec padding pour une taille size.
std::ostream & operator<<(std::ostream &ostr, eItemKind item_kind)
Opérateur de sortie sur un flot.
void arcaneCheckAlignment(const void *ptr, Integer alignment)
Vérifie que ptr est aligné sur alignment octets. Si ce n'est pas le cas, Sinon, lance une exception d...
Int32 Integer
Type représentant un entier.