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 }; //32 byte header on 32 bit architectures 00033 00034 00035 class OptPmeFFTMsg : public CMessage_OptPmeFFTMsg { 00036 public: 00037 int sourceNode; 00038 int nx; 00039 float *qgrid; 00040 }; //12 byte header on 32 bit architectures 00041 00042 00043 class OptPmeDummyMsg : public CMessage_OptPmeDummyMsg { 00044 }; 00045 00046 // use this idiom since messages don't have copy constructors 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; // used in sdag code 00096 int _iter; // used in sdag code 00097 float *data; 00098 float *many_to_many_data; //data in a differnt format 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 rfftwnd_plan forward_plan, backward_plan; 00126 #endif 00127 int nx, ny; 00128 PatchGridElem * m2m_recv_grid; 00129 float * many_to_many_gr_data; 00130 CkCallbackWrapper cbw_recvgrid; 00131 CkCallbackWrapper cbw_recvuntrans; 00132 00133 void initialize_manytomany (); 00134 }; 00135 00136 class OptPmeYPencil : public OptPmePencil<CBase_OptPmeYPencil> { 00137 public: 00138 OptPmeYPencil_SDAG_CODE 00139 OptPmeYPencil() { __sdag_init(); setMigratable(false); } 00140 OptPmeYPencil(CkMigrateMessage *) { __sdag_init(); } 00141 void fft_init(); 00142 void recv_trans(const OptPmeFFTMsg *); 00143 void forward_fft(); 00144 void send_trans(); 00145 void many_to_many_send(int phase); 00146 void recv_untrans(const OptPmeFFTMsg *); 00147 void many_to_many_recv_trans(); 00148 void backward_fft(); 00149 void send_untrans(); 00150 void many_to_many_recv_untrans(); 00151 private: 00152 #ifdef NAMD_FFTW 00153 fftw_plan forward_plan, backward_plan; 00154 #endif 00155 int nx, nz; 00156 CkCallbackWrapper cbw_recvtrans; 00157 CkCallbackWrapper cbw_recvuntrans; 00158 00159 void initialize_manytomany (); 00160 }; 00161 00162 class OptPmeXPencil : public OptPmePencil<CBase_OptPmeXPencil> { 00163 public: 00164 OptPmeXPencil_SDAG_CODE 00165 OptPmeXPencil() { __sdag_init(); myKSpace = 0; setMigratable(false); } 00166 OptPmeXPencil(CkMigrateMessage *) { __sdag_init(); } 00167 void fft_init(); 00168 void recv_trans(const OptPmeFFTMsg *); 00169 void many_to_many_recv_trans(); 00170 void forward_fft(); 00171 void pme_kspace(); 00172 void backward_fft(); 00173 void send_untrans(); 00174 void many_to_many_send_untrans(); 00175 #ifdef NAMD_FFTW 00176 fftw_plan forward_plan, backward_plan; 00177 #endif 00178 int ny, nz; 00179 PmeKSpace *myKSpace; 00180 CkCallbackWrapper cbw_recvtrans; 00181 bool constant_pressure; 00182 00183 void initialize_manytomany (); 00184 }; 00185 00186 #endif
1.3.9.1