00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <typeinfo>
00024
00025 #include <mpi.h>
00026
00027 #include "Cluster.hh"
00028
00029
00030 clMPIProc::clMPIProc ()
00031 {
00032 bInitialized = false;
00033 iError = MPI_SUCCESS;
00034 }
00035
00036
00037 clMPIProc::~clMPIProc ()
00038 {
00039 if (bInitialized) Finalize();
00040 }
00041
00042
00043 bool clMPIProc::Initialize (int *ipArgC, char ***cppArgV)
00044 {
00045 if (bInitialized) return false;
00046 iError = MPI_Init(ipArgC, cppArgV);
00047 if (iError != MPI_SUCCESS) return false;
00048 bInitialized = true;
00049 return true;
00050 }
00051
00052
00053 bool clMPIProc::Finalize ()
00054 {
00055 if (!bInitialized) return false;
00056 iError = MPI_Finalize();
00057 if (iError != MPI_SUCCESS) return false;
00058 bInitialized = false;
00059 return true;
00060 }
00061
00062
00063 bool clMPIProc::GetRank (int *ipRank)
00064 {
00065 if (!bInitialized) return false;
00066 iError = MPI_Comm_rank(MPI_COMM_WORLD, ipRank);
00067 if (iError != MPI_SUCCESS) return false;
00068 return true;
00069 }
00070
00071
00072 bool clMPIProc::GetNodeCount (int *ipNodeCount)
00073 {
00074 if (!bInitialized) return false;
00075 iError = MPI_Comm_size(MPI_COMM_WORLD, ipNodeCount);
00076 if (iError != MPI_SUCCESS) return false;
00077 return true;
00078 }
00079
00080
00081 clMPIComm::clMPIComm ()
00082 {
00083 iTag = 0;
00084 iError = MPI_SUCCESS;
00085 }
00086
00087
00088 clMPIComm::clMPIComm (int iCommTag)
00089 {
00090 iTag = iCommTag;
00091 iError = MPI_SUCCESS;
00092 }
00093
00094
00095 clMPIComm::~clMPIComm ()
00096 {
00097 }
00098
00099
00100 void clMPIComm::SetTag (int iCommTag)
00101 {
00102 iTag = iCommTag;
00103 }
00104
00105
00106 bool clMPIComm::Send (int iDest, char *cpData, int iCount)
00107 {
00108 iError = MPI_Send(cpData, iCount, MPI_CHAR, iDest, iTag,
00109 MPI_COMM_WORLD);
00110 if (iError != MPI_SUCCESS) return false;
00111 return true;
00112 }
00113
00114
00115 bool clMPIComm::Send (int iDest, unsigned char *cpData, int iCount)
00116 {
00117 iError = MPI_Send(cpData, iCount, MPI_UNSIGNED_CHAR, iDest, iTag,
00118 MPI_COMM_WORLD);
00119 if (iError != MPI_SUCCESS) return false;
00120 return true;
00121 }
00122
00123
00124 bool clMPIComm::Send (int iDest, short *ipData, int iCount)
00125 {
00126 iError = MPI_Send(ipData, iCount, MPI_SHORT, iDest, iTag,
00127 MPI_COMM_WORLD);
00128 if (iError != MPI_SUCCESS) return false;
00129 return true;
00130 }
00131
00132
00133 bool clMPIComm::Send (int iDest, unsigned short *ipData, int iCount)
00134 {
00135 iError = MPI_Send(ipData, iCount, MPI_UNSIGNED_SHORT, iDest, iTag,
00136 MPI_COMM_WORLD);
00137 if (iError != MPI_SUCCESS) return false;
00138 return true;
00139 }
00140
00141
00142 bool clMPIComm::Send (int iDest, int *ipData, int iCount)
00143 {
00144 iError = MPI_Send(ipData, iCount, MPI_INT, iDest, iTag,
00145 MPI_COMM_WORLD);
00146 if (iError != MPI_SUCCESS) return false;
00147 return true;
00148 }
00149
00150
00151 bool clMPIComm::Send (int iDest, unsigned int *ipData, int iCount)
00152 {
00153 iError = MPI_Send(ipData, iCount, MPI_UNSIGNED, iDest, iTag,
00154 MPI_COMM_WORLD);
00155 if (iError != MPI_SUCCESS) return false;
00156 return true;
00157 }
00158
00159
00160 bool clMPIComm::Send (int iDest, long *lpData, int iCount)
00161 {
00162 iError = MPI_Send(lpData, iCount, MPI_LONG, iDest, iTag,
00163 MPI_COMM_WORLD);
00164 if (iError != MPI_SUCCESS) return false;
00165 return true;
00166 }
00167
00168
00169 bool clMPIComm::Send (int iDest, unsigned long *lpData, int iCount)
00170 {
00171 iError = MPI_Send(lpData, iCount, MPI_UNSIGNED_LONG, iDest, iTag,
00172 MPI_COMM_WORLD);
00173 if (iError != MPI_SUCCESS) return false;
00174 return true;
00175 }
00176
00177
00178 bool clMPIComm::Send (int iDest, float *fpData, int iCount)
00179 {
00180 iError = MPI_Send(fpData, iCount, MPI_FLOAT, iDest, iTag,
00181 MPI_COMM_WORLD);
00182 if (iError != MPI_SUCCESS) return false;
00183 return true;
00184 }
00185
00186
00187 bool clMPIComm::Send (int iDest, double *dpData, int iCount)
00188 {
00189 iError = MPI_Send(dpData, iCount, MPI_DOUBLE, iDest, iTag,
00190 MPI_COMM_WORLD);
00191 if (iError != MPI_SUCCESS) return false;
00192 return true;
00193 }
00194
00195
00196 bool clMPIComm::Send (int iDest, long double *ldpData, int iCount)
00197 {
00198 iError = MPI_Send(ldpData, iCount, MPI_LONG_DOUBLE, iDest, iTag,
00199 MPI_COMM_WORLD);
00200 if (iError != MPI_SUCCESS) return false;
00201 return true;
00202 }
00203
00204
00205 bool clMPIComm::Send (int iDest, void *vpData, int iCount)
00206 {
00207 iError = MPI_Send(vpData, iCount, MPI_BYTE, iDest, iTag,
00208 MPI_COMM_WORLD);
00209 if (iError != MPI_SUCCESS) return false;
00210 return true;
00211 }
00212
00213
00214 bool clMPIComm::Probe (int iSrc)
00215 {
00216 iError = MPI_Probe(iSrc, iTag, MPI_COMM_WORLD, &sStatus);
00217 if (iError != MPI_SUCCESS) return false;
00218 return true;
00219 }
00220
00221
00222 bool clMPIComm::ProbeAny (int iSrc)
00223 {
00224 iError = MPI_Probe(iSrc, MPI_ANY_TAG, MPI_COMM_WORLD, &sStatus);
00225 if (iError != MPI_SUCCESS) return false;
00226 return true;
00227 }
00228
00229
00230 bool clMPIComm::ProbeNB (int iSrc)
00231 {
00232 int iFlag;
00233
00234 iError = MPI_Iprobe(iSrc, iTag, MPI_COMM_WORLD, &iFlag, &sStatus);
00235 if (iError != MPI_SUCCESS) return false;
00236 if (iFlag) return true;
00237 else return false;
00238 }
00239
00240
00241 bool clMPIComm::ProbeAnyNB (int iSrc)
00242 {
00243 int iFlag;
00244
00245 iError = MPI_Iprobe(iSrc, MPI_ANY_TAG, MPI_COMM_WORLD, &iFlag, &sStatus);
00246 if (iError != MPI_SUCCESS) return false;
00247 if (iFlag) return true;
00248 else return false;
00249 }
00250
00251
00252 bool clMPIComm::Recv (int iSrc, char *cpData, int iCount)
00253 {
00254 iError = MPI_Recv(cpData, iCount, MPI_CHAR, iSrc, iTag,
00255 MPI_COMM_WORLD, &sStatus);
00256 if (iError != MPI_SUCCESS) return false;
00257 return true;
00258 }
00259
00260
00261 bool clMPIComm::Recv (int iSrc, unsigned char *cpData, int iCount)
00262 {
00263 iError = MPI_Recv(cpData, iCount, MPI_UNSIGNED_CHAR, iSrc, iTag,
00264 MPI_COMM_WORLD, &sStatus);
00265 if (iError != MPI_SUCCESS) return false;
00266 return true;
00267 }
00268
00269
00270 bool clMPIComm::Recv (int iSrc, short *ipData, int iCount)
00271 {
00272 iError = MPI_Recv(ipData, iCount, MPI_SHORT, iSrc, iTag,
00273 MPI_COMM_WORLD, &sStatus);
00274 if (iError != MPI_SUCCESS) return false;
00275 return true;
00276 }
00277
00278
00279 bool clMPIComm::Recv (int iSrc, unsigned short *ipData, int iCount)
00280 {
00281 iError = MPI_Recv(ipData, iCount, MPI_UNSIGNED_SHORT, iSrc, iTag,
00282 MPI_COMM_WORLD, &sStatus);
00283 if (iError != MPI_SUCCESS) return false;
00284 return true;
00285 }
00286
00287
00288 bool clMPIComm::Recv (int iSrc, int *ipData, int iCount)
00289 {
00290 iError = MPI_Recv(ipData, iCount, MPI_INT, iSrc, iTag,
00291 MPI_COMM_WORLD, &sStatus);
00292 if (iError != MPI_SUCCESS) return false;
00293 return true;
00294 }
00295
00296
00297 bool clMPIComm::Recv (int iSrc, unsigned int *ipData, int iCount)
00298 {
00299 iError = MPI_Recv(ipData, iCount, MPI_UNSIGNED, iSrc, iTag,
00300 MPI_COMM_WORLD, &sStatus);
00301 if (iError != MPI_SUCCESS) return false;
00302 return true;
00303 }
00304
00305
00306 bool clMPIComm::Recv (int iSrc, long *lpData, int iCount)
00307 {
00308 iError = MPI_Recv(lpData, iCount, MPI_LONG, iSrc, iTag,
00309 MPI_COMM_WORLD, &sStatus);
00310 if (iError != MPI_SUCCESS) return false;
00311 return true;
00312 }
00313
00314
00315 bool clMPIComm::Recv (int iSrc, unsigned long *lpData, int iCount)
00316 {
00317 iError = MPI_Recv(lpData, iCount, MPI_UNSIGNED_LONG, iSrc, iTag,
00318 MPI_COMM_WORLD, &sStatus);
00319 if (iError != MPI_SUCCESS) return false;
00320 return true;
00321 }
00322
00323
00324 bool clMPIComm::Recv (int iSrc, float *fpData, int iCount)
00325 {
00326 iError = MPI_Recv(fpData, iCount, MPI_FLOAT, iSrc, iTag,
00327 MPI_COMM_WORLD, &sStatus);
00328 if (iError != MPI_SUCCESS) return false;
00329 return true;
00330 }
00331
00332
00333 bool clMPIComm::Recv (int iSrc, double *dpData, int iCount)
00334 {
00335 iError = MPI_Recv(dpData, iCount, MPI_DOUBLE, iSrc, iTag,
00336 MPI_COMM_WORLD, &sStatus);
00337 if (iError != MPI_SUCCESS) return false;
00338 return true;
00339 }
00340
00341
00342 bool clMPIComm::Recv (int iSrc, long double *ldpData, int iCount)
00343 {
00344 iError = MPI_Recv(ldpData, iCount, MPI_LONG_DOUBLE, iSrc, iTag,
00345 MPI_COMM_WORLD, &sStatus);
00346 if (iError != MPI_SUCCESS) return false;
00347 return true;
00348 }
00349
00350
00351 bool clMPIComm::Recv (int iSrc, void *vpData, int iCount)
00352 {
00353 iError = MPI_Recv(vpData, iCount, MPI_BYTE, iSrc, iTag,
00354 MPI_COMM_WORLD, &sStatus);
00355 if (iError != MPI_SUCCESS) return false;
00356 return true;
00357 }
00358
00359
00360 bool clMPIComm::RecvAny (int iSrc, char *cpData, int iCount)
00361 {
00362 iError = MPI_Recv(cpData, iCount, MPI_CHAR, iSrc, MPI_ANY_TAG,
00363 MPI_COMM_WORLD, &sStatus);
00364 if (iError != MPI_SUCCESS) return false;
00365 return true;
00366 }
00367
00368
00369 bool clMPIComm::RecvAny (int iSrc, unsigned char *cpData, int iCount)
00370 {
00371 iError = MPI_Recv(cpData, iCount, MPI_UNSIGNED_CHAR, iSrc, MPI_ANY_TAG,
00372 MPI_COMM_WORLD, &sStatus);
00373 if (iError != MPI_SUCCESS) return false;
00374 return true;
00375 }
00376
00377
00378 bool clMPIComm::RecvAny (int iSrc, short *ipData, int iCount)
00379 {
00380 iError = MPI_Recv(ipData, iCount, MPI_SHORT, iSrc, MPI_ANY_TAG,
00381 MPI_COMM_WORLD, &sStatus);
00382 if (iError != MPI_SUCCESS) return false;
00383 return true;
00384 }
00385
00386
00387 bool clMPIComm::RecvAny (int iSrc, unsigned short *ipData, int iCount)
00388 {
00389 iError = MPI_Recv(ipData, iCount, MPI_UNSIGNED_SHORT, iSrc, MPI_ANY_TAG,
00390 MPI_COMM_WORLD, &sStatus);
00391 if (iError != MPI_SUCCESS) return false;
00392 return true;
00393 }
00394
00395
00396 bool clMPIComm::RecvAny (int iSrc, int *ipData, int iCount)
00397 {
00398 iError = MPI_Recv(ipData, iCount, MPI_INT, iSrc, MPI_ANY_TAG,
00399 MPI_COMM_WORLD, &sStatus);
00400 if (iError != MPI_SUCCESS) return false;
00401 return true;
00402 }
00403
00404
00405 bool clMPIComm::RecvAny (int iSrc, unsigned int *ipData, int iCount)
00406 {
00407 iError = MPI_Recv(ipData, iCount, MPI_UNSIGNED, iSrc, MPI_ANY_TAG,
00408 MPI_COMM_WORLD, &sStatus);
00409 if (iError != MPI_SUCCESS) return false;
00410 return true;
00411 }
00412
00413
00414 bool clMPIComm::RecvAny (int iSrc, long *lpData, int iCount)
00415 {
00416 iError = MPI_Recv(lpData, iCount, MPI_LONG, iSrc, MPI_ANY_TAG,
00417 MPI_COMM_WORLD, &sStatus);
00418 if (iError != MPI_SUCCESS) return false;
00419 return true;
00420 }
00421
00422
00423 bool clMPIComm::RecvAny (int iSrc, unsigned long *lpData, int iCount)
00424 {
00425 iError = MPI_Recv(lpData, iCount, MPI_UNSIGNED_LONG, iSrc, MPI_ANY_TAG,
00426 MPI_COMM_WORLD, &sStatus);
00427 if (iError != MPI_SUCCESS) return false;
00428 return true;
00429 }
00430
00431
00432 bool clMPIComm::RecvAny (int iSrc, float *fpData, int iCount)
00433 {
00434 iError = MPI_Recv(fpData, iCount, MPI_FLOAT, iSrc, MPI_ANY_TAG,
00435 MPI_COMM_WORLD, &sStatus);
00436 if (iError != MPI_SUCCESS) return false;
00437 return true;
00438 }
00439
00440
00441 bool clMPIComm::RecvAny (int iSrc, double *dpData, int iCount)
00442 {
00443 iError = MPI_Recv(dpData, iCount, MPI_DOUBLE, iSrc, MPI_ANY_TAG,
00444 MPI_COMM_WORLD, &sStatus);
00445 if (iError != MPI_SUCCESS) return false;
00446 return true;
00447 }
00448
00449
00450 bool clMPIComm::RecvAny (int iSrc, long double *ldpData, int iCount)
00451 {
00452 iError = MPI_Recv(ldpData, iCount, MPI_LONG_DOUBLE, iSrc, MPI_ANY_TAG,
00453 MPI_COMM_WORLD, &sStatus);
00454 if (iError != MPI_SUCCESS) return false;
00455 return true;
00456 }
00457
00458
00459 bool clMPIComm::RecvAny (int iSrc, void *vpData, int iCount)
00460 {
00461 iError = MPI_Recv(vpData, iCount, MPI_BYTE, iSrc, MPI_ANY_TAG,
00462 MPI_COMM_WORLD, &sStatus);
00463 if (iError != MPI_SUCCESS) return false;
00464 return true;
00465 }
00466
00467
00468 bool clMPIComm::GetCount (const std::type_info &TypeInfo, int *ipCount)
00469 {
00470 if (TypeInfo == typeid(char))
00471 iError = MPI_Get_count(&sStatus, MPI_CHAR, ipCount);
00472 else if (TypeInfo == typeid(unsigned char))
00473 iError = MPI_Get_count(&sStatus, MPI_UNSIGNED_CHAR, ipCount);
00474 else if (TypeInfo == typeid(short))
00475 iError = MPI_Get_count(&sStatus, MPI_SHORT, ipCount);
00476 else if (TypeInfo == typeid(unsigned short))
00477 iError = MPI_Get_count(&sStatus, MPI_UNSIGNED_SHORT, ipCount);
00478 else if (TypeInfo == typeid(int))
00479 iError = MPI_Get_count(&sStatus, MPI_INT, ipCount);
00480 else if (TypeInfo == typeid(unsigned int))
00481 iError = MPI_Get_count(&sStatus, MPI_UNSIGNED, ipCount);
00482 else if (TypeInfo == typeid(long))
00483 iError = MPI_Get_count(&sStatus, MPI_LONG, ipCount);
00484 else if (TypeInfo == typeid(unsigned long))
00485 iError = MPI_Get_count(&sStatus, MPI_UNSIGNED_LONG, ipCount);
00486 else if (TypeInfo == typeid(float))
00487 iError = MPI_Get_count(&sStatus, MPI_FLOAT, ipCount);
00488 else if (TypeInfo == typeid(double))
00489 iError = MPI_Get_count(&sStatus, MPI_DOUBLE, ipCount);
00490 else if (TypeInfo == typeid(long double))
00491 iError = MPI_Get_count(&sStatus, MPI_LONG_DOUBLE, ipCount);
00492 else if (TypeInfo == typeid(void *))
00493 iError = MPI_Get_count(&sStatus, MPI_BYTE, ipCount);
00494 if (iError != MPI_SUCCESS) return false;
00495 return true;
00496 }
00497