00001
00002 #ifndef __PENCIL_FFT_H__
00003 #define __PENCIL_FFT_H__
00004
00005 #include "charm++.h"
00006 #include "ckcomplex.h"
00007
00008 #include "sfftw.h"
00009
00010 #define LineFFTAssert(x) //CkAssert(x)
00011 #define __LINEFFT_DEBUG__ 0
00012
00016 enum LineFFTPhase {
00017 PHASE_X = 0,
00018 PHASE_Y,
00019 PHASE_Z
00020 };
00021
00022
00023 enum LineFFTCompletion {
00024 ARRAY_REDUCTION = 0,
00025 SEND_GRID,
00026 };
00027
00028
00032 struct LineFFTGrid {
00033 short x0;
00034 short xsize;
00035 short y0;
00036 short ysize;
00037 short z0;
00038 short zsize;
00039
00040 short idx_x;
00041 short idx_y;
00042
00043 CkCallback cb_done;
00044
00045 };
00046
00047 PUPbytes (LineFFTGrid)
00048
00049 struct LineFFTInfo;
00050
00051 #include "PencilFFT.decl.h"
00052
00056 struct LineFFTInfo {
00057 int sizeX, sizeY, sizeZ;
00058 int grainX, grainY, grainZ;
00059
00065 CProxy_LineFFTArray xProxy;
00066 CProxy_LineFFTArray yProxy;
00067 CProxy_LineFFTArray zProxy;
00068
00069 CkCallback kSpaceCallback;
00070 LineFFTCompletion completionId;
00071
00072 bool normalize;
00073 };
00074
00075 PUPbytes (LineFFTInfo)
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00089
00090 class LineFFTMsg : public CMessage_LineFFTMsg {
00091 public:
00092 LineFFTPhase phase;
00093 int direction;
00094 int chunk_id;
00095
00099 complex * data;
00100 };
00101
00102 class LineFFTGridMsg : public CMessage_LineFFTGridMsg {
00103 public:
00104 LineFFTGrid grid;
00105 fftw_real * data;
00106 };
00107
00108
00112 class LineFFTArray : public CBase_LineFFTArray {
00117 complex *_line;
00118
00120 fftw_plan _fwdplan, _bwdplan;
00121
00125 LineFFTInfo _info;
00126
00127 LineFFTPhase _phase;
00128
00129
00133 int _curGridMessages;
00134
00138 int _curFFTMessages;
00139
00143 int _nElements;
00144
00148 int _fftSize;
00149
00150 int _nFFTMessages;
00151
00155 int _nGridMessages;
00156
00160 LineFFTGrid * _gridList;
00161
00162 public:
00163
00167
00171 LineFFTArray (CkMigrateMessage *m) {}
00172
00176 LineFFTArray () {
00177 _fwdplan = _bwdplan =NULL;
00178
00179 _line = NULL;
00180 _curFFTMessages = 0;
00181 _curGridMessages = 0;
00182 _nGridMessages = 0;
00183 }
00184
00188 LineFFTArray (LineFFTInfo &info, int phase);
00189
00190 ~LineFFTArray () {
00191 delete [] _line;
00192 }
00193
00198 void receiveGridMessage (LineFFTGridMsg *msg);
00199
00203 void receiveFFTMessage (LineFFTMsg *msg);
00204
00209 void startFFT (int direction = FFTW_FORWARD);
00210
00211
00215 void setNumGridMessages (int n, CkCallback &cb) {
00216 _nGridMessages = n;
00217
00218 #if __LINEFFT_DEBUG__
00219 CkPrintf ("[%d, %d] Received ngridmsgs msg \n", thisIndex.x, thisIndex.y);
00220 #endif
00221 _gridList = new LineFFTGrid [n];
00222
00223 int x =0;
00224 contribute (sizeof (int), &x, CkReduction::sum_int, cb);
00225 }
00226
00230
00231 private:
00232
00236 void sendFFTMessages (int dir);
00237
00241 void sendGridMessages();
00242
00246 void call_donecallback() {
00247 LineFFTAssert (_phase == PHASE_X);
00248
00249 #if __LINEFFT_DEBUG__
00250 CkPrintf ("[%d, %d] In Call Done Callback\n", thisIndex.x, thisIndex.y);
00251 #endif
00252 if (_info.completionId == ARRAY_REDUCTION) {
00253 int x =0;
00254 contribute (sizeof (int), &x, CkReduction::sum_int);
00255 }
00256 else
00257 sendGridMessages ();
00258 }
00259 };
00260
00261 #endif