00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00038 #ifndef __vtkMPICommunicator_h
00039 #define __vtkMPICommunicator_h
00040
00041 #include "vtkCommunicator.h"
00042
00043 class vtkMPIController;
00044 class vtkMPIGroup;
00045 class vtkProcessGroup;
00046
00047 class vtkMPICommunicatorOpaqueComm;
00048 class vtkMPICommunicatorOpaqueRequest;
00049 class vtkMPICommunicatorReceiveDataInfo;
00050
00051 class VTK_PARALLEL_EXPORT vtkMPICommunicator : public vtkCommunicator
00052 {
00053 public:
00054
00055
00056 class VTK_PARALLEL_EXPORT Request
00057 {
00058 public:
00059 Request();
00060 Request( const Request& );
00061 ~Request();
00062 Request& operator = ( const Request& );
00063 int Test();
00064 void Cancel();
00065 void Wait();
00066 vtkMPICommunicatorOpaqueRequest* Req;
00067 };
00068
00069
00070
00071 vtkTypeRevisionMacro( vtkMPICommunicator,vtkCommunicator);
00072 void PrintSelf(ostream& os, vtkIndent indent);
00073
00075 static vtkMPICommunicator* New();
00076
00079 static vtkMPICommunicator* GetWorldCommunicator();
00080
00081
00085 int Initialize(vtkProcessGroup *group);
00086
00088 VTK_LEGACY(int Initialize(vtkMPICommunicator* mpiComm, vtkMPIGroup* group));
00089
00091
00093 virtual int SendVoidArray(const void *data, vtkIdType length, int type,
00094 int remoteProcessId, int tag);
00095 virtual int ReceiveVoidArray(void *data, vtkIdType length, int type,
00096 int remoteProcessId, int tag);
00098
00100
00104 int NoBlockSend(const int* data, int length, int remoteProcessId, int tag,
00105 Request& req);
00106 int NoBlockSend(const unsigned long* data, int length, int remoteProcessId,
00107 int tag, Request& req);
00108 int NoBlockSend(const char* data, int length, int remoteProcessId,
00109 int tag, Request& req);
00110 int NoBlockSend(const float* data, int length, int remoteProcessId,
00111 int tag, Request& req);
00113
00115
00118 int NoBlockReceive(int* data, int length, int remoteProcessId,
00119 int tag, Request& req);
00120 int NoBlockReceive(unsigned long* data, int length,
00121 int remoteProcessId, int tag, Request& req);
00122 int NoBlockReceive(char* data, int length, int remoteProcessId,
00123 int tag, Request& req);
00124 int NoBlockReceive(float* data, int length, int remoteProcessId,
00125 int tag, Request& req);
00126 #ifdef VTK_USE_64BIT_IDS
00127 int NoBlockReceive(vtkIdType* data, int length, int remoteProcessId,
00128 int tag, Request& req);
00130 #endif
00131
00132
00134
00136 virtual void Barrier();
00137 virtual int BroadcastVoidArray(void *data, vtkIdType length, int type,
00138 int srcProcessId);
00139 virtual int GatherVoidArray(const void *sendBuffer, void *recvBuffer,
00140 vtkIdType length, int type, int destProcessId);
00141 virtual int GatherVVoidArray(const void *sendBuffer, void *recvBuffer,
00142 vtkIdType sendLength, vtkIdType *recvLengths,
00143 vtkIdType *offsets, int type, int destProcessId);
00144 virtual int ScatterVoidArray(const void *sendBuffer, void *recvBuffer,
00145 vtkIdType length, int type, int srcProcessId);
00146 virtual int ScatterVVoidArray(const void *sendBuffer, void *recvBuffer,
00147 vtkIdType *sendLengths, vtkIdType *offsets,
00148 vtkIdType recvLength, int type,
00149 int srcProcessId);
00150 virtual int AllGatherVoidArray(const void *sendBuffer, void *recvBuffer,
00151 vtkIdType length, int type);
00152 virtual int AllGatherVVoidArray(const void *sendBuffer, void *recvBuffer,
00153 vtkIdType sendLength, vtkIdType *recvLengths,
00154 vtkIdType *offsets, int type);
00155 virtual int ReduceVoidArray(const void *sendBuffer, void *recvBuffer,
00156 vtkIdType length, int type,
00157 int operation, int destProcessId);
00158 virtual int ReduceVoidArray(const void *sendBuffer, void *recvBuffer,
00159 vtkIdType length, int type,
00160 Operation *operation, int destProcessId);
00161 virtual int AllReduceVoidArray(const void *sendBuffer, void *recvBuffer,
00162 vtkIdType length, int type,
00163 int operation);
00164 virtual int AllReduceVoidArray(const void *sendBuffer, void *recvBuffer,
00165 vtkIdType length, int type,
00166 Operation *operation);
00168
00170
00171 VTK_LEGACY(int ReduceMax(int* data, int* to, int size, int root));
00172 VTK_LEGACY(int ReduceMax(unsigned long* data, unsigned long* to, int size, int root));
00173 VTK_LEGACY(int ReduceMax(float* data, float* to, int size, int root));
00174 VTK_LEGACY(int ReduceMax(double* data, double* to, int size, int root));
00176
00177 VTK_LEGACY(int ReduceMin(int* data, int* to, int size, int root));
00178 VTK_LEGACY(int ReduceMin(unsigned long* data, unsigned long* to, int size, int root));
00179 VTK_LEGACY(int ReduceMin(float* data, float* to, int size, int root));
00180 VTK_LEGACY(int ReduceMin(double* data, double* to, int size, int root));
00181
00182 VTK_LEGACY(int ReduceSum(int* data, int* to, int size, int root));
00183 VTK_LEGACY(int ReduceSum(unsigned long* data, unsigned long* to, int size, int root));
00184 VTK_LEGACY(int ReduceSum(float* data, float* to, int size, int root));
00185 VTK_LEGACY(int ReduceSum(double* data, double* to, int size, int root));
00186
00187
00188 VTK_LEGACY(int ReduceAnd(bool* data, bool* to, int size, int root));
00189 VTK_LEGACY(int ReduceOr(bool* data, bool* to, int size, int root));
00190
00191
00192
00193
00194 friend class vtkMPIController;
00195
00196 vtkMPICommunicatorOpaqueComm *GetMPIComm()
00197 {
00198 return this->MPIComm;
00199 }
00200
00201
00202 static char* Allocate(size_t size);
00203 static void Free(char* ptr);
00204
00205
00207
00209 vtkSetClampMacro(UseSsend, int, 0, 1);
00210 vtkGetMacro(UseSsend, int);
00211 vtkBooleanMacro(UseSsend, int);
00213
00218 void CopyFrom(vtkMPICommunicator* source);
00219 protected:
00220 vtkMPICommunicator();
00221 ~vtkMPICommunicator();
00222
00223
00224
00225 int InitializeNumberOfProcesses();
00226
00228
00235 vtkSetMacro(KeepHandle, int);
00236 vtkBooleanMacro(KeepHandle, int);
00238
00239
00240 static vtkMPICommunicator* WorldCommunicator;
00241
00242 void InitializeCopy(vtkMPICommunicator* source);
00243
00250 void Duplicate(vtkMPICommunicator* source);
00251
00253
00254 virtual int ReceiveDataInternal(
00255 char* data, int length, int sizeoftype,
00256 int remoteProcessId, int tag,
00257 vtkMPICommunicatorReceiveDataInfo* info,
00258 int useCopy, int& senderId);
00260
00261 vtkMPICommunicatorOpaqueComm* MPIComm;
00262
00263 int Initialized;
00264 int KeepHandle;
00265
00266 int LastSenderId;
00267 int UseSsend;
00268 static int CheckForMPIError(int err);
00269
00270 private:
00271 vtkMPICommunicator(const vtkMPICommunicator&);
00272 void operator=(const vtkMPICommunicator&);
00273 };
00274
00275 #endif