MPI Namespace Reference#

DiFfRG: DiFfRG::MPI Namespace Reference
DiFfRG
Discretization Framework for functional Renormalization Group flows
DiFfRG::MPI Namespace Reference

Functions

bool available ()
 Whether this build has MPI and MPI_Init has run. Everything below degrades to a single-rank no-op when this is false, so callers never have to branch on the build type.
 
uint rank (MPI_Comm comm)
 
uint size (MPI_Comm comm)
 
void barrier (MPI_Comm comm)
 
void sum_reduce (MPI_Comm comm, int *data, int size)
 
void max_reduce (MPI_Comm comm, int *data, int size)
 
void min_reduce (MPI_Comm comm, int *data, int size)
 
void sum_reduce (MPI_Comm comm, double *data, int size)
 
void max_reduce (MPI_Comm comm, double *data, int size)
 
void min_reduce (MPI_Comm comm, double *data, int size)
 
int sum_reduce (MPI_Comm comm, int value)
 
int max_reduce (MPI_Comm comm, int value)
 
int min_reduce (MPI_Comm comm, int value)
 
double sum_reduce (MPI_Comm comm, double value)
 
double max_reduce (MPI_Comm comm, double value)
 
double min_reduce (MPI_Comm comm, double value)
 
bool any_of (MPI_Comm comm, bool value)
 Collective agreement on a predicate. Used to turn a rank-local decision (an abort, a convergence flag) into one that every rank makes identically – ranks that disagree about control flow enter different numbers of collectives and hang.
 
bool all_of (MPI_Comm comm, bool value)
 
bool agree (MPI_Comm comm, uint64_t token)
 Whether every rank passed the same token. One collective.
 
void bcast (MPI_Comm comm, void *data, size_t bytes, uint root=0)
 Broadcast raw bytes from root to all ranks.
 
void allgatherv_bytes (MPI_Comm comm, const void *send, size_t send_bytes, void *recv, const std::vector< int > &recv_counts, const std::vector< int > &displs)
 Concatenating all-gather of byte blocks of differing size.
 
MPI_Comm split_shared (MPI_Comm comm)
 A communicator over the ranks sharing this node's memory, for GPU affinity.
 
void free_comm (MPI_Comm &comm)
 
void abort (MPI_Comm comm, const std::string &message, int code=1)
 Tear the whole job down with a message on stderr.
 

Function Documentation

◆ abort()

void DiFfRG::MPI::abort ( MPI_Comm comm,
const std::string & message,
int code = 1 )

Tear the whole job down with a message on stderr.

Used where a throw would deadlock: an exception unwinds one rank out of a collective the others are still waiting in, so the failure would present as a hang instead of an error.

◆ agree()

bool DiFfRG::MPI::agree ( MPI_Comm comm,
uint64_t token )

Whether every rank passed the same token. One collective.

For checking agreement on something whose disagreement would otherwise show up as a hang (mismatched collective arguments) rather than an error.

◆ all_of()

bool DiFfRG::MPI::all_of ( MPI_Comm comm,
bool value )

◆ allgatherv_bytes()

void DiFfRG::MPI::allgatherv_bytes ( MPI_Comm comm,
const void * send,
size_t send_bytes,
void * recv,
const std::vector< int > & recv_counts,
const std::vector< int > & displs )

Concatenating all-gather of byte blocks of differing size.

recv_counts and displs are in bytes and must be identical on every rank; recv must hold sum(recv_counts) bytes. Used by MapScheduler to exchange map() slices. Deliberately not an Allreduce(SUM) over zero-filled buffers: that moves N times more data and is not bit-safe, since (-0.0) + 0.0 == +0.0 destroys a signed zero.

◆ any_of()

bool DiFfRG::MPI::any_of ( MPI_Comm comm,
bool value )

Collective agreement on a predicate. Used to turn a rank-local decision (an abort, a convergence flag) into one that every rank makes identically – ranks that disagree about control flow enter different numbers of collectives and hang.

◆ available()

bool DiFfRG::MPI::available ( )

Whether this build has MPI and MPI_Init has run. Everything below degrades to a single-rank no-op when this is false, so callers never have to branch on the build type.

◆ barrier()

void DiFfRG::MPI::barrier ( MPI_Comm comm)

◆ bcast()

void DiFfRG::MPI::bcast ( MPI_Comm comm,
void * data,
size_t bytes,
uint root = 0 )

Broadcast raw bytes from root to all ranks.

◆ free_comm()

void DiFfRG::MPI::free_comm ( MPI_Comm & comm)

◆ max_reduce() [1/4]

void DiFfRG::MPI::max_reduce ( MPI_Comm comm,
double * data,
int size )

◆ max_reduce() [2/4]

double DiFfRG::MPI::max_reduce ( MPI_Comm comm,
double value )

◆ max_reduce() [3/4]

void DiFfRG::MPI::max_reduce ( MPI_Comm comm,
int * data,
int size )

◆ max_reduce() [4/4]

int DiFfRG::MPI::max_reduce ( MPI_Comm comm,
int value )

◆ min_reduce() [1/4]

void DiFfRG::MPI::min_reduce ( MPI_Comm comm,
double * data,
int size )

◆ min_reduce() [2/4]

double DiFfRG::MPI::min_reduce ( MPI_Comm comm,
double value )

◆ min_reduce() [3/4]

void DiFfRG::MPI::min_reduce ( MPI_Comm comm,
int * data,
int size )

◆ min_reduce() [4/4]

int DiFfRG::MPI::min_reduce ( MPI_Comm comm,
int value )

◆ rank()

uint DiFfRG::MPI::rank ( MPI_Comm comm)

◆ size()

uint DiFfRG::MPI::size ( MPI_Comm comm)

◆ split_shared()

MPI_Comm DiFfRG::MPI::split_shared ( MPI_Comm comm)

A communicator over the ranks sharing this node's memory, for GPU affinity.

Returns MPI_COMM_SELF-equivalent behaviour (size 1) without MPI. Free it with free_comm().

◆ sum_reduce() [1/4]

void DiFfRG::MPI::sum_reduce ( MPI_Comm comm,
double * data,
int size )

◆ sum_reduce() [2/4]

double DiFfRG::MPI::sum_reduce ( MPI_Comm comm,
double value )

◆ sum_reduce() [3/4]

void DiFfRG::MPI::sum_reduce ( MPI_Comm comm,
int * data,
int size )

◆ sum_reduce() [4/4]

int DiFfRG::MPI::sum_reduce ( MPI_Comm comm,
int value )