This class virtualize the cluster of PC as a set of processes that communicate. More...
This class virtualize the cluster of PC as a set of processes that communicate.
At the moment it is an MPI-like interface, with a more type aware, and simple, interface. It also give some more complex communication functionalities like Dynamic Sparse Data Exchange
Actually VCluster expose a Computation driven parallelism (MPI-like), with a plan of extending to communication driven parallelism
Definition at line 125 of file VCluster_base.hpp.
#include <VCluster_base.hpp>
Public Member Functions | |
Vcluster_base (int *argc, char ***argv) | |
Virtual cluster constructor. | |
gpu::ofp_context_t & | getgpuContext (bool iw=true) |
If nvidia cuda is activated return a gpu context. | |
MPI_Comm | getMPIComm () |
Get the MPI_Communicator (or processor group) this VCluster is using. | |
size_t | getProcessingUnits () |
Get the total number of processors. | |
size_t | size () |
Get the total number of processors. | |
void | print_stats () |
void | clear_stats () |
size_t | getProcessUnitID () |
Get the process unit id. | |
size_t | rank () |
Get the process unit id. | |
template<typename T > | |
void | sum (T &num) |
Sum the numbers across all processors and get the result. | |
template<typename T > | |
void | max (T &num) |
Get the maximum number across all processors (or reduction with infinity norm) | |
template<typename T > | |
void | min (T &num) |
Get the minimum number across all processors (or reduction with insinity norm) | |
void | progressCommunication () |
In case of Asynchonous communications like sendrecvMultipleMessagesNBXAsync this function progress the communication. | |
template<typename T > | |
void | sendrecvMultipleMessagesNBX (openfpm::vector< size_t > &prc, openfpm::vector< T > &data, openfpm::vector< size_t > &prc_recv, openfpm::vector< size_t > &recv_sz, void *(*msg_alloc)(size_t, size_t, size_t, size_t, size_t, size_t, void *), void *ptr_arg, long int opt=NONE) |
Send and receive multiple messages. | |
template<typename T > | |
void | sendrecvMultipleMessagesNBXAsync (openfpm::vector< size_t > &prc, openfpm::vector< T > &data, openfpm::vector< size_t > &prc_recv, openfpm::vector< size_t > &recv_sz, void *(*msg_alloc)(size_t, size_t, size_t, size_t, size_t, size_t, void *), void *ptr_arg, long int opt=NONE) |
Send and receive multiple messages asynchronous version. | |
template<typename T > | |
void | sendrecvMultipleMessagesNBX (openfpm::vector< size_t > &prc, openfpm::vector< T > &data, void *(*msg_alloc)(size_t, size_t, size_t, size_t, size_t, size_t, void *), void *ptr_arg, long int opt=NONE) |
Send and receive multiple messages. | |
template<typename T > | |
void | sendrecvMultipleMessagesNBXAsync (openfpm::vector< size_t > &prc, openfpm::vector< T > &data, void *(*msg_alloc)(size_t, size_t, size_t, size_t, size_t, size_t, void *), void *ptr_arg, long int opt=NONE) |
Send and receive multiple messages asynchronous version. | |
void | sendrecvMultipleMessagesNBX (size_t n_send, size_t sz[], size_t prc[], void *ptr[], size_t n_recv, size_t prc_recv[], size_t sz_recv[], void *(*msg_alloc)(size_t, size_t, size_t, size_t, size_t, size_t, void *), void *ptr_arg, long int opt=NONE) |
Send and receive multiple messages. | |
void | sendrecvMultipleMessagesNBXAsync (size_t n_send, size_t sz[], size_t prc[], void *ptr[], size_t n_recv, size_t prc_recv[], size_t sz_recv[], void *(*msg_alloc)(size_t, size_t, size_t, size_t, size_t, size_t, void *), void *ptr_arg, long int opt=NONE) |
Send and receive multiple messages asynchronous version. | |
void | sendrecvMultipleMessagesNBX (size_t n_send, size_t sz[], size_t prc[], void *ptr[], size_t n_recv, size_t prc_recv[], void *(*msg_alloc)(size_t, size_t, size_t, size_t, size_t, size_t, void *), void *ptr_arg, long int opt=NONE) |
Send and receive multiple messages. | |
void | sendrecvMultipleMessagesNBXAsync (size_t n_send, size_t sz[], size_t prc[], void *ptr[], size_t n_recv, size_t prc_recv[], void *(*msg_alloc)(size_t, size_t, size_t, size_t, size_t, size_t, void *), void *ptr_arg, long int opt=NONE) |
Send and receive multiple messages asynchronous version. | |
void | sendrecvMultipleMessagesNBX (size_t n_send, size_t sz[], size_t prc[], void *ptr[], void *(*msg_alloc)(size_t, size_t, size_t, size_t, size_t, size_t, void *), void *ptr_arg, long int opt=NONE) |
Send and receive multiple messages. | |
void | sendrecvMultipleMessagesNBXAsync (size_t n_send, size_t sz[], size_t prc[], void *ptr[], void *(*msg_alloc)(size_t, size_t, size_t, size_t, size_t, size_t, void *), void *ptr_arg, long int opt=NONE) |
Send and receive multiple messages Asynchronous version. | |
void | sendrecvMultipleMessagesNBXWait () |
Send and receive multiple messages wait NBX communication to complete. | |
bool | send (size_t proc, size_t tag, const void *mem, size_t sz) |
Send data to a processor. | |
template<typename T , typename Mem , template< typename > class gr> | |
bool | send (size_t proc, size_t tag, openfpm::vector< T, Mem, gr > &v) |
Send data to a processor. | |
bool | recv (size_t proc, size_t tag, void *v, size_t sz) |
Recv data from a processor. | |
template<typename T , typename Mem , template< typename > class gr> | |
bool | recv (size_t proc, size_t tag, openfpm::vector< T, Mem, gr > &v) |
Recv data from a processor. | |
template<typename T , typename Mem , template< typename > class gr> | |
bool | allGather (T &send, openfpm::vector< T, Mem, gr > &v) |
Gather the data from all processors. | |
template<typename T , typename Mem , template< typename > class layout_base> | |
bool | Bcast (openfpm::vector< T, Mem, layout_base > &v, size_t root) |
Broadcast the data to all processors. | |
void | execute () |
Execute all the requests. | |
void | clear () |
Release the buffer used for communication. | |
Data Fields | |
openfpm::vector< size_t > | sz_recv_tmp |
Protected Attributes | |
openfpm::vector_fr< BMemory< InternalMemory > > | recv_buf [NQUEUE] |
Receive buffers. | |
openfpm::vector< size_t > | tags [NQUEUE] |
tags receiving | |
Private Member Functions | |
Vcluster_base & | operator= (const Vcluster_base &) |
disable operator= | |
Vcluster_base (const Vcluster_base &) | |
disable copy constructor | |
void | queue_all_sends (size_t n_send, size_t sz[], size_t prc[], void *ptr[]) |
Private Attributes | |
Vcluster_log | log |
log file | |
openfpm::vector< size_t > | proc_com |
openfpm::vector< int > | map_scatter |
vector that contain the scatter map (it is basically an array of one) | |
openfpm::vector< MPI_Request > | req |
vector of MPI requests | |
openfpm::vector< MPI_Status > | stat |
vector of MPI status | |
std::vector< int > | post_exe |
vector of functions to execute after all the request has been performed | |
gpu::ofp_context_t * | context |
standard context for gpu (if cuda is detected otherwise is unused) | |
int | m_size |
number of processes | |
int | m_rank |
actual rank | |
int | numPE = 1 |
number of processing unit per process | |
NBX_Type | NBX_active [NQUEUE] |
size_t | rid [NQUEUE] |
request id | |
int | NBX_prc_qcnt = -1 |
NBX comunication on queue (-1 mean 0, 0 mean 1, 1 mean 2, .... ) | |
bool | NBX_prc_reached_bar_req [NQUEUE] |
Is the barrier request reached. | |
int | NBX_prc_cnt_base = 0 |
size_t | NBX_prc_n_send [NQUEUE] |
size_t * | NBX_prc_prc [NQUEUE] |
void ** | NBX_prc_ptr [NQUEUE] |
size_t * | NBX_prc_sz [NQUEUE] |
size_t | NBX_prc_n_recv [NQUEUE] |
void *(* | NBX_prc_msg_alloc [NQUEUE])(size_t, size_t, size_t, size_t, size_t, size_t, void *) |
size_t * | NBX_prc_prc_recv [NQUEUE] |
void * | NBX_prc_ptr_arg [NQUEUE] |
std::vector< red > | r |
openfpm::vector< void * > | ptr_send [NQUEUE] |
vector of pointers of send buffers | |
openfpm::vector< size_t > | sz_send [NQUEUE] |
vector of the size of send buffers | |
MPI_Request | bar_req |
barrier request | |
MPI_Status | bar_stat |
barrier status | |
int | shmrank |
rank within the node | |
int | nbx_cycle |
NBX_cycle. | |
|
inlineprivate |
disable copy constructor
Definition at line 217 of file VCluster_base.hpp.
|
inline |
Definition at line 268 of file VCluster_base.hpp.
|
inline |
Virtual cluster constructor.
argc | pointer to arguments counts passed to the program |
argv | pointer to arguments vector passed to the program |
Definition at line 299 of file VCluster_base.hpp.
|
inline |
Gather the data from all processors.
send a primitive data T receive the same primitive T from all the other processors
v | vector to receive (automaticaly resized) |
send | data to send |
Definition at line 1705 of file VCluster_base.hpp.
|
inline |
Broadcast the data to all processors.
broadcast a vector of primitives.
v | vector to send in the case of the root processor and vector where to receive in the case of non-root |
root | processor (who broadcast) |
Definition at line 1740 of file VCluster_base.hpp.
|
inline |
Release the buffer used for communication.
Definition at line 1774 of file VCluster_base.hpp.
|
inline |
Definition at line 515 of file VCluster_base.hpp.
|
inline |
Execute all the requests.
Definition at line 1754 of file VCluster_base.hpp.
|
inline |
If nvidia cuda is activated return a gpu context.
iw | ignore warning |
Definition at line 453 of file VCluster_base.hpp.
|
inline |
Get the MPI_Communicator (or processor group) this VCluster is using.
Definition at line 469 of file VCluster_base.hpp.
|
inline |
Get the total number of processors.
Definition at line 479 of file VCluster_base.hpp.
|
inline |
Get the process unit id.
Definition at line 535 of file VCluster_base.hpp.
|
inline |
Get the maximum number across all processors (or reduction with infinity norm)
num | to reduce |
Definition at line 581 of file VCluster_base.hpp.
|
inline |
Get the minimum number across all processors (or reduction with insinity norm)
num | to reduce |
Definition at line 601 of file VCluster_base.hpp.
|
inlineprivate |
disable operator=
Definition at line 208 of file VCluster_base.hpp.
|
inline |
Definition at line 498 of file VCluster_base.hpp.
|
inline |
In case of Asynchonous communications like sendrecvMultipleMessagesNBXAsync this function progress the communication.
Definition at line 620 of file VCluster_base.hpp.
|
inlineprivate |
Definition at line 220 of file VCluster_base.hpp.
|
inline |
Get the process unit id.
It is the same as getProcessUnitID()
Definition at line 549 of file VCluster_base.hpp.
|
inline |
Recv data from a processor.
proc | processor id |
tag | id |
v | vector to send |
Definition at line 1676 of file VCluster_base.hpp.
|
inline |
Recv data from a processor.
proc | processor id |
tag | id |
v | buffer to send |
sz | size of the buffer |
Definition at line 1646 of file VCluster_base.hpp.
|
inline |
Send data to a processor.
proc | processor id |
tag | id |
mem | buffer with the data to send |
sz | size |
Definition at line 1580 of file VCluster_base.hpp.
|
inline |
Send data to a processor.
proc | processor id |
tag | id |
v | buffer to send |
Definition at line 1611 of file VCluster_base.hpp.
|
inline |
Send and receive multiple messages.
It send multiple messages to a set of processors the and receive multiple messages from another set of processors, all the processor must call this function. In this particular case the receiver know from which processor is going to receive.
suppose the following situation the calling processor want to communicate
prc | list of processor with which it should communicate [1,1,6,7,8] |
data | data to send for each processors in contain a pointer to some type T this type T must have a method size() that return the size of the data-structure |
prc_recv | processor that receive data |
recv_sz | for each processor indicate the size of the data received |
msg_alloc | This is a call-back with the purpose of allocate space for the incoming message and give back a valid pointer, supposing that this call-back has been triggered by the processor of id 5 that want to communicate with me a message of size 100 byte the call-back will have the following 6 parameters in the call-back are in order:
|
ptr_arg | data passed to the call-back function specified |
opt | options, NONE (ignored in this moment) |
Definition at line 763 of file VCluster_base.hpp.
|
inline |
Send and receive multiple messages.
It send multiple messages to a set of processors the and receive multiple messages from another set of processors, all the processor must call this function
suppose the following situation the calling processor want to communicate
prc | list of processors you should communicate with [1,1,6,7,8] |
data | vector containing the data to send [v=vector<vector<int>>, v.size()=4, T=vector<int>], T at the moment is only tested for vectors of 0 or more generic elements (without pointers) |
msg_alloc | This is a call-back with the purpose to allocate space for the incoming messages and give back a valid pointer, supposing that this call-back has been triggered by the processor of id 5 that want to communicate with me a message of size 100 byte the call-back will have the following 6 parameters in the call-back in order:
|
ptr_arg | data passed to the call-back function specified |
opt | options, only NONE supported |
Definition at line 911 of file VCluster_base.hpp.
|
inline |
Send and receive multiple messages.
It send multiple messages to a set of processors the and receive multiple messages from another set of processors, all the processor must call this function. In this particular case the receiver know from which processor is going to receive.
suppose the following situation the calling processor want to communicate
n_send | number of send for this processor [4] |
prc | list of processor with which it should communicate [1,1,6,7,8] |
sz | the array contain the size of the message for each processor (zeros must not be presents) [100,100,50,48,70] |
ptr | array that contain the pointers to the message to send |
msg_alloc | This is a call-back with the purpose of allocate space for the incoming message and give back a valid pointer, supposing that this call-back has been triggered by the processor of id 5 that want to communicate with me a message of size 100 byte the call-back will have the following 6 parameters in the call-back are in order:
|
ptr_arg | data passed to the call-back function specified |
opt | options, NONE (ignored in this moment) |
Definition at line 1037 of file VCluster_base.hpp.
|
inline |
Send and receive multiple messages.
It send multiple messages to a set of processors the and receive multiple messages from another set of processors, all the processor must call this function. In this particular case the receiver know from which processor is going to receive, but does not know the size.
suppose the following situation the calling processor want to communicate
n_send | number of send for this processor [4] |
prc | list of processor with which it should communicate [1,1,6,7,8] |
sz | the array contain the size of the message for each processor (zeros must not be presents) [100,100,50,48,70] |
ptr | array that contain the pointers to the message to send |
msg_alloc | This is a call-back with the purpose of allocate space for the incoming message and give back a valid pointer, supposing that this call-back has been triggered by the processor of id 5 that want to communicate with me a message of size 100 byte the call-back will have the following 6 parameters in the call-back are in order:
|
ptr_arg | data passed to the call-back function specified |
opt | options, NONE (ignored in this moment) |
Definition at line 1189 of file VCluster_base.hpp.
|
inline |
Send and receive multiple messages.
It send multiple messages to a set of processors the and receive multiple messages from another set of processors, all the processor must call this function
suppose the following situation the calling processor want to communicate
n_send | number of send for this processor [4] |
prc | list of processor with which it should communicate [1,1,6,7,8] |
sz | the array contain the size of the message for each processor (zeros must not be presents) [100,100,50,48,70] |
ptr | array that contain the pointers to the message to send |
msg_alloc | This is a call-back with the purpose of allocate space for the incoming message and give back a valid pointer, supposing that this call-back has been triggered by the processor of id 5 that want to communicate with me a message of size 100 byte the call-back will have the following 6 parameters in the call-back are in order:
|
ptr_arg | data passed to the call-back function specified |
opt | options, NONE (ignored in this moment) |
Definition at line 1357 of file VCluster_base.hpp.
|
inline |
Send and receive multiple messages asynchronous version.
It send multiple messages to a set of processors the and receive multiple messages from another set of processors, all the processor must call this function. In this particular case the receiver know from which processor is going to receive.
suppose the following situation the calling processor want to communicate
prc | list of processor with which it should communicate [1,1,6,7,8] |
data | data to send for each processors in contain a pointer to some type T this type T must have a method size() that return the size of the data-structure |
prc_recv | processor that receive data |
recv_sz | for each processor indicate the size of the data received |
msg_alloc | This is a call-back with the purpose of allocate space for the incoming message and give back a valid pointer, supposing that this call-back has been triggered by the processor of id 5 that want to communicate with me a message of size 100 byte the call-back will have the following 6 parameters in the call-back are in order:
|
ptr_arg | data passed to the call-back function specified |
opt | options, NONE (ignored in this moment) |
Definition at line 843 of file VCluster_base.hpp.
|
inline |
Send and receive multiple messages asynchronous version.
This is the Asynchronous version of Send and receive NBX. This call return immediately, use sendrecvMultipleMessagesNBXWait to synchronize. Optionally you can use the function progress_communication to move on the communication
It send multiple messages to a set of processors the and receive multiple messages from another set of processors, all the processor must call this function
suppose the following situation the calling processor want to communicate
prc | list of processors you should communicate with [1,1,6,7,8] |
data | vector containing the data to send [v=vector<vector<int>>, v.size()=4, T=vector<int>], T at the moment is only tested for vectors of 0 or more generic elements (without pointers) |
msg_alloc | This is a call-back with the purpose to allocate space for the incoming messages and give back a valid pointer, supposing that this call-back has been triggered by the processor of id 5 that want to communicate with me a message of size 100 byte the call-back will have the following 6 parameters in the call-back in order:
|
ptr_arg | data passed to the call-back function specified |
opt | options, only NONE supported |
Definition at line 973 of file VCluster_base.hpp.
|
inline |
Send and receive multiple messages asynchronous version.
It send multiple messages to a set of processors the and receive multiple messages from another set of processors, all the processor must call this function. In this particular case the receiver know from which processor is going to receive.
suppose the following situation the calling processor want to communicate
n_send | number of send for this processor [4] |
prc | list of processor with which it should communicate [1,1,6,7,8] |
sz | the array contain the size of the message for each processor (zeros must not be presents) [100,100,50,48,70] |
ptr | array that contain the pointers to the message to send |
msg_alloc | This is a call-back with the purpose of allocate space for the incoming message and give back a valid pointer, supposing that this call-back has been triggered by the processor of id 5 that want to communicate with me a message of size 100 byte the call-back will have the following 6 parameters in the call-back are in order:
|
ptr_arg | data passed to the call-back function specified |
opt | options, NONE (ignored in this moment) |
Definition at line 1115 of file VCluster_base.hpp.
|
inline |
Send and receive multiple messages asynchronous version.
It send multiple messages to a set of processors the and receive multiple messages from another set of processors, all the processor must call this function. In this particular case the receiver know from which processor is going to receive, but does not know the size.
suppose the following situation the calling processor want to communicate
n_send | number of send for this processor [4] |
prc | list of processor with which it should communicate [1,1,6,7,8] |
sz | the array contain the size of the message for each processor (zeros must not be presents) [100,100,50,48,70] |
ptr | array that contain the pointers to the message to send |
msg_alloc | This is a call-back with the purpose of allocate space for the incoming message and give back a valid pointer, supposing that this call-back has been triggered by the processor of id 5 that want to communicate with me a message of size 100 byte the call-back will have the following 6 parameters in the call-back are in order:
|
ptr_arg | data passed to the call-back function specified |
opt | options, NONE (ignored in this moment) |
Definition at line 1279 of file VCluster_base.hpp.
|
inline |
Send and receive multiple messages Asynchronous version.
This is the Asynchronous version of Send and receive NBX. This call return immediately, use sendrecvMultipleMessagesNBXWait to synchronize. Optionally you can use the function progress_communication to move on the communication
It send multiple messages to a set of processors the and receive multiple messages from another set of processors, all the processor must call this function
suppose the following situation the calling processor want to communicate
n_send | number of send for this processor [4] |
prc | list of processor with which it should communicate [1,1,6,7,8] |
sz | the array contain the size of the message for each processor (zeros must not be presents) [100,100,50,48,70] |
ptr | array that contain the pointers to the message to send |
msg_alloc | This is a call-back with the purpose of allocate space for the incoming message and give back a valid pointer, supposing that this call-back has been triggered by the processor of id 5 that want to communicate with me a message of size 100 byte the call-back will have the following 6 parameters in the call-back are in order:
|
ptr_arg | data passed to the call-back function specified |
opt | options, NONE (ignored in this moment) |
Definition at line 1463 of file VCluster_base.hpp.
|
inline |
Send and receive multiple messages wait NBX communication to complete.
Definition at line 1490 of file VCluster_base.hpp.
|
inline |
Get the total number of processors.
It is the same as getProcessingUnits()
Definition at line 493 of file VCluster_base.hpp.
|
inline |
Sum the numbers across all processors and get the result.
num | to reduce, input and output |
Definition at line 561 of file VCluster_base.hpp.
|
private |
barrier request
Definition at line 202 of file VCluster_base.hpp.
|
private |
barrier status
Definition at line 205 of file VCluster_base.hpp.
|
private |
standard context for gpu (if cuda is detected otherwise is unused)
Definition at line 147 of file VCluster_base.hpp.
|
private |
log file
Definition at line 128 of file VCluster_base.hpp.
|
private |
actual rank
Definition at line 154 of file VCluster_base.hpp.
|
private |
number of processes
Definition at line 152 of file VCluster_base.hpp.
|
private |
vector that contain the scatter map (it is basically an array of one)
Definition at line 135 of file VCluster_base.hpp.
|
private |
Definition at line 161 of file VCluster_base.hpp.
|
private |
NBX_cycle.
Definition at line 214 of file VCluster_base.hpp.
|
private |
Definition at line 174 of file VCluster_base.hpp.
|
private |
Definition at line 180 of file VCluster_base.hpp.
|
private |
Definition at line 179 of file VCluster_base.hpp.
|
private |
Definition at line 175 of file VCluster_base.hpp.
|
private |
Definition at line 176 of file VCluster_base.hpp.
|
private |
Definition at line 181 of file VCluster_base.hpp.
|
private |
Definition at line 177 of file VCluster_base.hpp.
|
private |
Definition at line 182 of file VCluster_base.hpp.
|
private |
NBX comunication on queue (-1 mean 0, 0 mean 1, 1 mean 2, .... )
Definition at line 167 of file VCluster_base.hpp.
|
private |
Is the barrier request reached.
Definition at line 170 of file VCluster_base.hpp.
|
private |
Definition at line 178 of file VCluster_base.hpp.
|
private |
number of processing unit per process
Definition at line 157 of file VCluster_base.hpp.
|
private |
vector of functions to execute after all the request has been performed
Definition at line 144 of file VCluster_base.hpp.
|
private |
temporal vector used for meta-communication ( or meta-data before the real communication )
Definition at line 132 of file VCluster_base.hpp.
|
private |
vector of pointers of send buffers
Definition at line 196 of file VCluster_base.hpp.
|
private |
This buffer is a temporal buffer for reductions
MPI_Iallreduce does not accept recv and send buffer to be the same r is used to overcome this problem (is given as second parameter) after the execution the data is copied back
Definition at line 193 of file VCluster_base.hpp.
|
protected |
Receive buffers.
Definition at line 260 of file VCluster_base.hpp.
|
private |
vector of MPI requests
Definition at line 138 of file VCluster_base.hpp.
|
private |
request id
Definition at line 164 of file VCluster_base.hpp.
|
private |
rank within the node
Definition at line 211 of file VCluster_base.hpp.
|
private |
vector of MPI status
Definition at line 141 of file VCluster_base.hpp.
openfpm::vector<size_t> Vcluster_base< InternalMemory >::sz_recv_tmp |
Definition at line 1145 of file VCluster_base.hpp.
|
private |
vector of the size of send buffers
Definition at line 199 of file VCluster_base.hpp.
|
protected |
tags receiving
Definition at line 263 of file VCluster_base.hpp.