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