Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members

Cluster.cc

Go to the documentation of this file.
00001 /*
00002 
00003     MPI class implementation for clustering
00004     Copyright (C) 2000-2001 Jussi Laako
00005 
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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 

Generated on Sun Oct 26 19:11:19 2003 for HASAS by doxygen 1.3.3