14#include "arcane/utils/TraceAccessor.h"
15#include "arcane/utils/FatalErrorException.h"
17#include "arcane/core/IParallelMng.h"
18#include "arcane/core/parallel/BitonicSort.h"
32, m_parallel_mng(parallel_mng)
39template <
typename KeyType,
typename KeyTypeTraits>
void BitonicSort<KeyType, KeyTypeTraits>::
40_init(ConstArrayView<KeyType> keys)
42 m_init_size = keys.size();
46 m_size = m_parallel_mng->reduce(Parallel::ReduceMax, m_init_size);
48 m_keys.resize(m_size);
49 m_key_ranks.resize(m_size);
50 m_key_indexes.resize(m_size);
52 Int32 rank = m_parallel_mng->commRank();
56 for (Integer i = 0; i < m_init_size; ++i) {
59 m_key_ranks[i] = rank;
64 KeyType max_value = KeyTypeTraits::maxValue();
65 for (Int64 i = m_init_size; i < m_size; i++) {
66 m_keys[i] = max_value;
67 m_key_indexes[i] = -1;
68 m_key_ranks[i] = rank;
85template <
typename KeyType,
typename KeyTypeTraits>
void
86BitonicSort<KeyType, KeyTypeTraits>::
95 <<
" memsize=" <<
sizeof(KeyType) *
m_size
96 <<
" structsize=" <<
sizeof(KeyType);
105 while (nb_rank > test) {
112 for (
Int32 ilevel = 0; ilevel < nb_level; ++ilevel) {
116 for (
Int32 jproc = 0; jproc < nb_rank; jproc += size) {
126 if (!KeyTypeTraits::isValid(
m_keys[i])) {
151template <
typename KeyType,
typename KeyTypeTraits>
void
152BitonicSort<KeyType, KeyTypeTraits>::
156 for (
Int32 i = 0; i < size / 2; ++i)
163 Int32 div_size = size;
164 while (div_size > 1) {
166 for (
Int32 iproc = 0; iproc < size; iproc += div_size)
176template <
typename KeyType,
typename KeyTypeTraits>
void BitonicSort<KeyType, KeyTypeTraits>::
179 for (
Int32 i = 0; i < size / 2; ++i)
199template <
typename KeyType,
typename KeyTypeTraits>
void BitonicSort<KeyType, KeyTypeTraits>::
202 if (iproc1 >= iproc2)
203 ARCANE_FATAL(
"Invalid merge iproc1={0} iproc2={1}", iproc1, iproc2);
210 bool is_proc2 = (iproc2 == my_rank);
211 bool is_proc1 = (iproc1 == my_rank);
213 if (!is_proc1 && !is_proc2)
216 info() <<
"SORT iproc1=" << iproc1 <<
" iproc2=" << iproc2;
230 if (is_want_index_rank) {
236 if (is_want_index_rank) {
255 if (is_want_index_rank) {
256 buf2_proc.
resize(buf_size);
257 buf2_local_id.
resize(buf_size);
262 if (is_want_index_rank) {
268 buf2.
add(KeyTypeTraits::maxValue());
275 if (is_want_index_rank) {
276 buf_proc_merge.
resize(total_size);
277 buf_local_id_merge.
resize(total_size);
281 info() <<
"SIZE=" << buf_size <<
" total=" << total_size <<
" m_size=" <<
m_size
282 <<
" proc2=" << iproc2 <<
" init-size=" <<
m_init_size;
289 for (
Int64 i = 0; i < total_size; ++i) {
290 if (cursor1 >=
m_size || (KeyTypeTraits::compareLess(buf2[cursor2],
m_keys[cursor1]) && cursor2 < buf_size)) {
291 buf_merge[i] = buf2[cursor2];
292 if (is_want_index_rank) {
293 buf_local_id_merge[i] = buf2_local_id[cursor2];
294 buf_proc_merge[i] = buf2_proc[cursor2];
299 buf_merge[i] =
m_keys[cursor1];
300 if (is_want_index_rank) {
310 for (
Integer ii = 0; ii < buf_size; ii++) {
311 buf2[ii] = buf_merge[
m_size + ii];
312 if (is_want_index_rank) {
313 buf2_local_id[ii] = buf_local_id_merge[
m_size + ii];
314 buf2_proc[ii] = buf_proc_merge[
m_size + ii];
319 if (is_want_index_rank) {
325 for (
Integer i = 0; i < buf_size; i++) {
327 if (is_want_index_rank) {
343template <
typename KeyType,
typename KeyTypeTraits>
void BitonicSort<KeyType, KeyTypeTraits>::
356 Integer tmp_local_id = NULL_ITEM_LOCAL_ID;
357 Integer tmp_proc = A_NULL_RANK;
385 if (j < ir && KeyTypeTraits::compareLess(
m_keys[j],
m_keys[j + 1]))
387 if (KeyTypeTraits::compareLess(rra,
m_keys[j])) {
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Vue modifiable d'un tableau d'un type T.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Algorithme de tri bitonique parallèle.
void _mergeProcessors(Int32 proc1, Int32 proc2)
Fusion des listes de deux processeurs .
Integer m_nb_merge
Statistiques sur le nombre de niveaux de messages.
ConstArrayView< KeyType > keys() const override
Après un tri, retourne la liste des éléments de ce rang.
void _separator(Int32 begin, Int32 size)
Etage séparateur de l'algorithme de tri bitonique.
bool m_want_index_and_rank
Indique si on souhaite les infos sur les rangs et index.
Int64 m_size
Nombre d'éléments locaux pour le tri bitonique.
UniqueArray< Int32 > m_key_ranks
Tableau contenant le rang du processeur où se trouve la clé
UniqueArray< Int32 > m_key_indexes
Tableau contenant l'indice de la clé dans le processeur.
Int64 m_init_size
Nombre d'éléments locaux.
UniqueArray< KeyType > m_keys
Variable contenant la cle du tri.
IParallelMng * m_parallel_mng
Gestionnaire du parallèlisme.
void _localHeapSort()
Tri par tas en local de la variable m_key.
void _mergeLevels(Int32 begin, Int32 size)
Tri bitonique de la variable key.
Classe d'accès aux traces.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
Implémentation de la concurrence.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
std::int32_t Int32
Type entier signé sur 32 bits.