mess.cpp

00001 // "mess.cpp"
00002 
00003 // (c) OPAC Team, LIFL, August 2005
00004 
00005 /* 
00006    Contact: paradiseo-help@lists.gforge.inria.fr
00007 */
00008 
00009 #include <mpi.h>
00010 #include <vector>
00011 
00012 #include "mess.h"
00013 #include "../../core/peo_debug.h"
00014 #include "node.h"
00015 
00016 #define MPI_BUF_SIZE 1024*64
00017         
00018 static char mpi_buf [MPI_BUF_SIZE];
00019         
00020 static int pos_buf ;
00021 
00022 static std :: vector <char *> act_buf; /* Active buffers */
00023 
00024 static std :: vector <MPI_Request *> act_req; /* Active requests */
00025 
00026 void cleanBuffers () {
00027 
00028   for (unsigned i = 0; i < act_req.size ();) {
00029        
00030     MPI_Status stat ;
00031     int flag ;
00032     MPI_Test (act_req [i], & flag, & stat) ;
00033     if (flag) {
00034       
00035       delete act_buf [i] ;
00036       delete act_req [i] ;
00037         
00038       act_buf [i] = act_buf.back () ;
00039       act_buf.pop_back () ;
00040       
00041       act_req [i] = act_req.back () ;
00042       act_req.pop_back () ;
00043     }
00044     else
00045       i ++;
00046   } 
00047 }
00048 
00049 void waitBuffers () {
00050 
00051   printDebugMessage ("waiting the termination of the asynchronous operations to complete");
00052 
00053   for (unsigned i = 0; i < act_req.size (); i ++) {
00054        
00055     MPI_Status stat ;
00056 
00057     MPI_Wait (act_req [i], & stat) ;
00058       
00059     delete act_buf [i] ;
00060     delete act_req [i] ;
00061   } 
00062 }
00063 
00064 bool probeMessage (int & __src, int & __tag) {
00065 
00066   int flag;
00067 
00068   MPI_Status stat;
00069 
00070   MPI_Iprobe (MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, & flag, & stat);
00071 
00072   __src = stat.MPI_SOURCE;
00073   __tag = stat.MPI_TAG;
00074 
00075   return flag;
00076 }
00077 
00078 void waitMessage () {
00079 
00080   MPI_Status stat;  
00081 
00082   MPI_Probe (MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, & stat);
00083 }
00084 
00085 void initMessage () {
00086   
00087   pos_buf = 0;
00088 }
00089 
00090 void sendMessage (int __to, int __tag) {
00091 
00092   cleanBuffers ();  
00093   act_buf.push_back (new char [pos_buf]);
00094   act_req.push_back (new MPI_Request);  
00095   memcpy (act_buf.back (), mpi_buf, pos_buf);  
00096   MPI_Isend (act_buf.back (), pos_buf, MPI_PACKED, __to, __tag, MPI_COMM_WORLD, act_req.back ()); 
00097 }
00098 
00099 void sendMessageToAll (int __tag) {
00100 
00101   for (int i = 0; i < getNumberOfNodes (); i ++)
00102     sendMessage (i, __tag);
00103 }
00104 
00105 void receiveMessage (int __from, int __tag) {
00106   
00107   MPI_Status stat;  
00108   MPI_Request req;
00109 
00110   MPI_Irecv (mpi_buf, MPI_BUF_SIZE, MPI_PACKED, __from, __tag, MPI_COMM_WORLD, & req) ;
00111   MPI_Wait (& req, & stat) ;
00112 }
00113 
00114 /* Char */
00115 void pack (const char & __c) {
00116 
00117   MPI_Pack ((void *) & __c, 1, MPI_CHAR, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD);
00118 }
00119 
00120 /* Float */
00121 void pack (const float & __f, int __nitem) {
00122 
00123   MPI_Pack ((void *) & __f, __nitem, MPI_FLOAT, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD);
00124 }
00125 
00126 /* Double */
00127 void pack (const double & __d, int __nitem) {
00128 
00129   MPI_Pack ((void *) & __d, __nitem, MPI_DOUBLE, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD);
00130 }
00131 
00132 /* Integer */
00133 void pack (const int & __i, int __nitem) {
00134 
00135   MPI_Pack ((void *) & __i, __nitem, MPI_INT, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD);
00136 }
00137 
00138 /* Unsigned int. */
00139 void pack (const unsigned int & __ui, int __nitem) {
00140 
00141   MPI_Pack ((void *) & __ui, __nitem, MPI_UNSIGNED, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD);
00142 }
00143 
00144 /* Short int. */
00145 void pack (const short & __sh, int __nitem) {
00146 
00147   MPI_Pack ((void *) & __sh, __nitem, MPI_SHORT, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD);
00148 }
00149 
00150 /* Unsigned short */
00151 void pack (const unsigned short & __ush, int __nitem) {
00152 
00153   MPI_Pack ((void *) & __ush, __nitem, MPI_UNSIGNED_SHORT, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD);
00154 }
00155 
00156 /* Long */
00157 void pack (const long & __l, int __nitem) {
00158 
00159   MPI_Pack ((void *) & __l, __nitem, MPI_LONG, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD);
00160 }
00161 
00162 /* Unsigned long */
00163 void pack (const unsigned long & __ul, int __nitem) {
00164 
00165   MPI_Pack ((void *) & __ul, __nitem, MPI_UNSIGNED_LONG, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD);
00166 }
00167 
00168 /* String */
00169 void pack (const char * __str) {
00170   
00171   int len = strlen (__str) + 1;
00172   MPI_Pack (& len, 1, MPI_INT, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD);
00173   MPI_Pack ((void *) __str, len, MPI_CHAR, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD);
00174 }
00175 
00176 /* Char */
00177 void unpack (char & __c) {
00178 
00179   MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __c, 1, MPI_CHAR, MPI_COMM_WORLD);
00180 }
00181 
00182 /* Float */
00183 void unpack (float & __f, int __nitem) {
00184 
00185   MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __f, __nitem, MPI_FLOAT, MPI_COMM_WORLD);
00186 }
00187 
00188 /* Double */
00189 void unpack (double & __d, int __nitem) {
00190 
00191   MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __d, __nitem, MPI_DOUBLE, MPI_COMM_WORLD);
00192 }
00193 
00194 /* Integer */
00195 void unpack (int & __i, int __nitem) {
00196 
00197   MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __i, __nitem, MPI_INT, MPI_COMM_WORLD);
00198 }
00199 
00200 /* Unsigned int. */
00201 void unpack (unsigned int & __ui, int __nitem) {
00202 
00203   MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __ui, __nitem, MPI_UNSIGNED, MPI_COMM_WORLD);
00204 }
00205 
00206 /* Short int. */
00207 void unpack (short & __sh, int __nitem) {
00208 
00209   MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __sh, __nitem, MPI_SHORT, MPI_COMM_WORLD);
00210 }
00211 
00212 /* Unsigned short */
00213 void unpack (unsigned short & __ush, int __nitem) {
00214 
00215   MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __ush, __nitem, MPI_UNSIGNED_SHORT, MPI_COMM_WORLD);
00216 }
00217 
00218 /* Long */
00219 void unpack (long & __l, int __nitem) {
00220 
00221   MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __l, __nitem, MPI_LONG, MPI_COMM_WORLD);
00222 }
00223 
00224 /* Unsigned long */
00225 void unpack (unsigned long & __ul, int __nitem) {
00226 
00227   MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __ul, __nitem, MPI_UNSIGNED_LONG, MPI_COMM_WORLD);
00228 }
00229 
00230 /* String */
00231 void unpack (char * __str) {
00232 
00233   int len;
00234   MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & len, 1, MPI_INT, MPI_COMM_WORLD);
00235   MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, __str, len, MPI_CHAR, MPI_COMM_WORLD);    
00236 }
00237 

Generated on Thu Jul 5 13:43:30 2007 for ParadisEO-PEO by  doxygen 1.4.7