Arcane  v3.14.10.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-2022 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-2014 */
9/* */
10/* Transfert de valeurs sur différents processeurs. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ITRANSFERVALUESPARALLELOPERATION_H
13#define ARCANE_ITRANSFERVALUESPARALLELOPERATION_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Array.h"
18#include "arcane/ArcaneTypes.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23ARCANE_BEGIN_NAMESPACE
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28class IParallelMng;
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32/*!
33 * \brief Envoie de valeurs sur différents processeurs.
34 *
35 * Cette opération permet de communiquer des valeurs avec les autres
36 * processeurs. Le tableau \a ranks indique pour chaque élément le rang
37 * du processeur auquel il est destiné. Il est ensuite possible de spécifier
38 * des tableaux contenant les valeurs à envoyer et à recevoir. Les
39 * tableaux d'envois doivent avoir le même nombre d'élément que \a ranks
40 *
41 * Une instance ne sert qu'une fois. Une fois le transfert terminé,
42 * elle peut être détruite.
43 *
44 * Par exemple, pour un cas à 3 processeurs:
45 * \code
46 * // Processeur de rang 0:
47 * Int32UniqueArray ranks;
48 * ranks.add(2); // Envoie au rang 2
49 * ranks.add(1); // Envoie au rang 1
50 * ranks.add(1); // Envoie au rang 1
51 * Int32UniqueArray values_1;
52 * values_1.add(5); // Envoie 5 au rang 2 (ranks[0])
53 * values_1.add(7); // Envoie 7 au rang 1 (ranks[1])
54 * values_1.add(6); // Envoie 6 au rang 1 (ranks[2])
55 * Int64UniqueArray values_2;
56 * values_2.add(-5); // Envoie -5 au rang 2 (ranks[0])
57 * values_2.add(-7); // Envoie -7 au rang 1 (ranks[1])
58 * values_2.add(-6); // Envoie -6 au rang 1 (ranks[2])
59
60 * // Processeur de rang 1:
61 * Int32UniqueArray ranks;
62 * ranks.add(0); // Envoie au rang 0
63 * ranks.add(2); // Envoie au rang 2
64 * Int32UniqueArray values_1;
65 * values_1.add(1); // Envoie 1 au rang 0 (ranks[0])
66 * values_1.add(3); // Envoie 3 au rang 2 (ranks[1])
67 * Int64UniqueArray values_2;
68 * values_2.add(23); // Envoie 23 au rang 0 (ranks[0])
69 * values_2.add(24); // Envoie 24 au rang 2 (ranks[1])
70
71 * // Processeur de rang 2:
72 * Int32UniqueArray ranks;
73 * ranks.add(0); // Envoie au rang 0
74 * ranks.add(0); // Envoie au rang 0
75 * Int32UniqueArray values_1;
76 * values_1.add(0); // Envoie 1 au rang 0 (ranks[0])
77 * values_1.add(4); // Envoie 3 au rang 0 (ranks[1])
78 * Int64UniqueArray values_2;
79 * values_2.add(-1); // Envoie -1 au rang 0 (ranks[0])
80 * values_2.add(4); // Envoie 4 au rang 0 (ranks[1])
81
82 * \endcode
83 *
84 * Pour effectuer le transfert
85 *
86 * \code
87 * Int32UniqueArray recv_values_1;
88 * Int64UniqueArray recv_values_2;
89 * op->setTransferRanks(ranks);
90 * op->addArray(values_1,recv_values_1);
91 * op->addArray(values_2,recv_values_2);
92 * op->transferValues();
93 * \endcode
94 *
95 * Après envoie la processeur de rang 0 aura les valeurs suivantes:
96 * \code
97 * recv_values_1[0] == 1; // envoyé par le rang 1
98 * recv_values_1[1] == 0; // envoyé par le rang 2
99 * recv_values_1[2] == 4; // envoyé par le rang 2
100 * recv_values_2[0] == 23; // envoyé par le rang 1
101 * recv_values_2[1] == -1; // envoyé par le rang 2
102 * recv_values_2[2] == 4; // envoyé par le rang 2
103 * \endcode
104 *
105 * A noter que l'ordre des éléments est indéterminé
106 */
107class ARCANE_CORE_EXPORT ITransferValuesParallelOperation
108{
109 public:
110 //! Destructeur
112 public:
113 //! Gestionnaire de parallélisme associé
115 public:
116 //! Positionne le tableau indiquant à qui envoyer les valeurs.
117 virtual void setTransferRanks(Int32ConstArrayView ranks) =0;
118 //! Ajoute un tableau de \c Int32
119 virtual void addArray(Int32ConstArrayView send_values,SharedArray<Int32> recv_value) =0;
120 //! Ajoute un tableau de \c Int64
121 virtual void addArray(Int64ConstArrayView send_values,SharedArray<Int64> recv_values) =0;
122 //! Ajoute un tableau de \c Int64
123 virtual void addArray(RealConstArrayView send_values,SharedArray<Real> recv_values) =0;
124 /*!
125 * \brief Envoie et réceptionne les valeurs.
126 *
127 * Cet appel est collectif et bloquant.
128 */
129 virtual void transferValues() =0;
130};
131
132/*---------------------------------------------------------------------------*/
133/*---------------------------------------------------------------------------*/
134
135ARCANE_END_NAMESPACE
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
140#endif
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 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.
Vue constante d'un tableau de type T.
Vecteur 1D de données avec sémantique par référence.