12#ifndef ARCANE_ACCELERATOR_GENERICFILTERER_H
13#define ARCANE_ACCELERATOR_GENERICFILTERER_H
17#include "arcane/utils/ArrayView.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/NumArray.h"
20#include "arcane/utils/TraceInfo.h"
22#include "arcane/accelerator/core/RunQueue.h"
24#include "arcane/accelerator/AcceleratorGlobal.h"
25#include "arcane/accelerator/CommonUtils.h"
26#include "arcane/accelerator/RunCommandLaunchInfo.h"
28#include "arcane/accelerator/ScanImpl.h"
29#include "arcane/accelerator/MultiThreadAlgo.h"
34namespace Arcane::Accelerator::impl
48 template <
typename DataType,
typename FlagType,
typename OutputDataType>
51 friend class SyclGenericFilteringImpl;
62 Int32 _nbOutputElement();
64 void _allocateTemporaryStorage(
size_t size);
65 int* _getDeviceNbOutPointer();
66 void _copyDeviceNbOutToHostNbOut();
87 bool m_use_direct_host_storage =
true;
90 bool m_is_already_called =
false;
96#if defined(ARCANE_COMPILING_SYCL)
98class SyclGenericFilteringImpl
102 template <
typename SelectLambda,
typename InputIterator,
typename OutputIterator>
107 using DataType = std::iterator_traits<OutputIterator>::value_type;
108#if defined(ARCANE_USE_SCAN_ONEDPL) && defined(__INTEL_LLVM_COMPILER)
109 sycl::queue
true_queue = AcceleratorUtils::toSyclNativeStream(queue);
136 for (
int i = 0; i < nb_item; ++i) {
137 std::cout <<
"out_data i=" << i <<
" out_data=" <<
out_scan_data[i]
181template <
typename DataType,
typename FlagType,
typename OutputDataType>
189 const Int32 nb_item =
input.size();
190 if (output.size() != nb_item)
191 ARCANE_FATAL(
"Sizes are not equals: input={0} output={1}", nb_item, output.size());
199#if defined(ARCANE_COMPILING_CUDA)
202 cudaStream_t stream = AcceleratorUtils::toCudaNativeStream(queue);
210 ARCANE_CHECK_CUDA(::cub::DeviceSelect::Flagged(s.m_algo_storage.address(),
temp_storage_size,
212 s._copyDeviceNbOutToHostNbOut();
215#if defined(ARCANE_COMPILING_HIP)
219 hipStream_t stream = AcceleratorUtils::toHipNativeStream(queue);
229 s._copyDeviceNbOutToHostNbOut();
232#if defined(ARCANE_COMPILING_SYCL)
246 for (Int32 i = 0; i < nb_item; ++i) {
248 output[index] =
input[i];
279 template <
bool InPlace,
typename SelectLambda,
typename InputIterator,
typename OutputIterator>
291#if defined(ARCANE_COMPILING_CUDA)
294 cudaStream_t stream = impl::CudaUtils::toNativeStream(queue);
309 ARCANE_CHECK_CUDA(::cub::DeviceSelect::If(s.m_algo_storage.address(),
temp_storage_size,
313 ARCANE_CHECK_CUDA(::cub::DeviceSelect::If(s.m_algo_storage.address(),
temp_storage_size,
317 s._copyDeviceNbOutToHostNbOut();
320#if defined(ARCANE_COMPILING_HIP)
324 hipStream_t stream = impl::HipUtils::toNativeStream(queue);
335 s._copyDeviceNbOutToHostNbOut();
338#if defined(ARCANE_COMPILING_SYCL)
353 for (Int32 i = 0; i < nb_item; ++i) {
394 ARCANE_DEPRECATED_REASON(
"Y2024: Use GenericFilterer(const RunQueue&) instead")
438 template <
typename InputDataType,
typename OutputDataType,
typename FlagType>
490 template <
typename DataType,
typename SelectLambda>
497 if (
input.data() == output.data())
498 ARCANE_FATAL(
"Input and Output are the same. Use in place overload instead");
514 template <
typename DataType,
typename SelectLambda>
537 template <
typename InputIterator,
typename OutputIterator,
typename SelectLambda>
582 template <
typename SelectLambda,
typename SetterLambda>
599 return _nbOutputElement();
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Types et macros pour gérer les boucles sur les accélérateurs.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle sur accélérateur avec arguments supplémentaires pour les réductions.
Algorithme générique de filtrage sur accélérateur.
void applyIf(Int32 nb_value, InputIterator input_iter, OutputIterator output_iter, const SelectLambda &select_lambda, const TraceInfo &trace_info=TraceInfo())
Applique un filtre.
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.
void applyIf(SmallSpan< DataType > input_output, const SelectLambda &select_lambda, const TraceInfo &trace_info=TraceInfo())
Applique un filtre en place.
void apply(SmallSpan< const InputDataType > input, SmallSpan< OutputDataType > output, SmallSpan< const FlagType > flag)
Applique un filtre.
void applyIf(SmallSpan< const DataType > input, SmallSpan< DataType > output, const SelectLambda &select_lambda, const TraceInfo &trace_info=TraceInfo())
Applique un filtre.
Int32 nbOutputElement()
Nombre d'éléments en sortie.
GenericFilterer(const RunQueue &queue)
Créé une instance.
Gestion d'une commande sur accélérateur.
File d'exécution pour un accélérateur.
void barrier() const
Bloque tant que toutes les commandes associées à la file ne sont pas terminées.
eExecutionPolicy executionPolicy() const
Politique d'exécution de la file.
Gère l'allocation interne sur le device.
Classe de base pour effectuer un filtrage.
DeviceStorage< int > m_device_nb_out_storage
Mémoire sur le device du nombre de valeurs filtrées.
NumArray< Int32, MDDim1 > m_host_nb_out_storage
Mémoire hôte pour le nombre de valeurs filtrées.
RunQueue m_queue
File d'exécution. Ne doit pas être nulle.
Classe pour effectuer un filtrage.
Classe pour effectuer un filtrage.
void apply(GenericFilteringBase &s, Int32 nb_item, InputIterator input_iter, OutputIterator output_iter, const SelectLambda &select_lambda, const TraceInfo &trace_info)
Applique le filtre.
Algorithmes avancée en mode multi-thread.
Object temporaire pour conserver les informations d'exécution d'une commande et regrouper les tests.
Itérateur sur une lambda pour positionner une valeur via un index.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Espace de nom pour l'utilisation des accélérateurs.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
eExecutionPolicy
Politique d'exécution pour un Runner.
@ SYCL
Politique d'exécution utilisant l'environnement SYCL.
@ HIP
Politique d'exécution utilisant l'environnement HIP.
@ CUDA
Politique d'exécution utilisant l'environnement CUDA.
@ Sequential
Politique d'exécution séquentielle.
@ Thread
Politique d'exécution multi-thread.