| version 1.219 | version 1.220 |
|---|
| |
| void send_subset_ungrid(int fromIdx, int toIdx, int specialIdx); | void send_subset_ungrid(int fromIdx, int toIdx, int specialIdx); |
| private: | private: |
| ResizeArray<PmeGridMsg *> grid_msgs; | ResizeArray<PmeGridMsg *> grid_msgs; |
| | ResizeArray<int> work_zlist; |
| #ifdef NAMD_FFTW | #ifdef NAMD_FFTW |
| #ifdef NAMD_FFTW_3 | #ifdef NAMD_FFTW_3 |
| fftwf_plan forward_plan, backward_plan; | fftwf_plan forward_plan, backward_plan; |
| |
| if ( ! msg->hasData ) return; | if ( ! msg->hasData ) return; |
| | |
| int zlistlen = msg->zlistlen; | int zlistlen = msg->zlistlen; |
| int *zlist = msg->zlist; | #ifdef NAMD_KNL |
| char *fmsg = msg->fgrid; | int * __restrict msg_zlist = msg->zlist; |
| float *qmsg = msg->qgrid; | int * __restrict zlist = work_zlist.begin(); |
| float *d = data; | __assume_aligned(zlist,64); |
| | for ( int k=0; k<zlistlen; ++k ) { |
| | zlist[k] = msg_zlist[k]; |
| | } |
| | #else |
| | int * __restrict zlist = msg->zlist; |
| | #endif |
| | char * __restrict fmsg = msg->fgrid; |
| | float * __restrict qmsg = msg->qgrid; |
| | float * __restrict d = data; |
| int numGrids = 1; // pencil FFT doesn't support multiple grids | int numGrids = 1; // pencil FFT doesn't support multiple grids |
| for ( int g=0; g<numGrids; ++g ) { | for ( int g=0; g<numGrids; ++g ) { |
| for ( int i=0; i<nx; ++i ) { | for ( int i=0; i<nx; ++i ) { |
| for ( int j=0; j<ny; ++j, d += dim3 ) { | for ( int j=0; j<ny; ++j, d += dim3 ) { |
| if( *(fmsg++) ) { | if( *(fmsg++) ) { |
| | #pragma ivdep |
| for ( int k=0; k<zlistlen; ++k ) { | for ( int k=0; k<zlistlen; ++k ) { |
| d[zlist[k]] += *(qmsg++); | d[zlist[k]] += *(qmsg++); |
| } | } |