VTK  9.6.20260514
vtkMPICommunicator.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
26
27#ifndef vtkMPICommunicator_h
28#define vtkMPICommunicator_h
29
30#include "vtkCommunicator.h"
31#include "vtkMPI.h" // for MPI_Datatype
32#include "vtkParallelMPIModule.h" // For export macro
33
34VTK_ABI_NAMESPACE_BEGIN
36class vtkProcessGroup;
37
38class vtkMPICommunicatorOpaqueComm;
39class vtkMPICommunicatorOpaqueRequest;
40class vtkMPICommunicatorReceiveDataInfo;
41
42class VTKPARALLELMPI_EXPORT vtkMPICommunicator : public vtkCommunicator
43{
44public:
45 class VTKPARALLELMPI_EXPORT Request
46 {
47 public:
52 int Test();
53 void Cancel();
54 void Wait();
55 vtkMPICommunicatorOpaqueRequest* Req;
56 };
57
59 void PrintSelf(ostream& os, vtkIndent indent) override;
60
65
71
77
84
90 int SplitInitialize(vtkCommunicator* oldcomm, int color, int key);
91
93
99 const void* data, vtkIdType length, int type, int remoteProcessId, int tag) override;
101 void* data, vtkIdType length, int type, int remoteProcessId, int tag) override;
103
105
113 int NoBlockSend(const int* data, int length, int remoteProcessId, int tag, Request& req);
115 const unsigned long* data, int length, int remoteProcessId, int tag, Request& req);
116 int NoBlockSend(const char* data, int length, int remoteProcessId, int tag, Request& req);
118 const unsigned char* data, int length, int remoteProcessId, int tag, Request& req);
119 int NoBlockSend(const float* data, int length, int remoteProcessId, int tag, Request& req);
120 int NoBlockSend(const double* data, int length, int remoteProcessId, int tag, Request& req);
121 int NoBlockSend(const vtkTypeInt64* data, int length, int remoteProcessId, int tag, Request& req);
122
123 int NoBlockSend(const int* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
125 const unsigned long* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
127 const char* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
129 const unsigned char* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
131 const float* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
133 const double* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
135 const vtkTypeInt64* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
137
141 int NoBlockSend(const void* data, vtkTypeInt64 length, MPI_Datatype mpiType, int remoteProcessId,
142 int tag, Request& req);
143
145
152 int NoBlockReceive(int* data, int length, int remoteProcessId, int tag, Request& req);
153 int NoBlockReceive(unsigned long* data, int length, int remoteProcessId, int tag, Request& req);
154 int NoBlockReceive(char* data, int length, int remoteProcessId, int tag, Request& req);
155 int NoBlockReceive(unsigned char* data, int length, int remoteProcessId, int tag, Request& req);
156 int NoBlockReceive(float* data, int length, int remoteProcessId, int tag, Request& req);
157 int NoBlockReceive(double* data, int length, int remoteProcessId, int tag, Request& req);
158 int NoBlockReceive(vtkTypeInt64* data, int length, int remoteProcessId, int tag, Request& req);
159
160 int NoBlockReceive(int* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
162 unsigned long* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
163 int NoBlockReceive(char* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
165 unsigned char* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
166 int NoBlockReceive(float* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
167 int NoBlockReceive(double* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
169 vtkTypeInt64* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
171
175 int AllToAllVVoidArray(const void* sendBuffer, const int* sendCounts, const int* sendOffsets,
176 void* recvBuffer, const int* recvCounts, const int* recvOffsets, int type) override;
177
179
184 void Barrier() override;
185 int BroadcastVoidArray(void* data, vtkIdType length, int type, int srcProcessId) override;
186 int GatherVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
187 int destProcessId) override;
188 int GatherVVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType sendLength,
189 vtkIdType* recvLengths, vtkIdType* offsets, int type, int destProcessId) override;
190 int ScatterVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
191 int srcProcessId) override;
192 int ScatterVVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType* sendLengths,
193 vtkIdType* offsets, vtkIdType recvLength, int type, int srcProcessId) override;
195 const void* sendBuffer, void* recvBuffer, vtkIdType length, int type) override;
196 int AllGatherVVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType sendLength,
197 vtkIdType* recvLengths, vtkIdType* offsets, int type) override;
198 int ReduceVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
199 int operation, int destProcessId) override;
200 int ReduceVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
201 Operation* operation, int destProcessId) override;
203 const void* sendBuffer, void* recvBuffer, vtkIdType length, int type, int operation) override;
204 int AllReduceVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
205 Operation* operation) override;
207
209
218 int Iprobe(int source, int tag, int* flag, int* actualSource);
219 int Iprobe(int source, int tag, int* flag, int* actualSource, int* type, int* size);
220 int Iprobe(int source, int tag, int* flag, int* actualSource, unsigned long* type, int* size);
221 int Iprobe(int source, int tag, int* flag, int* actualSource, const char* type, int* size);
222 int Iprobe(int source, int tag, int* flag, int* actualSource, float* type, int* size);
223 int Iprobe(int source, int tag, int* flag, int* actualSource, double* type, int* size);
224
225 int Iprobe(int source, int tag, int* flag, int* actualSource, int* type, vtkTypeInt64* size);
227 int source, int tag, int* flag, int* actualSource, unsigned long* type, vtkTypeInt64* size);
229 int source, int tag, int* flag, int* actualSource, const char* type, vtkTypeInt64* size);
230 int Iprobe(int source, int tag, int* flag, int* actualSource, float* type, vtkTypeInt64* size);
231 int Iprobe(int source, int tag, int* flag, int* actualSource, double* type, vtkTypeInt64* size);
233
237 bool CanProbe() override { return true; };
238
240
248 int Probe(int source, int tag, int* actualSource) override;
249 int Probe(int source, int tag, int* actualSource, int* type, int* size);
250 int Probe(int source, int tag, int* actualSource, unsigned long* type, int* size);
251 int Probe(int source, int tag, int* actualSource, const char* type, int* size);
252 int Probe(int source, int tag, int* actualSource, float* type, int* size);
253 int Probe(int source, int tag, int* actualSource, double* type, int* size);
254
255 int Probe(int source, int tag, int* actualSource, int* type, vtkTypeInt64* size);
256 int Probe(int source, int tag, int* actualSource, unsigned long* type, vtkTypeInt64* size);
257 int Probe(int source, int tag, int* actualSource, const char* type, vtkTypeInt64* size);
258 int Probe(int source, int tag, int* actualSource, float* type, vtkTypeInt64* size);
259 int Probe(int source, int tag, int* actualSource, double* type, vtkTypeInt64* size);
261
266 int WaitAll(int count, Request requests[]);
267
273 int WaitAny(int count, Request requests[], int& idx) VTK_SIZEHINT(requests, count);
274
280 int WaitSome(int count, Request requests[], int& NCompleted, int* completed)
281 VTK_SIZEHINT(requests, count);
282
288 int TestAll(int count, Request requests[], int& flag) VTK_SIZEHINT(requests, count);
289
293 int TestAny(int count, Request requests[], int& idx, int& flag) VTK_SIZEHINT(requests, count);
294
301 int TestSome(int count, Request requests[], int& NCompleted, int* completed)
302 VTK_SIZEHINT(requests, count);
303
304 friend class vtkMPIController;
305
306 vtkMPICommunicatorOpaqueComm* GetMPIComm() { return this->MPIComm; }
307
308 int InitializeExternal(vtkMPICommunicatorOpaqueComm* comm);
309
310 static char* Allocate(size_t size);
311 static void Free(char* ptr);
312
314
318 vtkSetClampMacro(UseSsend, int, 0, 1);
319 vtkGetMacro(UseSsend, int);
320 vtkBooleanMacro(UseSsend, int);
322
331
332protected:
335
336 // Obtain size and rank setting NumberOfProcesses and LocalProcessId Should
337 // not be called if the current communicator does not include this process
339
341
351 vtkSetMacro(KeepHandle, int);
352 vtkBooleanMacro(KeepHandle, int);
354
356
358
369
371
374 virtual int ReceiveDataInternal(char* data, int length, int sizeoftype, int remoteProcessId,
375 int tag, vtkMPICommunicatorReceiveDataInfo* info, int useCopy, int& senderId);
376 virtual int ReceiveDataInternal(char* data, vtkTypeInt64 length, int sizeoftype,
377 int remoteProcessId, int tag, vtkMPICommunicatorReceiveDataInfo* info, int useCopy,
378 int& senderId);
380
388 int GetTagMaxValue() const override { return this->TagMaxValue; }
389
390 static int CheckForMPIError(int err);
391
392 vtkMPICommunicatorOpaqueComm* MPIComm;
393
396
399
401
402private:
403 vtkMPICommunicator(const vtkMPICommunicator&) = delete;
404 void operator=(const vtkMPICommunicator&) = delete;
405};
406
407VTK_ABI_NAMESPACE_END
408#endif
A custom operation to use in a reduce command.
a simple class to control print indentation
Definition vtkIndent.h:108
Request(const Request &)
vtkMPICommunicatorOpaqueRequest * Req
Request & operator=(const Request &)
bool CanProbe() override
Check if this communicator implements a probe operation (always true for MPI communicator)
int NoBlockReceive(vtkTypeInt64 *data, int length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int NoBlockReceive(double *data, int length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int NoBlockReceive(unsigned char *data, int length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
void InitializeCopy(vtkMPICommunicator *source)
static vtkMPICommunicator * WorldCommunicator
int Probe(int source, int tag, int *actualSource, const char *type, vtkTypeInt64 *size)
Blocking test for a message.
int Iprobe(int source, int tag, int *flag, int *actualSource, const char *type, vtkTypeInt64 *size)
Nonblocking test for a message.
int InitializeNumberOfProcesses()
int SplitInitialize(vtkCommunicator *oldcomm, int color, int key)
Used to initialize the communicator (i.e.
int Probe(int source, int tag, int *actualSource, double *type, vtkTypeInt64 *size)
Blocking test for a message.
int InitializeExternal(vtkMPICommunicatorOpaqueComm *comm)
static vtkMPICommunicator * New()
Creates an empty communicator.
int GetTagMaxValue() const override
Overrides the base function to return the maximum value for a tag supported by MPI.
int Initialize(vtkProcessGroup *group)
Used to initialize the communicator (i.e.
virtual int ReceiveDataInternal(char *data, int length, int sizeoftype, int remoteProcessId, int tag, vtkMPICommunicatorReceiveDataInfo *info, int useCopy, int &senderId)
Implementation for receive data.
friend class vtkMPIController
int AllToAllVVoidArray(const void *sendBuffer, const int *sendCounts, const int *sendOffsets, void *recvBuffer, const int *recvCounts, const int *recvOffsets, int type) override
Exchange variable-sized messages between all processes.
int NoBlockSend(const unsigned char *data, int length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
static vtkMPICommunicator * GetWorldCommunicator()
Returns the singleton which behaves as the global communicator (MPI_COMM_WORLD)
int Iprobe(int source, int tag, int *flag, int *actualSource, unsigned long *type, vtkTypeInt64 *size)
Nonblocking test for a message.
int NoBlockSend(const char *data, int length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int ScatterVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, int srcProcessId) override
More efficient implementations of collective operations that use the equivalent MPI commands.
static char * Allocate(size_t size)
int Iprobe(int source, int tag, int *flag, int *actualSource, double *type, vtkTypeInt64 *size)
Nonblocking test for a message.
int NoBlockReceive(int *data, int length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int NoBlockSend(const double *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int NoBlockSend(const float *data, int length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int NoBlockReceive(unsigned long *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
void Barrier() override
More efficient implementations of collective operations that use the equivalent MPI commands.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
vtkMPICommunicatorOpaqueComm * MPIComm
int GatherVVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType sendLength, vtkIdType *recvLengths, vtkIdType *offsets, int type, int destProcessId) override
More efficient implementations of collective operations that use the equivalent MPI commands.
int Iprobe(int source, int tag, int *flag, int *actualSource, float *type, vtkTypeInt64 *size)
Nonblocking test for a message.
int Probe(int source, int tag, int *actualSource, float *type, vtkTypeInt64 *size)
Blocking test for a message.
int ReduceVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, int operation, int destProcessId) override
More efficient implementations of collective operations that use the equivalent MPI commands.
int Iprobe(int source, int tag, int *flag, int *actualSource, int *type, vtkTypeInt64 *size)
Nonblocking test for a message.
int Probe(int source, int tag, int *actualSource, double *type, int *size)
Blocking test for a message.
int NoBlockSend(const char *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int Probe(int source, int tag, int *actualSource, unsigned long *type, vtkTypeInt64 *size)
Blocking test for a message.
int NoBlockSend(const int *data, int length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int Iprobe(int source, int tag, int *flag, int *actualSource)
Nonblocking test for a message.
int SendVoidArray(const void *data, vtkIdType length, int type, int remoteProcessId, int tag) override
Performs the actual communication.
static void Free(char *ptr)
int WaitAny(int count, Request requests[], int &idx)
Blocks until one of the specified requests in the given request array completes.
int NoBlockSend(const void *data, vtkTypeInt64 length, MPI_Datatype mpiType, int remoteProcessId, int tag, Request &req)
Variant that permits dynamic type sends, like those create by MPI_Type_create_subarray.
int NoBlockReceive(double *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int NoBlockReceive(unsigned long *data, int length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int AllGatherVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type) override
More efficient implementations of collective operations that use the equivalent MPI commands.
int ScatterVVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType *sendLengths, vtkIdType *offsets, vtkIdType recvLength, int type, int srcProcessId) override
More efficient implementations of collective operations that use the equivalent MPI commands.
virtual int ReceiveDataInternal(char *data, vtkTypeInt64 length, int sizeoftype, int remoteProcessId, int tag, vtkMPICommunicatorReceiveDataInfo *info, int useCopy, int &senderId)
Implementation for receive data.
int NoBlockSend(const vtkTypeInt64 *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int NoBlockReceive(int *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int NoBlockSend(const int *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int Iprobe(int source, int tag, int *flag, int *actualSource, int *type, int *size)
Nonblocking test for a message.
int AllReduceVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, Operation *operation) override
More efficient implementations of collective operations that use the equivalent MPI commands.
int Probe(int source, int tag, int *actualSource, int *type, int *size)
Blocking test for a message.
int NoBlockSend(const vtkTypeInt64 *data, int length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int NoBlockSend(const unsigned long *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int TestAny(int count, Request requests[], int &idx, int &flag)
Check if at least one of the specified requests has completed.
void CopyFrom(vtkMPICommunicator *source)
Copies all the attributes of source, deleting previously stored data.
int Probe(int source, int tag, int *actualSource, const char *type, int *size)
Blocking test for a message.
int Iprobe(int source, int tag, int *flag, int *actualSource, unsigned long *type, int *size)
Nonblocking test for a message.
int NoBlockSend(const float *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int ReceiveVoidArray(void *data, vtkIdType length, int type, int remoteProcessId, int tag) override
Performs the actual communication.
int NoBlockSend(const unsigned long *data, int length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int NoBlockSend(const double *data, int length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int ReduceVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, Operation *operation, int destProcessId) override
More efficient implementations of collective operations that use the equivalent MPI commands.
int BroadcastVoidArray(void *data, vtkIdType length, int type, int srcProcessId) override
More efficient implementations of collective operations that use the equivalent MPI commands.
int NoBlockReceive(float *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int NoBlockSend(const unsigned char *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (non-blocking).
int TestSome(int count, Request requests[], int &NCompleted, int *completed)
Checks the status of all the given request communication object handles.
int Probe(int source, int tag, int *actualSource, unsigned long *type, int *size)
Blocking test for a message.
int NoBlockReceive(char *data, int length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int AllGatherVVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType sendLength, vtkIdType *recvLengths, vtkIdType *offsets, int type) override
More efficient implementations of collective operations that use the equivalent MPI commands.
int Probe(int source, int tag, int *actualSource, float *type, int *size)
Blocking test for a message.
~vtkMPICommunicator() override
int WaitAll(int count, Request requests[])
Given the request objects of a set of non-blocking operations (send and/or receive) this method block...
int Iprobe(int source, int tag, int *flag, int *actualSource, float *type, int *size)
Nonblocking test for a message.
int AllReduceVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, int operation) override
More efficient implementations of collective operations that use the equivalent MPI commands.
static int CheckForMPIError(int err)
int Probe(int source, int tag, int *actualSource) override
Blocking test for a message.
int WaitSome(int count, Request requests[], int &NCompleted, int *completed)
Blocks until one or more of the specified requests in the given request request array completes.
int NoBlockReceive(vtkTypeInt64 *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int GatherVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, int destProcessId) override
More efficient implementations of collective operations that use the equivalent MPI commands.
vtkMPICommunicatorOpaqueComm * GetMPIComm()
void Duplicate(vtkMPICommunicator *source)
Copies all the attributes of source, deleting previously stored data EXCEPT the MPI communicator hand...
int NoBlockReceive(float *data, int length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int Iprobe(int source, int tag, int *flag, int *actualSource, const char *type, int *size)
Nonblocking test for a message.
int NoBlockReceive(char *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int NoBlockReceive(unsigned char *data, vtkTypeInt64 length, int remoteProcessId, int tag, Request &req)
This method receives data from a corresponding send (non-blocking).
int Iprobe(int source, int tag, int *flag, int *actualSource, double *type, int *size)
Nonblocking test for a message.
int TestAll(int count, Request requests[], int &flag)
Checks if the given communication request objects are complete.
void InitializeAttributes()
Used to initialize MPI attributes.
int Probe(int source, int tag, int *actualSource, int *type, vtkTypeInt64 *size)
Blocking test for a message.
Process communication using MPI.
A subgroup of processes from a communicator.
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
int vtkIdType
Definition vtkType.h:363
#define VTK_INT_MAX
Definition vtkType.h:192
#define VTK_SIZEHINT(...)