PTransport.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef SYNTHESIS_PTRANSPORT_H
00030 #define SYNTHESIS_PTRANSPORT_H
00031
00032
00033 #include <casa/aips.h>
00034 #include <casa/Arrays/Array.h>
00035
00036 namespace casa {
00037
00038
00039 class Algorithm;
00040 class Record;
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 class PTransport {
00078 public:
00079
00080 PTransport() : numprocs(0), myCpu(0), aWorker(0), aTag(0) {};
00081 virtual ~PTransport() {}
00082
00083
00084 Int numThreads() {return numprocs;};
00085
00086
00087 Int cpu() {return myCpu;}
00088
00089
00090
00091 Int connect(Int i) {aWorker=i; return i;}
00092 void connectAnySource() {aWorker=anySource(); return;};
00093 void connectToController() {aWorker=controllerRank(); return;};
00094 void setTag(Int tag) {aTag=tag; return;};
00095 void setAnyTag() {aTag=anyTag(); return;};
00096
00097
00098 Bool isController() {return (cpu()==controllerRank());};
00099 Bool isWorker() {return (cpu()!=controllerRank());};
00100
00101
00102 virtual Int anyTag() = 0;
00103 virtual Int anySource() = 0;
00104
00105
00106 virtual Int controllerRank() = 0;
00107
00108
00109 virtual Int put(const Array<Float> &) = 0;
00110 virtual Int put(const Array<Double> &) = 0;
00111 virtual Int put(const Array<Complex> &) = 0;
00112 virtual Int put(const Array<DComplex> &) = 0;
00113 virtual Int put(const Array<Int> &) = 0;
00114 virtual Int put(const Float &) = 0;
00115 virtual Int put(const Double &) = 0;
00116 virtual Int put(const Complex &) = 0;
00117 virtual Int put(const DComplex &) = 0;
00118 virtual Int put(const Int &) = 0;
00119 virtual Int put(const String &) = 0;
00120 virtual Int put(const Bool &) = 0;
00121 virtual Int put(const Record &) = 0;
00122
00123 virtual Int get(Array<Float> &) = 0;
00124 virtual Int get(Array<Double> &) = 0;
00125 virtual Int get(Array<Complex> &) = 0;
00126 virtual Int get(Array<DComplex> &) = 0;
00127 virtual Int get(Array<Int> &) = 0;
00128 virtual Int get(Float &) = 0;
00129 virtual Int get(Double &) = 0;
00130 virtual Int get(Complex &) = 0;
00131 virtual Int get(DComplex &) = 0;
00132 virtual Int get(Int &) = 0;
00133 virtual Int get(String &) = 0;
00134 virtual Int get(Bool &) = 0;
00135 virtual Int get(Record &) = 0;
00136
00137 protected:
00138
00139 Int numprocs;
00140
00141
00142 Int myCpu;
00143
00144
00145 Int aWorker;
00146
00147
00148 Int aTag;
00149 };
00150
00151
00152
00153 #ifdef HasMPI
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 class MPITransport : public PTransport {
00189 public:
00190
00191 MPITransport();
00192 virtual ~MPITransport();
00193
00194
00195 MPITransport(Int, Char *argv[]);
00196
00197
00198 virtual Int anyTag();
00199 virtual Int anySource();
00200
00201
00202 virtual Int controllerRank() {return 0;};
00203
00204
00205 virtual Int put(const Array<Float> &);
00206 virtual Int put(const Array<Double> &);
00207 virtual Int put(const Array<Complex> &);
00208 virtual Int put(const Array<DComplex> &);
00209 virtual Int put(const Array<Int> &);
00210 virtual Int put(const Float &);
00211 virtual Int put(const Double &);
00212 virtual Int put(const Complex &);
00213 virtual Int put(const DComplex &);
00214 virtual Int put(const Int &);
00215 virtual Int put(const String &);
00216 virtual Int put(const Bool &);
00217 virtual Int put(const Record &);
00218
00219 virtual Int get(Array<Float> &);
00220 virtual Int get(Array<Double> &);
00221 virtual Int get(Array<Complex> &);
00222 virtual Int get(Array<DComplex> &);
00223 virtual Int get(Array<Int> &);
00224 virtual Int get(Float &);
00225 virtual Int get(Double &);
00226 virtual Int get(Complex &);
00227 virtual Int get(DComplex &);
00228 virtual Int get(Int &);
00229 virtual Int get(String &);
00230 virtual Int get(Bool &);
00231 virtual Int get(Record &);
00232
00233 private:
00234
00235 Int sendTo, myOp, getFrom;
00236
00237
00238 void setSourceAndTag (Int &source, Int &tag);
00239 void setDestAndTag (Int &dest, Int &tag);
00240 };
00241 #endif
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280 class SerialTransport : public PTransport {
00281 public:
00282
00283 SerialTransport() : PTransport(), inQue(0), outQue(0), lastInQue(0)
00284 {_data.resize(20);}
00285 virtual ~SerialTransport(){}
00286
00287
00288 virtual Int anyTag() {return -1;};
00289 virtual Int anySource() {return -1;};
00290
00291
00292 virtual Int controllerRank() {return 0;};
00293
00294
00295 virtual Int put(const Array<Float> &);
00296 virtual Int put(const Array<Double> &);
00297 virtual Int put(const Array<Complex> &);
00298 virtual Int put(const Array<DComplex> &);
00299 virtual Int put(const Array<Int> &);
00300 virtual Int put(const Float &);
00301 virtual Int put(const Double &);
00302 virtual Int put(const Complex &);
00303 virtual Int put(const DComplex &);
00304 virtual Int put(const Int &);
00305 virtual Int put(const String &);
00306 virtual Int put(const Bool &);
00307 virtual Int put(const Record &);
00308
00309 virtual Int get(Array<Float> &);
00310 virtual Int get(Array<Double> &);
00311 virtual Int get(Array<Complex> &);
00312 virtual Int get(Array<DComplex> &);
00313 virtual Int get(Array<Int> &);
00314 virtual Int get(Float &);
00315 virtual Int get(Double &);
00316 virtual Int get(Complex &);
00317 virtual Int get(DComplex &);
00318 virtual Int get(Int &);
00319 virtual Int get(String &);
00320 virtual Int get(Bool &);
00321 virtual Int get(Record &);
00322
00323 private:
00324 uInt inQue;
00325 uInt outQue;
00326 uInt lastInQue;
00327 PtrBlock<void *> _data;
00328
00329 Int add2Queue(void *);
00330 void *getFromQueue();
00331 };
00332
00333
00334 }
00335
00336 #endif
00337
00338