00001
00002 #ifndef __FFT_LIB_H__
00003 #define __FFT_LIB_H__
00004
00005 #if CHARM_VERSION > 60000
00006 #include <cmidirectmanytomany.h>
00007 #endif
00008
00009 #define MANY_TO_MANY_START 10
00010 #define MANY_TO_MANY_SETUP 2
00011
00012 #define PHASE_YF 0 // Recv Y-Forward
00013 #define PHASE_XF 1 // Recv X-Forward
00014 #define PHASE_YB 2 // Recv Y-Backward
00015 #define PHASE_ZB 3 // Recv Z-Backward
00016 #define PHASE_GR 4 // Send Grid
00017 #define PHASE_UG 5 // Recv Ungrid
00018
00019 extern int many_to_many_start;
00020
00021 class OptPmeGridMsg : public CMessage_OptPmeGridMsg {
00022 public:
00023 int sourceNode;
00024 int xstart;
00025 int xlen;
00026 int ystart;
00027 int ylen;
00028 int zstart;
00029 int zlen;
00030 int patchID;
00031 float *qgrid;
00032 };
00033
00034
00035 class OptPmeFFTMsg : public CMessage_OptPmeFFTMsg {
00036 public:
00037 int sourceNode;
00038 int nx;
00039 float *qgrid;
00040 };
00041
00042
00043 class OptPmeDummyMsg : public CMessage_OptPmeDummyMsg {
00044 };
00045
00046
00047 struct OptPmePencilInitMsgData {
00048 PmeGrid grid;
00049 int xBlocks, yBlocks, zBlocks;
00050 CProxy_OptPmeXPencil xPencil;
00051 CProxy_OptPmeYPencil yPencil;
00052 CProxy_OptPmeZPencil zPencil;
00053 CProxy_OptPmeMgr pmeProxy;
00054 CkCallback cb_energy;
00055 bool constant_pressure;
00056 };
00057
00058
00059 class OptPmePencilInitMsg : public CMessage_OptPmePencilInitMsg {
00060 public:
00061 OptPmePencilInitMsg(OptPmePencilInitMsgData &d) { data = d; }
00062 OptPmePencilInitMsgData data;
00063 };
00064
00065 struct CkCallbackWrapper {
00066 CkCallback cb;
00067 void * msg;
00068 };
00069
00070
00071 template <class T> class OptPmePencil : public T {
00072 public:
00073 OptPmePencil() {
00074 data = 0;
00075 work = 0;
00076 send_order = 0;
00077 }
00078 ~OptPmePencil() {
00079 delete [] data;
00080 delete [] work;
00081 delete [] send_order;
00082 }
00083 void base_init(OptPmePencilInitMsg *msg) {
00084 initdata = msg->data;
00085 }
00086 void order_init(int nBlocks) {
00087 send_order = new int[nBlocks];
00088 for ( int i=0; i<nBlocks; ++i ) send_order[i] = i;
00089 Random rand(CkMyPe());
00090 rand.reorder(send_order,nBlocks);
00091 }
00092 OptPmePencilInitMsgData initdata;
00093 Lattice lattice;
00094 PmeReduction evir;
00095 int imsg;
00096 int _iter;
00097 float *data;
00098 float *many_to_many_data;
00099 int *many_to_many_nb;
00100 float *work;
00101 int *send_order;
00102 void *handle;
00103 };
00104
00105
00106 class OptPmeZPencil : public OptPmePencil<CBase_OptPmeZPencil> {
00107 public:
00108 OptPmeZPencil_SDAG_CODE
00109 OptPmeZPencil() { __sdag_init(); setMigratable(false); }
00110 OptPmeZPencil(CkMigrateMessage *) { __sdag_init(); setMigratable (false); }
00111 void fft_init();
00112 void recv_grid(const OptPmeGridMsg *);
00113 void many_to_many_recv_grid();
00114 void forward_fft();
00115 void send_trans();
00116 void many_to_many_send_trans();
00117 void recv_untrans(const OptPmeFFTMsg *);
00118 void many_to_many_recv_untrans();
00119 void backward_fft();
00120 void send_ungrid(OptPmeGridMsg *);
00121 void many_to_many_send_ungrid ();
00122 private:
00123 ResizeArray<OptPmeGridMsg *> grid_msgs;
00124 #ifdef NAMD_FFTW
00125 #ifdef NAMD_FFTW_3
00126 fftwf_plan forward_plan, backward_plan;
00127 #else
00128 rfftwnd_plan forward_plan, backward_plan;
00129 #endif
00130 #endif
00131 int nx, ny;
00132 PatchGridElem * m2m_recv_grid;
00133 float * many_to_many_gr_data;
00134 CkCallbackWrapper cbw_recvgrid;
00135 CkCallbackWrapper cbw_recvuntrans;
00136
00137 void initialize_manytomany ();
00138 };
00139
00140 class OptPmeYPencil : public OptPmePencil<CBase_OptPmeYPencil> {
00141 public:
00142 OptPmeYPencil_SDAG_CODE
00143 OptPmeYPencil() { __sdag_init(); setMigratable(false); }
00144 OptPmeYPencil(CkMigrateMessage *) { __sdag_init(); }
00145 void fft_init();
00146 void recv_trans(const OptPmeFFTMsg *);
00147 void forward_fft();
00148 void send_trans();
00149 void many_to_many_send(int phase);
00150 void recv_untrans(const OptPmeFFTMsg *);
00151 void many_to_many_recv_trans();
00152 void backward_fft();
00153 void send_untrans();
00154 void many_to_many_recv_untrans();
00155 private:
00156 #ifdef NAMD_FFTW
00157 #ifdef NAMD_FFTW_3
00158 fftwf_plan forward_plan, backward_plan;
00159 #else
00160 fftw_plan forward_plan, backward_plan;
00161 #endif
00162 #endif
00163 int nx, nz;
00164 CkCallbackWrapper cbw_recvtrans;
00165 CkCallbackWrapper cbw_recvuntrans;
00166
00167 void initialize_manytomany ();
00168 };
00169
00170 class OptPmeXPencil : public OptPmePencil<CBase_OptPmeXPencil> {
00171 public:
00172 OptPmeXPencil_SDAG_CODE
00173 OptPmeXPencil() { __sdag_init(); myKSpace = 0; setMigratable(false); }
00174 OptPmeXPencil(CkMigrateMessage *) { __sdag_init(); }
00175 void fft_init();
00176 void recv_trans(const OptPmeFFTMsg *);
00177 void many_to_many_recv_trans();
00178 void forward_fft();
00179 void pme_kspace();
00180 void backward_fft();
00181 void send_untrans();
00182 void many_to_many_send_untrans();
00183 #ifdef NAMD_FFTW
00184 #ifdef NAMD_FFTW_3
00185 fftwf_plan forward_plan, backward_plan;
00186 #else
00187 fftw_plan forward_plan, backward_plan;
00188 #endif
00189 #endif
00190 int ny, nz;
00191 PmeKSpace *myKSpace;
00192 CkCallbackWrapper cbw_recvtrans;
00193 bool constant_pressure;
00194
00195 void initialize_manytomany ();
00196 };
00197
00198 #endif