Arcane  v3.16.4.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ITransferValuesParallelOperation.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ITransferValuesParallelOperation.h (C) 2000-2025 */
9/* */
10/* Transfert de valeurs sur différents processeurs. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_ITRANSFERVALUESPARALLELOPERATION_H
13#define ARCANE_CORE_ITRANSFERVALUESPARALLELOPERATION_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Array.h"
18
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29/*!
30 * \brief Envoie de valeurs sur différents processeurs.
31 *
32 * Cette opération permet de communiquer des valeurs avec les autres
33 * processeurs. Le tableau \a ranks indique pour chaque élément le rang
34 * du processeur auquel il est destiné. Il est ensuite possible de spécifier
35 * des tableaux contenant les valeurs à envoyer et à recevoir. Les
36 * tableaux d'envois doivent avoir le même nombre d'élément que \a ranks
37 *
38 * Une instance ne sert qu'une fois. Une fois le transfert terminé,
39 * elle peut être détruite.
40 *
41 * Par exemple, pour un cas à 3 processeurs:
42 * \code
43 * // Processeur de rang 0:
44 * Int32UniqueArray ranks;
45 * ranks.add(2); // Envoie au rang 2
46 * ranks.add(1); // Envoie au rang 1
47 * ranks.add(1); // Envoie au rang 1
48 * Int32UniqueArray values_1;
49 * values_1.add(5); // Envoie 5 au rang 2 (ranks[0])
50 * values_1.add(7); // Envoie 7 au rang 1 (ranks[1])
51 * values_1.add(6); // Envoie 6 au rang 1 (ranks[2])
52 * Int64UniqueArray values_2;
53 * values_2.add(-5); // Envoie -5 au rang 2 (ranks[0])
54 * values_2.add(-7); // Envoie -7 au rang 1 (ranks[1])
55 * values_2.add(-6); // Envoie -6 au rang 1 (ranks[2])
56
57 * // Processeur de rang 1:
58 * Int32UniqueArray ranks;
59 * ranks.add(0); // Envoie au rang 0
60 * ranks.add(2); // Envoie au rang 2
61 * Int32UniqueArray values_1;
62 * values_1.add(1); // Envoie 1 au rang 0 (ranks[0])
63 * values_1.add(3); // Envoie 3 au rang 2 (ranks[1])
64 * Int64UniqueArray values_2;
65 * values_2.add(23); // Envoie 23 au rang 0 (ranks[0])
66 * values_2.add(24); // Envoie 24 au rang 2 (ranks[1])
67
68 * // Processeur de rang 2:
69 * Int32UniqueArray ranks;
70 * ranks.add(0); // Envoie au rang 0
71 * ranks.add(0); // Envoie au rang 0
72 * Int32UniqueArray values_1;
73 * values_1.add(0); // Envoie 1 au rang 0 (ranks[0])
74 * values_1.add(4); // Envoie 3 au rang 0 (ranks[1])
75 * Int64UniqueArray values_2;
76 * values_2.add(-1); // Envoie -1 au rang 0 (ranks[0])
77 * values_2.add(4); // Envoie 4 au rang 0 (ranks[1])
78
79 * \endcode
80 *
81 * Pour effectuer le transfert
82 *
83 * \code
84 * Int32UniqueArray recv_values_1;
85 * Int64UniqueArray recv_values_2;
86 * op->setTransferRanks(ranks);
87 * op->addArray(values_1,recv_values_1);
88 * op->addArray(values_2,recv_values_2);
89 * op->transferValues();
90 * \endcode
91 *
92 * Après envoie la processeur de rang 0 aura les valeurs suivantes:
93 * \code
94 * recv_values_1[0] == 1; // envoyé par le rang 1
95 * recv_values_1[1] == 0; // envoyé par le rang 2
96 * recv_values_1[2] == 4; // envoyé par le rang 2
97 * recv_values_2[0] == 23; // envoyé par le rang 1
98 * recv_values_2[1] == -1; // envoyé par le rang 2
99 * recv_values_2[2] == 4; // envoyé par le rang 2
100 * \endcode
101 *
102 * A noter que l'ordre des éléments est indéterminé
103 */
104class ARCANE_CORE_EXPORT ITransferValuesParallelOperation
105{
106 public:
107
108 //! Destructeur
110
111 public:
112
113 //! Gestionnaire de parallélisme associé
114 virtual IParallelMng* parallelMng() = 0;
115
116 public:
117
118 //! Positionne le tableau indiquant à qui envoyer les valeurs.
119 virtual void setTransferRanks(Int32ConstArrayView ranks) = 0;
120 //! Ajoute un tableau de \c Int32
121 virtual void addArray(Int32ConstArrayView send_values, SharedArray<Int32> recv_value) = 0;
122 //! Ajoute un tableau de \c Int64
123 virtual void addArray(Int64ConstArrayView send_values, SharedArray<Int64> recv_values) = 0;
124 //! Ajoute un tableau de \c Int64
125 virtual void addArray(RealConstArrayView send_values, SharedArray<Real> recv_values) = 0;
126 /*!
127 * \brief Envoie et réceptionne les valeurs.
128 *
129 * Cet appel est collectif et bloquant.
130 */
131 virtual void transferValues() = 0;
132};
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
136
137} // namespace Arcane
138
139/*---------------------------------------------------------------------------*/
140/*---------------------------------------------------------------------------*/
141
142#endif
Déclarations des types généraux de Arcane.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Envoie de valeurs sur différents processeurs.
virtual void addArray(Int32ConstArrayView send_values, SharedArray< Int32 > recv_value)=0
Ajoute un tableau de Int32.
virtual void addArray(RealConstArrayView send_values, SharedArray< Real > recv_values)=0
Ajoute un tableau de Int64.
virtual ~ITransferValuesParallelOperation()=default
Destructeur.
virtual void transferValues()=0
Envoie et réceptionne les valeurs.
virtual void addArray(Int64ConstArrayView send_values, SharedArray< Int64 > recv_values)=0
Ajoute un tableau de Int64.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallélisme associé
virtual void setTransferRanks(Int32ConstArrayView ranks)=0
Positionne le tableau indiquant à qui envoyer les valeurs.
Vecteur 1D de données avec sémantique par référence.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:567
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.
Definition UtilsTypes.h:575