VTK  9.5.20251214
vtkMPIController.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
36
37#ifndef vtkMPIController_h
38#define vtkMPIController_h
39
41#include "vtkParallelMPIModule.h" // For export macro
42#include "vtkTypeList.h" // For vtkTypeList
43// Do not remove this header file. This class contains methods
44// which take arguments defined in vtkMPICommunicator.h by
45// reference.
46#include "vtkMPICommunicator.h" // Needed for direct access to communicator
47
48VTK_ABI_NAMESPACE_BEGIN
49class vtkIntArray;
50
51class VTKPARALLELMPI_EXPORT vtkMPIController : public vtkMultiProcessController
52{
53
54public:
57 void PrintSelf(ostream& os, vtkIndent indent) override;
58
62 using ValueTypes =
63 vtkTypeList::Create<float, double, char, int, vtkTypeInt64, unsigned char, unsigned long>;
64
76 void Initialize(int* argc, char*** argv) override { this->Initialize(argc, argv, 0); }
77
79 int* vtkNotUsed(argc), char*** vtkNotUsed(argv), int initializedExternally) override;
80
84 virtual void Initialize();
85
91 void Finalize() override { this->Finalize(0); }
92
93 void Finalize(int finalizedExternally) override;
94
99 void SingleMethodExecute() override;
100
106 void MultipleMethodExecute() override;
107
113 void CreateOutputWindow() override;
114
119 static char* ErrorString(int err);
120
131
133
134 vtkMPIController* PartitionController(int localColor, int localKey) override;
135
137
147 const int* data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
148 {
149 return ((vtkMPICommunicator*)this->Communicator)
150 ->NoBlockSend(data, length, remoteProcessId, tag, req);
151 }
152 int NoBlockSend(const unsigned long* data, int length, int remoteProcessId, int tag,
154 {
155 return ((vtkMPICommunicator*)this->Communicator)
156 ->NoBlockSend(data, length, remoteProcessId, tag, req);
157 }
159 const char* data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
160 {
161 return ((vtkMPICommunicator*)this->Communicator)
162 ->NoBlockSend(data, length, remoteProcessId, tag, req);
163 }
164 int NoBlockSend(const unsigned char* data, int length, int remoteProcessId, int tag,
166 {
167 return ((vtkMPICommunicator*)this->Communicator)
168 ->NoBlockSend(data, length, remoteProcessId, tag, req);
169 }
171 const float* data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
172 {
173 return ((vtkMPICommunicator*)this->Communicator)
174 ->NoBlockSend(data, length, remoteProcessId, tag, req);
175 }
177 const double* data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
178 {
179 return ((vtkMPICommunicator*)this->Communicator)
180 ->NoBlockSend(data, length, remoteProcessId, tag, req);
181 }
182 int NoBlockSend(const vtkTypeInt64* data, int length, int remoteProcessId, int tag,
184 {
185 return ((vtkMPICommunicator*)this->Communicator)
186 ->NoBlockSend(data, length, remoteProcessId, tag, req);
187 }
188 int NoBlockSend(const int* data, vtkTypeInt64 length, int remoteProcessId, int tag,
190 {
191 return ((vtkMPICommunicator*)this->Communicator)
192 ->NoBlockSend(data, length, remoteProcessId, tag, req);
193 }
194 int NoBlockSend(const unsigned long* data, vtkTypeInt64 length, int remoteProcessId, int tag,
196 {
197 return ((vtkMPICommunicator*)this->Communicator)
198 ->NoBlockSend(data, length, remoteProcessId, tag, req);
199 }
200 int NoBlockSend(const char* data, vtkTypeInt64 length, int remoteProcessId, int tag,
202 {
203 return ((vtkMPICommunicator*)this->Communicator)
204 ->NoBlockSend(data, length, remoteProcessId, tag, req);
205 }
206 int NoBlockSend(const unsigned char* data, vtkTypeInt64 length, int remoteProcessId, int tag,
208 {
209 return ((vtkMPICommunicator*)this->Communicator)
210 ->NoBlockSend(data, length, remoteProcessId, tag, req);
211 }
212 int NoBlockSend(const float* data, vtkTypeInt64 length, int remoteProcessId, int tag,
214 {
215 return ((vtkMPICommunicator*)this->Communicator)
216 ->NoBlockSend(data, length, remoteProcessId, tag, req);
217 }
218 int NoBlockSend(const double* data, vtkTypeInt64 length, int remoteProcessId, int tag,
220 {
221 return ((vtkMPICommunicator*)this->Communicator)
222 ->NoBlockSend(data, length, remoteProcessId, tag, req);
223 }
224 int NoBlockSend(const vtkTypeInt64* data, vtkTypeInt64 length, int remoteProcessId, int tag,
226 {
227 return ((vtkMPICommunicator*)this->Communicator)
228 ->NoBlockSend(data, length, remoteProcessId, tag, req);
229 }
230
231
235 int NoBlockSend(const void* data, vtkTypeInt64 length, MPI_Datatype mpiType, int remoteProcessId,
236 int tag, vtkMPICommunicator::Request& req)
237 {
238 return ((vtkMPICommunicator*)this->Communicator)
239 ->NoBlockSend(data, length, mpiType, remoteProcessId, tag, req);
240 }
241
243
252 int* data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
253 {
254 return ((vtkMPICommunicator*)this->Communicator)
255 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
256 }
258 unsigned long* data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
259 {
260 return ((vtkMPICommunicator*)this->Communicator)
261 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
262 }
264 char* data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
265 {
266 return ((vtkMPICommunicator*)this->Communicator)
267 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
268 }
270 unsigned char* data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
271 {
272 return ((vtkMPICommunicator*)this->Communicator)
273 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
274 }
276 float* data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
277 {
278 return ((vtkMPICommunicator*)this->Communicator)
279 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
280 }
282 double* data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
283 {
284 return ((vtkMPICommunicator*)this->Communicator)
285 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
286 }
288 vtkTypeInt64* data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
289 {
290 return ((vtkMPICommunicator*)this->Communicator)
291 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
292 }
294 int* data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
295 {
296 return ((vtkMPICommunicator*)this->Communicator)
297 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
298 }
299 int NoBlockReceive(unsigned long* data, vtkTypeInt64 length, int remoteProcessId, int tag,
301 {
302 return ((vtkMPICommunicator*)this->Communicator)
303 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
304 }
306 char* data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request& req)
307 {
308 return ((vtkMPICommunicator*)this->Communicator)
309 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
310 }
311 int NoBlockReceive(unsigned char* data, vtkTypeInt64 length, int remoteProcessId, int tag,
313 {
314 return ((vtkMPICommunicator*)this->Communicator)
315 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
316 }
317 int NoBlockReceive(float* data, vtkTypeInt64 length, int remoteProcessId, int tag,
319 {
320 return ((vtkMPICommunicator*)this->Communicator)
321 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
322 }
323 int NoBlockReceive(double* data, vtkTypeInt64 length, int remoteProcessId, int tag,
325 {
326 return ((vtkMPICommunicator*)this->Communicator)
327 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
328 }
329 int NoBlockReceive(vtkTypeInt64* data, vtkTypeInt64 length, int remoteProcessId, int tag,
331 {
332 return ((vtkMPICommunicator*)this->Communicator)
333 ->NoBlockReceive(data, length, remoteProcessId, tag, req);
334 }
335
336
338
348 int Iprobe(int source, int tag, int* flag, int* actualSource)
349 {
350 return ((vtkMPICommunicator*)this->Communicator)->Iprobe(source, tag, flag, actualSource);
351 }
352 int Iprobe(int source, int tag, int* flag, int* actualSource, int* type, int* size)
353 {
354 return ((vtkMPICommunicator*)this->Communicator)
355 ->Iprobe(source, tag, flag, actualSource, type, size);
356 }
357 int Iprobe(int source, int tag, int* flag, int* actualSource, unsigned long* type, int* size)
358 {
359 return ((vtkMPICommunicator*)this->Communicator)
360 ->Iprobe(source, tag, flag, actualSource, type, size);
361 }
362 int Iprobe(int source, int tag, int* flag, int* actualSource, const char* type, int* size)
363 {
364 return ((vtkMPICommunicator*)this->Communicator)
365 ->Iprobe(source, tag, flag, actualSource, type, size);
366 }
367 int Iprobe(int source, int tag, int* flag, int* actualSource, float* type, int* size)
368 {
369 return ((vtkMPICommunicator*)this->Communicator)
370 ->Iprobe(source, tag, flag, actualSource, type, size);
371 }
372 int Iprobe(int source, int tag, int* flag, int* actualSource, double* type, int* size)
373 {
374 return ((vtkMPICommunicator*)this->Communicator)
375 ->Iprobe(source, tag, flag, actualSource, type, size);
376 }
377
378
382 bool CanProbe() override { return ((vtkMPICommunicator*)this->Communicator)->CanProbe(); }
383
385
394 int Probe(int source, int tag, int* actualSource) override
395 {
396 return ((vtkMPICommunicator*)this->Communicator)->Probe(source, tag, actualSource);
397 }
398 int Probe(int source, int tag, int* actualSource, int* type, int* size)
399 {
400 return ((vtkMPICommunicator*)this->Communicator)->Probe(source, tag, actualSource, type, size);
401 }
402 int Probe(int source, int tag, int* actualSource, unsigned long* type, int* size)
403 {
404 return ((vtkMPICommunicator*)this->Communicator)->Probe(source, tag, actualSource, type, size);
405 }
406 int Probe(int source, int tag, int* actualSource, const char* type, int* size)
407 {
408 return ((vtkMPICommunicator*)this->Communicator)->Probe(source, tag, actualSource, type, size);
409 }
410 int Probe(int source, int tag, int* actualSource, float* type, int* size)
411 {
412 return ((vtkMPICommunicator*)this->Communicator)->Probe(source, tag, actualSource, type, size);
413 }
414 int Probe(int source, int tag, int* actualSource, double* type, int* size)
415 {
416 return ((vtkMPICommunicator*)this->Communicator)->Probe(source, tag, actualSource, type, size);
417 }
418
419
425 int WaitAll(int count, vtkMPICommunicator::Request requests[])
426 {
427 return ((vtkMPICommunicator*)this->Communicator)->WaitAll(count, requests);
428 }
429
436 int WaitAny(int count, vtkMPICommunicator::Request requests[], int& idx)
437 VTK_SIZEHINT(requests, count)
438 {
439 return ((vtkMPICommunicator*)this->Communicator)->WaitAny(count, requests, idx);
440 }
441
447 int WaitSome(int count, vtkMPICommunicator::Request requests[], vtkIntArray* completed)
448 VTK_SIZEHINT(requests, count);
449
453 bool TestAll(int count, vtkMPICommunicator::Request requests[]);
454
461 bool TestAny(int count, vtkMPICommunicator::Request requests[], int& idx)
462 VTK_SIZEHINT(requests, count);
463
469 bool TestSome(int count, vtkMPICommunicator::Request requests[], vtkIntArray* completed)
470 VTK_SIZEHINT(requests, count);
471
472 static const char* GetProcessorName();
473
478 static void SetUseSsendForRMI(int use_send)
479 {
480 vtkMPIController::UseSsendForRMI = (use_send != 0) ? 1 : 0;
481 }
483
484protected:
487
488 // Set the communicator to comm and call InitializeNumberOfProcesses()
490
491 // Duplicate the current communicator, creating RMICommunicator
493
500 int remoteProcessId, void* arg, int argLength, int rmiTag, bool propagate) override;
501
502 // MPI communicator created when Initialize() called.
503 // This is a copy of MPI_COMM_WORLD but uses a new
504 // context, i.e. even if the tags are the same, the
505 // RMI messages will not interfere with user level
506 // messages.
508
509 friend class vtkMPIOutputWindow;
510
511 // Initialize only once.
512 static int Initialized;
513
514 static char ProcessorName[];
515
519 static int UseSsendForRMI;
520
521private:
522 vtkMPIController(const vtkMPIController&) = delete;
523 void operator=(const vtkMPIController&) = delete;
524};
525
526VTK_ABI_NAMESPACE_END
527#endif
a simple class to control print indentation
Definition vtkIndent.h:108
dynamic, self-adjusting array of int
Class for creating user defined MPI communicators.
int Iprobe(int source, int tag, int *flag, int *actualSource, int *type, int *size)
Nonblocking test for a message.
static char ProcessorName[]
int Probe(int source, int tag, int *actualSource, int *type, int *size)
Blocking test for a message.
int NoBlockReceive(char *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
int NoBlockSend(const double *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
~vtkMPIController() override
bool TestSome(int count, vtkMPICommunicator::Request requests[], vtkIntArray *completed)
Return true iff one or more of the communicator request objects is complete.
int WaitAll(int count, vtkMPICommunicator::Request requests[])
Given the request objects of a set of non-blocking operations (send and/or receive) this method block...
int NoBlockSend(const int *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
int NoBlockSend(const unsigned long *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
int NoBlockReceive(double *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
int Probe(int source, int tag, int *actualSource, float *type, int *size)
Blocking test for a message.
void InitializeCommunicator(vtkMPICommunicator *comm)
friend class vtkMPIOutputWindow
int Probe(int source, int tag, int *actualSource, double *type, int *size)
Blocking test for a message.
int NoBlockSend(const char *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
bool CanProbe() override
This controller does have probing capability.
int Iprobe(int source, int tag, int *flag, int *actualSource, double *type, int *size)
Nonblocking test for a message.
int WaitAny(int count, vtkMPICommunicator::Request requests[], int &idx)
Blocks until one of the specified requests in the given request array completes.
int NoBlockSend(const vtkTypeInt64 *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
int Probe(int source, int tag, int *actualSource, unsigned long *type, int *size)
Blocking test for a message.
bool TestAll(int count, vtkMPICommunicator::Request requests[])
Returns true iff all of the communication request objects are complete.
void Initialize(int *argc, char ***argv, int initializedExternally) override
This method is for setting up the processes.
void Finalize() override
This method is for cleaning up and has to be called before the end of the program if MPI was initiali...
int NoBlockSend(const unsigned char *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
int Probe(int source, int tag, int *actualSource) override
Blocking test for a message.
int NoBlockReceive(char *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::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.
bool TestAny(int count, vtkMPICommunicator::Request requests[], int &idx)
Returns true iff at least one of the communication request objects is complete.
void CreateOutputWindow() override
This method can be used to tell the controller to create a special output window in which all message...
int NoBlockReceive(unsigned long *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
int NoBlockReceive(float *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
int Probe(int source, int tag, int *actualSource, const char *type, int *size)
Blocking test for a message.
int NoBlockSend(const unsigned char *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
static int UseSsendForRMI
When set, TriggerRMI uses Ssend instead of Send.
static vtkMPICommunicator * WorldRMICommunicator
void SetCommunicator(vtkMPICommunicator *comm)
MPIController uses this communicator in all sends and receives.
int NoBlockSend(const float *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
int NoBlockReceive(unsigned char *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
void Initialize(int *argc, char ***argv) override
This method is for setting up the processes.
vtkMPIController * CreateSubController(vtkProcessGroup *group) override
Creates a new controller with the processes specified by the given group.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
int NoBlockSend(const void *data, vtkTypeInt64 length, MPI_Datatype mpiType, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
Variant that permits dynamic type sends, like those create by MPI_Type_create_subarray.
int Iprobe(int source, int tag, int *flag, int *actualSource, float *type, int *size)
Nonblocking test for a message.
vtkMPIController * PartitionController(int localColor, int localKey) override
Partitions this controller based on a coloring.
void Finalize(int finalizedExternally) override
This method is for cleaning up.
int NoBlockReceive(double *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
int NoBlockReceive(int *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
static const char * GetProcessorName()
vtkTypeList::Create< float, double, char, int, vtkTypeInt64, unsigned char, unsigned long > ValueTypes
The list of value types supported by MPIController.
int NoBlockReceive(unsigned long *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
int WaitSome(int count, vtkMPICommunicator::Request requests[], vtkIntArray *completed)
Blocks until one or more of the specified requests in the given request request array completes.
static char * ErrorString(int err)
Given an MPI error code, return a string which contains an error message.
void SingleMethodExecute() override
Execute the SingleMethod (as define by SetSingleMethod) using this->NumberOfProcesses processes.
int NoBlockReceive(vtkTypeInt64 *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
static vtkMPIController * New()
int NoBlockSend(const int *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
static void SetUseSsendForRMI(int use_send)
When set to 1, TriggerRMI uses Ssend() instead of Send() calls.
int NoBlockReceive(int *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
int NoBlockSend(const float *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
int NoBlockReceive(unsigned char *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
int Iprobe(int source, int tag, int *flag, int *actualSource)
Nonblocking test for a message.
void TriggerRMIInternal(int remoteProcessId, void *arg, int argLength, int rmiTag, bool propagate) override
Implementation for TriggerRMI() provides subclasses an opportunity to modify the behaviour eg.
int NoBlockSend(const double *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
int NoBlockSend(const vtkTypeInt64 *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
int NoBlockSend(const char *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
int NoBlockReceive(vtkTypeInt64 *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
virtual void Initialize()
Same as Initialize(0, 0, 1).
static int GetUseSsendForRMI()
int NoBlockSend(const unsigned long *data, int length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method sends data to another process (non-blocking).
void MultipleMethodExecute() override
Execute the MultipleMethods (as define by calling SetMultipleMethod for each of the required this->Nu...
int Iprobe(int source, int tag, int *flag, int *actualSource, unsigned long *type, int *size)
Nonblocking test for a message.
void InitializeRMICommunicator()
int NoBlockReceive(float *data, vtkTypeInt64 length, int remoteProcessId, int tag, vtkMPICommunicator::Request &req)
This method receives data from a corresponding send (non-blocking).
A subgroup of processes from a communicator.
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
#define VTK_SIZEHINT(...)