12#ifndef ARCANE_ACCELERATOR_FILTERING_H
13#define ARCANE_ACCELERATOR_FILTERING_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"
33namespace Arcane::Accelerator::impl
47 template <
typename DataType,
typename FlagType,
typename OutputDataType>
50 friend class SyclGenericFilteringImpl;
61 Int32 _nbOutputElement()
const;
63 void _allocateTemporaryStorage(
size_t size);
64 int* _getDeviceNbOutPointer();
65 void _copyDeviceNbOutToHostNbOut();
84 bool m_use_direct_host_storage =
true;
90#if defined(ARCANE_COMPILING_SYCL)
92class SyclGenericFilteringImpl
96 template <
typename SelectLambda,
typename InputIterator,
typename OutputIterator>
101 using DataType = std::iterator_traits<OutputIterator>::value_type;
102#if defined(ARCANE_USE_SCAN_ONEDPL) && defined(__INTEL_LLVM_COMPILER)
103 sycl::queue
true_queue = AcceleratorUtils::toSyclNativeStream(queue);
130 for (
int i = 0; i <
nb_item; ++i) {
131 std::cout <<
"out_data i=" << i <<
" out_data=" <<
out_scan_data[i]
175template <
typename DataType,
typename FlagType,
typename OutputDataType>
192#if defined(ARCANE_COMPILING_CUDA)
195 cudaStream_t stream = AcceleratorUtils::toCudaNativeStream(queue);
203 ARCANE_CHECK_CUDA(::cub::DeviceSelect::Flagged(s.m_algo_storage.address(),
temp_storage_size,
205 s._copyDeviceNbOutToHostNbOut();
208#if defined(ARCANE_COMPILING_HIP)
212 hipStream_t stream = AcceleratorUtils::toHipNativeStream(queue);
222 s._copyDeviceNbOutToHostNbOut();
225#if defined(ARCANE_COMPILING_SYCL)
241 output[index] =
input[i];
266 template <
typename SelectLambda,
typename InputIterator,
typename OutputIterator>
278#if defined(ARCANE_COMPILING_CUDA)
281 cudaStream_t stream = impl::CudaUtils::toNativeStream(queue);
290 ARCANE_CHECK_CUDA(::cub::DeviceSelect::If(s.m_algo_storage.address(),
temp_storage_size,
293 s._copyDeviceNbOutToHostNbOut();
296#if defined(ARCANE_COMPILING_HIP)
300 hipStream_t stream = impl::HipUtils::toNativeStream(queue);
309 s._copyDeviceNbOutToHostNbOut();
312#if defined(ARCANE_COMPILING_SYCL)
363 ARCANE_DEPRECATED_REASON(
"Y2024: Use GenericFilterer(const RunQueue&) instead")
407 template <
typename InputDataType,
typename OutputDataType,
typename FlagType>
458 template <
typename DataType,
typename SelectLambda>
482 template <
typename InputIterator,
typename OutputIterator,
typename SelectLambda>
525 template <
typename SelectLambda,
typename SetterLambda>
542 m_is_already_called =
false;
543 return _nbOutputElement();
548 bool m_is_already_called =
false;
554 if (m_is_already_called)
555 ARCANE_FATAL(
"apply() has already been called for this instance");
556 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 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.
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.