Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ArraySimdPadder.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* ArraySimdPadder.h (C) 2000-2024 */
9/* */
10/* Classe pour ajouter du 'padding' pour la vectorisation. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_ARRAYSIMDPADDER_H
13#define ARCANE_UTILS_ARRAYSIMDPADDER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Array.h"
18#include "arcane/utils/MemoryAllocator.h"
19#include "arcane/utils/FatalErrorException.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
31{
32 public:
33
39 template <typename SizeType> ARCCORE_HOST_DEVICE inline static SizeType
40 getSizeWithPadding(SizeType size)
41 {
42 if (size <= 0)
43 return 0;
44 SizeType modulo = size % SIMD_PADDING_SIZE;
45 if (modulo == 0)
46 return size;
47 // TODO: vérifier débordement.
48 SizeType padding_size = ((size / SIMD_PADDING_SIZE) + 1) * SIMD_PADDING_SIZE;
49 return padding_size;
50 }
51
52 template <typename DataType>
53 static bool isNeedPadding(Span<const DataType> ids)
54 {
55 using SizeType = Int64;
56 const SizeType size = ids.size();
57 SizeType padding_size = getSizeWithPadding(size);
58 return (padding_size > size);
59 }
60
61 template <typename DataType> ARCCORE_HOST_DEVICE static void applySimdPaddingView(Span<DataType> ids)
62 {
63 using SizeType = Int64;
64 const SizeType size = ids.size();
65 SizeType padding_size = getSizeWithPadding(size);
66 if (padding_size <= size)
67 return;
68
69 // Construit une vue avec la taille du padding
70 // pour éviter les débordement de tableau lors des tests
71 Span<DataType> padded_ids(ids.data(), padding_size);
72
73 DataType last_value = ids[size - 1];
74 for (SizeType k = size; k < padding_size; ++k)
75 padded_ids[k] = last_value;
76 }
77
78 template <typename DataType>
79 static void applySimdPadding(Array<DataType>& ids)
80 {
81 const Int64 size = ids.largeSize();
82 Int64 padding_size = getSizeWithPadding(size);
83 if (padding_size <= size)
84 return;
85 MemoryAllocationArgs args;
86 if (ids.allocator()->guarantedAlignment(args) < AlignedMemoryAllocator::simdAlignment())
87 ARCANE_FATAL("Allocator guaranted alignment ({0}) has to be greated than {1}",
88 ids.allocator()->guarantedAlignment(args), AlignedMemoryAllocator::simdAlignment());
89 if (padding_size > ids.capacity())
90 ARCANE_FATAL("Not enough capacity c={0} min_expected={1}", ids.capacity(),
91 padding_size);
92 applySimdPaddingView(ids.span());
93 }
94
95 template <typename DataType>
96 static void checkSimdPadding(Span<const DataType> ids)
97 {
98 using SizeType = Int64;
99 const Int64 size = ids.size();
100 SizeType padding_size = getSizeWithPadding(size);
101 if (padding_size <= size)
102 return;
103
104 // Construit une vue avec la taille du padding
105 // pour éviter les débordements de tableau lors des tests
106 Span<const DataType> padded_ids(ids.data(), padding_size);
107
108 // Vérifie que le padding est fait avec la dernière valeur valide.
109 SizeType last_id = ids[size - 1];
110 for (SizeType k = size; k < padding_size; ++k)
111 if (padded_ids[k] != last_id)
112 ARCANE_FATAL("Bad padding value i={0} expected={1} value={2}",
113 k, last_id, padded_ids[k]);
114 }
115};
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
119
120} // namespace Arcane
121
122/*---------------------------------------------------------------------------*/
123/*---------------------------------------------------------------------------*/
124
125#endif
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
static ARCCORE_HOST_DEVICE SizeType getSizeWithPadding(SizeType size)
Calcule la taille nécessaire pour être un multiple de SIMD_PADDING_SIZE.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
static constexpr Integer simdAlignment()
Alignement pour les structures utilisant la vectorisation.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition rapidjson.h:385