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()
const;
64 void _allocateTemporaryStorage(
size_t size);
65 int* _getDeviceNbOutPointer();
66 void _copyDeviceNbOutToHostNbOut();
85 bool m_use_direct_host_storage =
true;
91#if defined(ARCANE_COMPILING_SYCL)
93class SyclGenericFilteringImpl
97 template <
typename SelectLambda,
typename InputIterator,
typename OutputIterator>
102 using DataType = std::iterator_traits<OutputIterator>::value_type;
103#if defined(ARCANE_USE_SCAN_ONEDPL) && defined(__INTEL_LLVM_COMPILER)
104 sycl::queue
true_queue = AcceleratorUtils::toSyclNativeStream(queue);
131 for (
int i = 0; i <
nb_item; ++i) {
132 std::cout <<
"out_data i=" << i <<
" out_data=" <<
out_scan_data[i]
176template <
typename DataType,
typename FlagType,
typename OutputDataType>
194#if defined(ARCANE_COMPILING_CUDA)
197 cudaStream_t stream = AcceleratorUtils::toCudaNativeStream(queue);
205 ARCANE_CHECK_CUDA(::cub::DeviceSelect::Flagged(s.m_algo_storage.address(),
temp_storage_size,
207 s._copyDeviceNbOutToHostNbOut();
210#if defined(ARCANE_COMPILING_HIP)
214 hipStream_t stream = AcceleratorUtils::toHipNativeStream(queue);
224 s._copyDeviceNbOutToHostNbOut();
227#if defined(ARCANE_COMPILING_SYCL)
243 output[index] =
input[i];
274 template <
bool InPlace,
typename SelectLambda,
typename InputIterator,
typename OutputIterator>
286#if defined(ARCANE_COMPILING_CUDA)
289 cudaStream_t stream = impl::CudaUtils::toNativeStream(queue);
304 ARCANE_CHECK_CUDA(::cub::DeviceSelect::If(s.m_algo_storage.address(),
temp_storage_size,
308 ARCANE_CHECK_CUDA(::cub::DeviceSelect::If(s.m_algo_storage.address(),
temp_storage_size,
312 s._copyDeviceNbOutToHostNbOut();
315#if defined(ARCANE_COMPILING_HIP)
319 hipStream_t stream = impl::HipUtils::toNativeStream(queue);
330 s._copyDeviceNbOutToHostNbOut();
333#if defined(ARCANE_COMPILING_SYCL)
389 ARCANE_DEPRECATED_REASON(
"Y2024: Use GenericFilterer(const RunQueue&) instead")
433 template <
typename InputDataType,
typename OutputDataType,
typename FlagType>
485 template <
typename DataType,
typename SelectLambda>
492 if (
input.data() == output.data())
493 ARCANE_FATAL(
"Input and Output are the same. Use in place overload instead");
509 template <
typename DataType,
typename SelectLambda>
534 template <
typename InputIterator,
typename OutputIterator,
typename SelectLambda>
579 template <
typename SelectLambda,
typename SetterLambda>
596 m_is_already_called =
false;
597 return _nbOutputElement();
602 bool m_is_already_called =
false;
608 if (m_is_already_called)
609 ARCANE_FATAL(
"apply() has already been called for this instance");
610 m_is_already_called =
true;
#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.
std::int32_t Int32
Type entier signé sur 32 bits.