VTK  9.1.0
vtkMPICommunicator.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkMPICommunicator.h
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14=========================================================================*/
36#ifndef vtkMPICommunicator_h
37#define vtkMPICommunicator_h
38
39#include "vtkCommunicator.h"
40#include "vtkParallelMPIModule.h" // For export macro
41
43class vtkProcessGroup;
44
45class vtkMPICommunicatorOpaqueComm;
46class vtkMPICommunicatorOpaqueRequest;
47class vtkMPICommunicatorReceiveDataInfo;
48
49class VTKPARALLELMPI_EXPORT vtkMPICommunicator : public vtkCommunicator
50{
51public:
52 class VTKPARALLELMPI_EXPORT Request
53 {
54 public:
59 int Test();
60 void Cancel();
61 void Wait();
62 vtkMPICommunicatorOpaqueRequest* Req;
63 };
64
66 void PrintSelf(ostream& os, vtkIndent indent) override;
67
72
78
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#ifdef VTK_USE_64BIT_IDS
122 int NoBlockSend(const vtkIdType* data, int length, int remoteProcessId, int tag, Request& req);
123#endif
125
127
134 int NoBlockReceive(int* data, int length, int remoteProcessId, int tag, Request& req);
135 int NoBlockReceive(unsigned long* data, int length, int remoteProcessId, int tag, Request& req);
136 int NoBlockReceive(char* data, int length, int remoteProcessId, int tag, Request& req);
137 int NoBlockReceive(unsigned char* data, int length, int remoteProcessId, int tag, Request& req);
138 int NoBlockReceive(float* data, int length, int remoteProcessId, int tag, Request& req);
139 int NoBlockReceive(double* data, int length, int remoteProcessId, int tag, Request& req);
140#ifdef VTK_USE_64BIT_IDS
141 int NoBlockReceive(vtkIdType* data, int length, int remoteProcessId, int tag, Request& req);
142#endif
144
146
151 void Barrier() override;
152 int BroadcastVoidArray(void* data, vtkIdType length, int type, int srcProcessId) override;
153 int GatherVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
154 int destProcessId) override;
155 int GatherVVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType sendLength,
156 vtkIdType* recvLengths, vtkIdType* offsets, int type, int destProcessId) override;
157 int ScatterVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
158 int srcProcessId) override;
159 int ScatterVVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType* sendLengths,
160 vtkIdType* offsets, vtkIdType recvLength, int type, int srcProcessId) override;
162 const void* sendBuffer, void* recvBuffer, vtkIdType length, int type) override;
163 int AllGatherVVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType sendLength,
164 vtkIdType* recvLengths, vtkIdType* offsets, int type) override;
165 int ReduceVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
166 int operation, int destProcessId) override;
167 int ReduceVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
168 Operation* operation, int destProcessId) override;
170 const void* sendBuffer, void* recvBuffer, vtkIdType length, int type, int operation) override;
171 int AllReduceVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
172 Operation* operation) override;
174
176
185 int Iprobe(int source, int tag, int* flag, int* actualSource);
186 int Iprobe(int source, int tag, int* flag, int* actualSource, int* type, int* size);
187 int Iprobe(int source, int tag, int* flag, int* actualSource, unsigned long* type, int* size);
188 int Iprobe(int source, int tag, int* flag, int* actualSource, const char* type, int* size);
189 int Iprobe(int source, int tag, int* flag, int* actualSource, float* type, int* size);
190 int Iprobe(int source, int tag, int* flag, int* actualSource, double* type, int* size);
192
197 int WaitAll(const int count, Request requests[]);
198
204 int WaitAny(const int count, Request requests[], int& idx) VTK_SIZEHINT(requests, count);
205
211 int WaitSome(const int count, Request requests[], int& NCompleted, int* completed)
212 VTK_SIZEHINT(requests, count);
213
219 int TestAll(const int count, Request requests[], int& flag) VTK_SIZEHINT(requests, count);
220
224 int TestAny(const int count, Request requests[], int& idx, int& flag)
225 VTK_SIZEHINT(requests, count);
226
233 int TestSome(const int count, Request requests[], int& NCompleted, int* completed)
234 VTK_SIZEHINT(requests, count);
235
236 friend class vtkMPIController;
237
238 vtkMPICommunicatorOpaqueComm* GetMPIComm() { return this->MPIComm; }
239
240 int InitializeExternal(vtkMPICommunicatorOpaqueComm* comm);
241
242 static char* Allocate(size_t size);
243 static void Free(char* ptr);
244
246
250 vtkSetClampMacro(UseSsend, int, 0, 1);
251 vtkGetMacro(UseSsend, int);
252 vtkBooleanMacro(UseSsend, int);
254
263
264protected:
267
268 // Obtain size and rank setting NumberOfProcesses and LocalProcessId Should
269 // not be called if the current communicator does not include this process
271
273
283 vtkSetMacro(KeepHandle, int);
284 vtkBooleanMacro(KeepHandle, int);
286
288
290
301
305 virtual int ReceiveDataInternal(char* data, int length, int sizeoftype, int remoteProcessId,
306 int tag, vtkMPICommunicatorReceiveDataInfo* info, int useCopy, int& senderId);
307
308 vtkMPICommunicatorOpaqueComm* MPIComm;
309
312
315 static int CheckForMPIError(int err);
316
317private:
318 vtkMPICommunicator(const vtkMPICommunicator&) = delete;
319 void operator=(const vtkMPICommunicator&) = delete;
320};
321
322#endif
A custom operation to use in a reduce command.
Used to send/receive messages in a multiprocess environment.
a simple class to control print indentation
Definition: vtkIndent.h:113
Request(const Request &)
vtkMPICommunicatorOpaqueRequest * Req
Request & operator=(const Request &)
Class for creating user defined MPI communicators.
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 InitializeNumberOfProcesses()
int SplitInitialize(vtkCommunicator *oldcomm, int color, int key)
Used to initialize the communicator (i.e.
int InitializeExternal(vtkMPICommunicatorOpaqueComm *comm)
static vtkMPICommunicator * New()
Creates an empty communicator.
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.
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 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.
int TestAny(const int count, Request requests[], int &idx, int &flag)
Check if at least one of the specified requests has completed.
static char * Allocate(size_t size)
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 float *data, int length, int remoteProcessId, int tag, Request &req)
This method sends data to another process (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 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 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 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 TestAll(const int count, Request requests[], int &flag)
Checks if the given communication request objects are complete.
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.
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 WaitSome(const 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 WaitAll(const int count, Request requests[])
Given the request objects of a set of non-blocking operations (send and/or receive) this method block...
void CopyFrom(vtkMPICommunicator *source)
Copies all the attributes of source, deleting previously stored data.
int TestSome(const int count, Request requests[], int &NCompleted, int *completed)
Checks the status of all the given request communication object handles.
int WaitAny(const int count, Request requests[], int &idx)
Blocks until one of the specified requests in the given request array completes.
int Iprobe(int source, int tag, int *flag, int *actualSource, unsigned long *type, int *size)
Nonblocking test for a message.
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(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.
~vtkMPICommunicator() override
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 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 Iprobe(int source, int tag, int *flag, int *actualSource, double *type, int *size)
Nonblocking 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:332
#define VTK_SIZEHINT(...)