12#ifndef ARCANE_ACCELERATOR_GENERICPARTITIONER_H
13#define ARCANE_ACCELERATOR_GENERICPARTITIONER_H
17#include "arcane/utils/ArrayView.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/NumArray.h"
21#include "arcane/accelerator/AcceleratorGlobal.h"
22#include "arcane/accelerator/core/RunQueue.h"
23#include "arcane/accelerator/CommonUtils.h"
24#include "arcane/accelerator/RunCommandLaunchInfo.h"
25#if defined(ARCANE_COMPILING_SYCL)
32namespace Arcane::Accelerator::impl
53 Int32 _nbFirstPart()
const;
78 template <
typename SelectLambda,
typename InputIterator,
typename OutputIterator>
89#if defined(ARCANE_COMPILING_CUDA)
92 cudaStream_t stream = impl::CudaUtils::toNativeStream(&queue);
101 ARCANE_CHECK_CUDA(::cub::DevicePartition::If(s.m_algo_storage.address(),
temp_storage_size,
104 s.m_device_nb_list1_storage.
copyToAsync(s.m_host_nb_list1_storage, queue);
107#if defined(ARCANE_COMPILING_HIP)
111 hipStream_t stream = impl::HipUtils::toNativeStream(&queue);
121 s.m_device_nb_list1_storage.
copyToAsync(s.m_host_nb_list1_storage, queue);
124#if defined(ARCANE_COMPILING_SYCL) && defined(__INTEL_LLVM_COMPILER)
137 using DataType =
typename OutputIterator::value_type;
151 sycl::queue
sycl_queue = impl::SyclUtils::toNativeStream(queue);
157 s.m_host_nb_list1_storage[0] =
nb_list1;
206 s.m_host_nb_list1_storage[0] =
nb_list1;
236#if defined(ARCANE_COMPILING_CUDA)
239 cudaStream_t stream = impl::CudaUtils::toNativeStream(&queue);
249 ARCANE_CHECK_CUDA(::cub::DevicePartition::If(s.m_algo_storage.address(),
temp_storage_size,
253 s.m_device_nb_list1_storage.
copyToAsync(s.m_host_nb_list1_storage, queue);
256#if defined(ARCANE_COMPILING_HIP)
260 hipStream_t stream = impl::HipUtils::toNativeStream(&queue);
273 s.m_device_nb_list1_storage.
copyToAsync(s.m_host_nb_list1_storage, queue);
305 s.m_host_nb_list1_storage[0] =
nb_first;
306 s.m_host_nb_list1_storage[1] =
nb_second;
356 template <
typename SelectLambda,
typename SetterLambda>
387 template <
typename InputIterator,
typename OutputIterator,
typename SelectLambda>
481 m_is_already_called =
false;
482 return _nbFirstPart();
497 m_is_already_called =
false;
503 bool m_is_already_called =
false;
509 if (m_is_already_called)
510 ARCANE_FATAL(
"apply() has already been called for this instance");
511 m_is_already_called =
true;
#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 partitionnement d'une liste.
SmallSpan< const Int32 > nbParts()
Nombre d'éléments de la première et deuxième partie de la liste.
Int32 nbFirstPart()
Nombre d'éléments de la première partie de la liste.
void applyWithIndex(Int32 nb_value, const Setter1Lambda setter1_lambda, const Setter2Lambda setter2_lambda, const UnselectedSetterLambda &unselected_setter_lambda, const Select1Lambda &select1_lambda, const Select2Lambda &select2_lambda, const TraceInfo &trace_info=TraceInfo())
Effectue un partitionnement d'une liste en trois parties.
void applyIf(Int32 nb_value, InputIterator input_iter, OutputIterator output_iter, const SelectLambda &select_lambda, const TraceInfo &trace_info=TraceInfo())
Effectue un partitionnement d'une liste en deux parties.
void applyWithIndex(Int32 nb_value, const SetterLambda &setter_lambda, const SelectLambda &select_lambda, const TraceInfo &trace_info=TraceInfo())
Effectue un partitionnement d'une liste en deux parties.
void applyIf(Int32 nb_value, InputIterator input_iter, FirstOutputIterator first_output_iter, SecondOutputIterator second_output_iter, UnselectedIterator unselected_iter, const Select1Lambda &select1_lambda, const Select2Lambda &select2_lambda, const TraceInfo &trace_info=TraceInfo())
Effectue un partitionnement d'une liste en trois parties.
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.
void copyToAsync(SmallSpan< DataType > dest_ptr, const RunQueue &queue)
Copie l'instance dans dest_ptr.
Gère l'allocation interne sur le device.
Classe de base pour effectuer un filtrage.
Classe pour effectuer un partitionnement d'une liste.
void apply3(GenericPartitionerBase &s, Int32 nb_item, InputIterator input_iter, FirstOutputIterator first_output_iter, SecondOutputIterator second_output_iter, UnselectedIterator unselected_iter, const Select1Lambda &select1_lambda, const Select2Lambda &select2_lambda, const TraceInfo &trace_info=TraceInfo())
Effectue le partitionnement d'une liste en trois parties.
void apply(GenericPartitionerBase &s, Int32 nb_item, InputIterator input_iter, OutputIterator output_iter, const SelectLambda &select_lambda, const TraceInfo &trace_info=TraceInfo())
Effectue le partitionnement d'une liste en deux parties.
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.