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>
199#if defined(ARCANE_COMPILING_CUDA)
202 cudaStream_t stream = AcceleratorUtils::toCudaNativeStream(queue);
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) {
279 template <
bool InPlace,
typename SelectLambda,
typename InputIterator,
typename OutputIterator>
291#if defined(ARCANE_COMPILING_CUDA)
294 cudaStream_t stream = impl::CudaUtils::toNativeStream(queue);
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>
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.
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.
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.
Itérateur sur une lambda pour positionner une valeur via un index.
Référence à une instance.
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.