Arcane  v3.15.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
IndexSelecter.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/* IndexSelecter.h (C) 2000-2024 */
9/* */
10/* Selection d'index avec API accélérateur */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15
16#include "arcane/accelerator/core/Memory.h"
17#include "arcane/accelerator/GenericFilterer.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane::Accelerator
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
33{
34 public:
35
36 IndexSelecter() {}
38 // -------------------------------------------------------
39 {
40 m_is_accelerator_policy = isAcceleratorPolicy(runqueue.executionPolicy());
41 m_memory_host = eMemoryRessource(m_is_accelerator_policy ? eMemoryRessource::HostPinned : eMemoryRessource::Host);
42 m_memory_device = eMemoryRessource(m_is_accelerator_policy ? eMemoryRessource::Device : eMemoryRessource::Host);
43 m_localid_select_device = UniqueArray<Int32>(MemoryUtils::getAllocator(m_memory_device));
44 m_localid_select_host = UniqueArray<Int32>(MemoryUtils::getAllocator(m_memory_host));
45 }
46
48 {
50 }
51
55 void resize(Int32 nb_idx)
56 {
58 m_localid_select_device.resize(m_index_number);
59 m_localid_select_host.resize(m_index_number);
60 }
61
66 template <typename PredicateType>
68 {
69 // On essaie de réutiliser au maximum la même instance de GenericFilterer
70 // afin de minimiser des allocations dynamiques dans cette classe.
71 // L'instance du GenericFilterer dépend du pointeur de RunQueue donc
72 // si ce pointeur change, il faut détruire et réallouer une nouvelle instance.
77 to_instantiate = true;
78 }
79 if (to_instantiate) {
81 }
82
83 // On sélectionne dans [0,m_index_number[ les indices i pour lesquels pred(i) est vrai
84 // et on les copie dans out_lid_select.
85 // Le nb d'indices sélectionnés est donné par nbOutputElement()
86 SmallSpan<Int32> out_lid_select(m_localid_select_device.data(), m_index_number);
87
89 [=] ARCCORE_HOST_DEVICE(Int32 input_index, Int32 output_index) -> void {
91 });
93
95 // Copie asynchrone Device to Host (m_localid_select_device ==> m_localid_select_host)
96 rqueue_async.copyMemory(MemoryCopyArgs(m_localid_select_host.subView(0, nb_idx_selected).data(),
97 m_localid_select_device.subView(0, nb_idx_selected).data(),
98 nb_idx_selected * sizeof(Int32))
99 .addAsync());
100 }
101 rqueue_async.barrier();
102
103 ConstArrayView<Int32> lid_select_view = (host_view ? m_localid_select_host.subConstView(0, nb_idx_selected) : m_localid_select_device.subConstView(0, nb_idx_selected));
104
105 return lid_select_view;
106 }
107
108 private:
109
110 bool m_is_accelerator_policy = false; // indique si l'accélérateur est disponible ou non
111 eMemoryRessource m_memory_host; // identification de l'allocateur HOST
112 eMemoryRessource m_memory_device; // identification de l'allocateur DEVICE
113 UniqueArray<Int32> m_localid_select_device; // liste des identifiants sélectionnés avec un Filterer (alloué sur DEVICE)
114 UniqueArray<Int32> m_localid_select_host; // liste des identifiants sélectionnés avec un Filterer (alloué sur HOST)
115
116 Int32 m_index_number = 0;
117
120};
121
122/*---------------------------------------------------------------------------*/
123/*---------------------------------------------------------------------------*/
124
125} // namespace Arcane::Accelerator
126
127/*---------------------------------------------------------------------------*/
128/*---------------------------------------------------------------------------*/
Fonctions de gestion mémoire et des allocateurs.
Algorithme générique de filtrage sur accélérateur.
void applyWithIndex(Int32 nb_value, const SelectLambda &select_lambda, const SetterLambda &setter_lambda, const TraceInfo &trace_info=TraceInfo())
Applique un filtre avec une sélection suivant un index.
Int32 nbOutputElement()
Nombre d'éléments en sortie.
Construction d'un sous-ensemble d'indexes à partir d'un critère.
void resize(Int32 nb_idx)
Définit l'intervalle [0,nb_idx[ sur lequel va s'opérer la sélection.
GenericFilterer * m_generic_filterer_instance
Instance du GenericFilterer.
Int32 m_index_number
Intervalle [0, m_index_number[ sur lequel on va opérer la sélection.
RunQueue m_asynchronous_queue_pointer
Pointeur sur la queue du GenericFilterer.
ConstArrayView< Int32 > syncSelectIf(const RunQueue &rqueue_async, PredicateType pred, bool host_view=false)
Selectionne les indices selon le prédicat pred et synchronise rqueue_async.
Arguments pour la copie mémoire.
Definition Memory.h:63
File d'exécution pour un accélérateur.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
const T * data() const
Accès à la racine du tableau hors toute protection.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
ArrayView< T > subView(Int64 abegin, Integer asize)
Sous-vue à partir de l'élément abegin et contenant asize éléments.
ConstArrayView< T > subConstView(Int64 abegin, Int32 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Espace de nom pour l'utilisation des accélérateurs.
bool isAcceleratorPolicy(eExecutionPolicy exec_policy)
Indique si exec_policy correspond à un accélérateur.
IMemoryAllocator * getAllocator(eMemoryResource mem_resource)
Allocateur par défaut pour la ressource mem_resource.
Arccore::eMemoryResource eMemoryRessource
Typedef pour la version Arcane historique (avec 2's')
Definition UtilsTypes.h:269
eMemoryResource
Liste des ressources mémoire disponibles.