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++); |
} | } |