VTK  9.7.1
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
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 
34 VTK_ABI_NAMESPACE_BEGIN
35 class vtkMPIController;
36 class vtkProcessGroup;
37 
38 class vtkMPICommunicatorOpaqueComm;
39 class vtkMPICommunicatorOpaqueRequest;
40 class vtkMPICommunicatorReceiveDataInfo;
41 
42 class VTKPARALLELMPI_EXPORT vtkMPICommunicator : public vtkCommunicator
43 {
44 public:
45  class VTKPARALLELMPI_EXPORT Request
46  {
47  public:
48  Request();
49  Request(const Request&);
50  ~Request();
51  Request& operator=(const Request&);
52  int Test();
53  void Cancel();
54  void Wait();
55  vtkMPICommunicatorOpaqueRequest* Req;
56  };
57 
59  void PrintSelf(ostream& os, vtkIndent indent) override;
60 
64  static vtkMPICommunicator* New();
65 
70  static vtkMPICommunicator* GetWorldCommunicator();
71 
76  int Initialize(vtkProcessGroup* group);
77 
83  void InitializeAttributes();
84 
90  int SplitInitialize(vtkCommunicator* oldcomm, int color, int key);
91 
93 
98  int SendVoidArray(
99  const void* data, vtkIdType length, int type, int remoteProcessId, int tag) override;
100  int ReceiveVoidArray(
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);
114  int NoBlockSend(
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);
117  int NoBlockSend(
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);
124  int NoBlockSend(
125  const unsigned long* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
126  int NoBlockSend(
127  const char* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
128  int NoBlockSend(
129  const unsigned char* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
130  int NoBlockSend(
131  const float* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
132  int NoBlockSend(
133  const double* data, vtkTypeInt64 length, int remoteProcessId, int tag, Request& req);
134  int NoBlockSend(
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);
161  int NoBlockReceive(
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);
164  int NoBlockReceive(
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);
168  int NoBlockReceive(
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;
194  int AllGatherVoidArray(
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;
202  int AllReduceVoidArray(
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);
226  int Iprobe(
227  int source, int tag, int* flag, int* actualSource, unsigned long* type, vtkTypeInt64* size);
228  int Iprobe(
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 
330  void CopyFrom(vtkMPICommunicator* source);
331 
332 protected:
334  ~vtkMPICommunicator() override;
335 
336  // Obtain size and rank setting NumberOfProcesses and LocalProcessId Should
337  // not be called if the current communicator does not include this process
338  int InitializeNumberOfProcesses();
339 
341 
351  vtkSetMacro(KeepHandle, int);
352  vtkBooleanMacro(KeepHandle, int);
354 
356 
357  void InitializeCopy(vtkMPICommunicator* source);
358 
368  void Duplicate(vtkMPICommunicator* source);
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 
398  int UseSsend;
399 
400  int TagMaxValue = VTK_INT_MAX;
401 
402 private:
403  vtkMPICommunicator(const vtkMPICommunicator&) = delete;
404  void operator=(const vtkMPICommunicator&) = delete;
405 };
406 
407 VTK_ABI_NAMESPACE_END
408 #endif
A custom operation to use in a reduce command.
vtkMPICommunicatorOpaqueRequest * Req
static vtkMPICommunicator * WorldCommunicator
#define VTK_INT_MAX
Definition: vtkType.h:192
Class for creating user defined MPI communicators.
int vtkIdType
Definition: vtkType.h:363
vtkMPICommunicatorOpaqueComm * MPIComm
a simple class to control print indentation
Definition: vtkIndent.h:28
int Test(int argc, char *argv[], const char *dfile, const InitializationCallback &initCallback)
A subgroup of processes from a communicator.
Process communication using MPI.
int GetTagMaxValue() const override
Overrides the base function to return the maximum value for a tag supported by MPI.
#define VTK_SIZEHINT(...)
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
Used to send/receive messages in a multiprocess environment.
bool CanProbe() override
Check if this communicator implements a probe operation (always true for MPI communicator) ...
vtkMPICommunicatorOpaqueComm * GetMPIComm()