Arcane  v3.14.10.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/*---------------------------------------------------------------------------*/
14/*---------------------------------------------------------------------------*/
15
16#include "arcane/accelerator/Filter.h"
17#include "arcane/utils/IMemoryRessourceMng.h"
18#include "arcane/accelerator/core/Memory.h"
19
20namespace Arcane::Accelerator
21{
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
31{
32 public:
33
34 IndexSelecter() {}
36 // -------------------------------------------------------
37 {
38 m_is_accelerator_policy = isAcceleratorPolicy(runqueue->executionPolicy());
39 m_memory_host = eMemoryRessource(m_is_accelerator_policy ? eMemoryRessource::HostPinned : eMemoryRessource::Host);
40 m_memory_device = eMemoryRessource(m_is_accelerator_policy ? eMemoryRessource::Device : eMemoryRessource::Host);
41 m_localid_select_device = UniqueArray<Int32>(platform::getDataMemoryRessourceMng()->getAllocator(m_memory_device));
42 m_localid_select_host = UniqueArray<Int32>(platform::getDataMemoryRessourceMng()->getAllocator(m_memory_host));
43 }
44
46 {
48 }
49
53 void resize(Int32 nb_idx)
54 {
56 m_localid_select_device.resize(m_index_number);
57 m_localid_select_host.resize(m_index_number);
58 }
59
64 template <typename PredicateType>
66 {
67 // On essaie de réutiliser au maximum la même instance de GenericFilterer
68 // afin de minimiser des allocations dynamiques dans cette classe.
69 // L'instance du GenericFilterer dépend du pointeur de RunQueue donc
70 // si ce pointeur change, il faut détruire et réallouer une nouvelle instance.
75 to_instantiate = true;
76 }
77 if (to_instantiate) {
79 }
80
81 // On sélectionne dans [0,m_index_number[ les indices i pour lesquels pred(i) est vrai
82 // et on les copie dans out_lid_select.
83 // Le nb d'indices sélectionnés est donné par nbOutputElement()
84 SmallSpan<Int32> out_lid_select(m_localid_select_device.data(), m_index_number);
85
87 [=] ARCCORE_HOST_DEVICE(Int32 input_index, Int32 output_index) -> void {
89 });
91
93 // Copie asynchrone Device to Host (m_localid_select_device ==> m_localid_select_host)
94 rqueue_async->copyMemory(MemoryCopyArgs(m_localid_select_host.subView(0, nb_idx_selected).data(),
95 m_localid_select_device.subView(0, nb_idx_selected).data(),
96 nb_idx_selected * sizeof(Int32))
97 .addAsync());
98
99 rqueue_async->barrier();
100 }
101 else {
102 rqueue_async->barrier();
103 }
104
105 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));
106
107 return lid_select_view;
108 }
109
110 private:
111
112 bool m_is_accelerator_policy = false; // indique si l'accélérateur est disponible ou non
113 eMemoryRessource m_memory_host; // identification de l'allocateur HOST
114 eMemoryRessource m_memory_device; // identification de l'allocateur DEVICE
115 UniqueArray<Int32> m_localid_select_device; // liste des identifiants sélectionnés avec un Filterer (alloué sur DEVICE)
116 UniqueArray<Int32> m_localid_select_host; // liste des identifiants sélectionnés avec un Filterer (alloué sur HOST)
117
118 Int32 m_index_number = 0;
119
122};
123
124/*---------------------------------------------------------------------------*/
125/*---------------------------------------------------------------------------*/
126
127} // namespace Arcane::Accelerator
128
129/*---------------------------------------------------------------------------*/
130/*---------------------------------------------------------------------------*/
Algorithme générique de filtrage sur accélérateur.
Definition Filter.h:354
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.
Definition Filter.h:526
Int32 nbOutputElement()
Nombre d'éléments en sortie.
Definition Filter.h:540
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.
RunQueue * m_asynchronous_queue_pointer
Pointeur sur la queue du GenericFilterer.
Int32 m_index_number
Intervalle [0, m_index_number[ sur lequel on va opérer la sélection.
ConstArrayView< Int32 > syncSelectIf(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:120
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.
IMemoryRessourceMng * getDataMemoryRessourceMng()
Gestionnaire de ressource mémoire pour les données.
eMemoryRessource
Liste des ressources mémoire disponibles.
@ HostPinned
Alloue sur l'hôte.
@ Host
Alloue sur l'hôte.
@ Device
Alloue sur le device.