15#include <Schema_Comm_Vecteurs.h>
16#include <Comm_Group.h>
17#include <communications.h>
27ArrOfTID Schema_Comm_Vecteurs::tmp_area_tid_;
30bool check_comm_vector =
false;
48 for (
int i = 0; i < n*2; i++)
62 for (
int i = 0; i < min_buf_size; i++)
89 const char* env_var = getenv(
"TRUST_USE_MPI_GPU_AWARE");
94 if (getenv(
"MPICH_GPU_SUPPORT_ENABLED") ==
nullptr)
95 Process::exit(
"You try to enable GPU communications on Cray MPICH with TRUST_USE_MPI_GPU_AWARE=1 but forgot to set also MPICH_GPU_SUPPORT_ENABLED=1 !");
97 std::cerr <<
"[MPI] Enabling GPU capability to communicate between devices." << std::endl;
128#if defined(TRUST_USE_CUDA) && !defined(MPIX_CUDA_AWARE_SUPPORT)
129 Process::exit(
"MPI version is detected as not CUDA-Aware. You can't use TRUST_USE_MPI_GPU_AWARE=1");
152 for (
int i = 0; i < n; i++)
157 Cerr <<
"Error in Schema_Comm_Vecteurs::end_init(): send_size_ and recv_size_ don't match, see log files" << finl;
175 for (i = 0; i < nsend; i++)
183 for (i = 0; i < nrecv; i++)
215 Cerr <<
"Internal error in Schema_Comm_Vecteurs::begin_comm(): buffers already locked by another communication" << finl;
222 char *ptr =
sdata_.buffer_base_;
225 for (
int i = 0; i < nsend; i++)
228 sdata_.buf_pointers_[pe] = ptr;
239 char * ptr =
sdata_.buffer_base_;
244 if ((exchange_type == IsExchangeBlocking::DefaultBlocking)||(exchange_type == IsExchangeBlocking::NonBlockingStart))
255 ptr = addrOnDevice(
sdata_.buffer_base_);
267 assert(nsend + nrecv <=
sdata_.buf_pointers_size_);
268 char ** send_bufs =
sdata_.buf_pointers_;
269 char ** recv_bufs =
sdata_.buf_pointers_ + nsend;
270 for (
int i = 0; i < nsend; i++)
275 for (
int i = 0; i < nrecv; i++)
284 if (exchange_type == IsExchangeBlocking::NonBlockingStart) start_gpu_timer(kernel_name);
290 if ((exchange_type == IsExchangeBlocking::DefaultBlocking)||(exchange_type == IsExchangeBlocking::NonBlockingFinish))
293 if (exchange_type == IsExchangeBlocking::NonBlockingFinish) end_gpu_timer(kernel_name);
295 char * recv_ptr =
sdata_.buffer_base_;
296 for (
int i = 0; i < nsend; i++)
298 for (
int i = 0; i < nrecv; i++)
301 sdata_.buf_pointers_[pe] = recv_ptr;
329 char *ptr =
sdata_.buffer_base_;
335 for (i = 0; i < nsend; i++)
339 char *ptr2 =
sdata_.buf_pointers_[pe];
340 ALIGN_SIZE(ptr2,
sizeof(
double));
343 Cerr <<
"Internal error in Schema_Comm_Vecteurs::check_buffers_full(): send buffer for processor "
344 << pe <<
" is not full" << finl;
351 for (i = 0; i < nsend; i++)
354 for (i = 0; i < nrecv; i++)
358 char *ptr2 =
sdata_.buf_pointers_[pe];
359 ALIGN_SIZE(ptr2,
sizeof(
double));
362 Cerr <<
"Internal error in Schema_Comm_Vecteurs::check_buffers_full(): recv buffer for processor "
363 << pe <<
" has not been read entirely" << finl;
370 Cerr <<
"check_buffers_full: What ?" << finl;
381 assert(byte_size >= 0);
390 char * ptr =
sdata_.buffer_base_;
396 for (i = 0; i < nsend; i++)
399 for (i = 0; i < n; i++)
403 return (
sdata_.buf_pointers_[pe] + byte_size) <= ptr;
: Cette classe decrit un groupe de processeurs sur lesquels
static int check_enabled()
virtual void send_recv_finish() const =0
int nproc() const
Renvoie le nombre de processeurs dans le groupe *this.
virtual void send_recv_start(const ArrOfInt &send_list, const ArrOfInt &send_size, const char *const *const send_buffers, const ArrOfInt &recv_list, const ArrOfInt &recv_size, char *const *const recv_buffers, TypeHint typehint=CHAR) const =0
static const Comm_Group & current_group()
renvoie une reference au groupe de processeurs actif courant
static const Comm_Group & groupe_TRUST()
Renvoie une reference au groupe de tous les processeurs TRUST.
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Donnees statiques communes a toutes les classes Schema_Comm_Vecteur, avec destructeur pour liberer la...
int buffer_base_device_size_
void init(int size, bool bufferOnDevice)
Schema_Comm_Vecteurs_Static_Data()
~Schema_Comm_Vecteurs_Static_Data()
static Schema_Comm_Vecteurs_Static_Data sdata_
static ArrOfDouble tmp_area_double_
int check_next_area(int pe, int byte_size) const
verifie qu'il reste au moins byte_size octets dans le buffer du processeur pe
void end_init()
Une fois les donnees a echanger declarees avec add_send/recv_area_.
void begin_init()
Reinitialise les tailles de buffers.
static ArrOfInt tmp_area_int_
int check_buffers_full() const
Selon status_, verifie que tous les pointeurs de buffers pointent a la fin du buffer aloue pour chaqu...
static ArrOfFloat tmp_area_float_
static bool buffer_locked_
void exchange(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
void begin_comm(bool bufferOnDevice=false)
Commence un nouvel echange de donnees (les tailles de buffers doivent avoir ete initialisees avec beg...
_SIZE_ size_array() const