| version 1.108 | version 1.109 |
|---|
| |
| | |
| int sourceNode; | int sourceNode; |
| int sequence; | int sequence; |
| | int hasData; |
| Lattice lattice; | Lattice lattice; |
| PmeReduction *evir; | PmeReduction *evir; |
| int start; | int start; |
| |
| | |
| int sourceNode; | int sourceNode; |
| int sequence; | int sequence; |
| | int hasData; |
| Lattice lattice; | Lattice lattice; |
| int x_start; | int x_start; |
| int nx; | int nx; |
| |
| public: | public: |
| | |
| int sourceNode; | int sourceNode; |
| | int has_evir; |
| PmeReduction *evir; | PmeReduction *evir; |
| int y_start; | int y_start; |
| int ny; | int ny; |
| |
| myMgr->recipPeDest,myMgr->gridPeMap); | myMgr->recipPeDest,myMgr->gridPeMap); |
| #endif | #endif |
| } | } |
| | |
| | if ( myMgr->ungrid_count == 0 ) { |
| | myMgr->pmeProxyDir[CkMyPe()].ungridCalc(); |
| | } |
| | |
| } | } |
| | |
| | |
| |
| const char *pencilActive = myMgr->pencilActive; | const char *pencilActive = myMgr->pencilActive; |
| | |
| strayChargeErrors = 0; | strayChargeErrors = 0; |
| | // int savedMessages = 0; |
| | |
| for (int ib=0; ib<xBlocks; ++ib) { | for (int ib=0; ib<xBlocks; ++ib) { |
| for (int jb=0; jb<yBlocks; ++jb) { | for (int jb=0; jb<yBlocks; ++jb) { |
| |
| if ( fz_arr[i] ) ++zlistlen; | if ( fz_arr[i] ) ++zlistlen; |
| } | } |
| | |
| PmeGridMsg *msg = new (fcount*zlistlen, zlistlen, flen, | int hd = ( fcount? 1 : 0 ); // has data? |
| numGrids, PRIORITY_SIZE) PmeGridMsg; | // if ( ! hd ) ++savedMessages; |
| | |
| | PmeGridMsg *msg = new (hd*fcount*zlistlen, hd*zlistlen, hd*flen, |
| | hd*numGrids, PRIORITY_SIZE) PmeGridMsg; |
| msg->sourceNode = CkMyPe(); | msg->sourceNode = CkMyPe(); |
| | msg->hasData = hd; |
| msg->lattice = lattice; | msg->lattice = lattice; |
| | if ( hd ) { |
| #if 0 | #if 0 |
| msg->start = fstart; | msg->start = fstart; |
| msg->len = flen; | msg->len = flen; |
| |
| } | } |
| } | } |
| } | } |
| | } else { // no data no reply |
| | myMgr->ungrid_count--; |
| | } |
| | |
| msg->sequence = sequence(); | msg->sequence = sequence(); |
| SET_PRIORITY(msg,sequence(),PME_GRID_PRIORITY) | SET_PRIORITY(msg,sequence(),PME_GRID_PRIORITY) |
| |
| } | } |
| } | } |
| | |
| | // if ( savedMessages ) { |
| | // CkPrintf("Pe %d eliminated %d PME messages\n",CkMyPe(),savedMessages); |
| | // } |
| | |
| for (int i=0; i<fsize; ++i) { | for (int i=0; i<fsize; ++i) { |
| if ( q_arr[i] ) { | if ( q_arr[i] ) { |
| memset( (void*) (q_arr[i]), -1, myGrid.dim3 * sizeof(double) ); | memset( (void*) (q_arr[i]), -1, myGrid.dim3 * sizeof(double) ); |
| |
| data = 0; | data = 0; |
| work = 0; | work = 0; |
| send_order = 0; | send_order = 0; |
| | needs_reply = 0; |
| } | } |
| ~PmePencil() { | ~PmePencil() { |
| delete [] data; | delete [] data; |
| delete [] work; | delete [] work; |
| delete [] send_order; | delete [] send_order; |
| | delete [] needs_reply; |
| } | } |
| void base_init(PmePencilInitMsg *msg) { | void base_init(PmePencilInitMsg *msg) { |
| initdata = msg->data; | initdata = msg->data; |
| |
| for ( int i=0; i<nBlocks; ++i ) send_order[i] = i; | for ( int i=0; i<nBlocks; ++i ) send_order[i] = i; |
| Random rand(CkMyPe()); | Random rand(CkMyPe()); |
| rand.reorder(send_order,nBlocks); | rand.reorder(send_order,nBlocks); |
| | needs_reply = new int[nBlocks]; |
| } | } |
| PmePencilInitMsgData initdata; | PmePencilInitMsgData initdata; |
| Lattice lattice; | Lattice lattice; |
| PmeReduction evir; | PmeReduction evir; |
| int sequence; // used for priorities | int sequence; // used for priorities |
| int imsg; // used in sdag code | int imsg; // used in sdag code |
| | int hasData; // used in message elimination |
| float *data; | float *data; |
| float *work; | float *work; |
| int *send_order; | int *send_order; |
| | int *needs_reply; |
| }; | }; |
| | |
| class PmeZPencil : public PmePencil<CBase_PmeZPencil> { | class PmeZPencil : public PmePencil<CBase_PmeZPencil> { |
| |
| memset(data, 0, sizeof(float) * nx*ny*dim3); | memset(data, 0, sizeof(float) * nx*ny*dim3); |
| } | } |
| | |
| | if ( ! msg->hasData ) return; |
| | |
| int zlistlen = msg->zlistlen; | int zlistlen = msg->zlistlen; |
| int *zlist = msg->zlist; | int *zlist = msg->zlist; |
| char *fmsg = msg->fgrid; | char *fmsg = msg->fgrid; |
| |
| int kb = send_order[isend]; | int kb = send_order[isend]; |
| int nz = block3; | int nz = block3; |
| if ( (kb+1)*block3 > dim3/2 ) nz = dim3/2 - kb*block3; | if ( (kb+1)*block3 > dim3/2 ) nz = dim3/2 - kb*block3; |
| PmeTransMsg *msg = new (nx*ny*nz*2,PRIORITY_SIZE) PmeTransMsg; | int hd = ( hasData ? 1 : 0 ); |
| | PmeTransMsg *msg = new (hd*nx*ny*nz*2,PRIORITY_SIZE) PmeTransMsg; |
| msg->lattice = lattice; | msg->lattice = lattice; |
| msg->sourceNode = thisIndex.y; | msg->sourceNode = thisIndex.y; |
| | msg->hasData = hasData; |
| msg->nx = ny; | msg->nx = ny; |
| | if ( hasData ) { |
| float *md = msg->qgrid; | float *md = msg->qgrid; |
| const float *d = data; | const float *d = data; |
| for ( int i=0; i<nx; ++i ) { | for ( int i=0; i<nx; ++i ) { |
| |
| } | } |
| } | } |
| } | } |
| | } |
| msg->sequence = sequence; | msg->sequence = sequence; |
| SET_PRIORITY(msg,sequence,PME_TRANS_PRIORITY) | SET_PRIORITY(msg,sequence,PME_TRANS_PRIORITY) |
| initdata.yPencil(thisIndex.x,0,kb).recvTrans(msg); | initdata.yPencil(thisIndex.x,0,kb).recvTrans(msg); |
| |
| int K2 = initdata.grid.K2; | int K2 = initdata.grid.K2; |
| int jb = msg->sourceNode; | int jb = msg->sourceNode; |
| int ny = msg->nx; | int ny = msg->nx; |
| | if ( msg->hasData ) { |
| const float *md = msg->qgrid; | const float *md = msg->qgrid; |
| float *d = data; | float *d = data; |
| for ( int i=0; i<nx; ++i, d += K2*nz*2 ) { | for ( int i=0; i<nx; ++i, d += K2*nz*2 ) { |
| |
| } | } |
| } | } |
| } | } |
| | } else { |
| | float *d = data; |
| | for ( int i=0; i<nx; ++i, d += K2*nz*2 ) { |
| | for ( int j=jb*block2; j<(jb*block2+ny); ++j ) { |
| | for ( int k=0; k<nz; ++k ) { |
| | d[2*(j*nz+k)] = 0; |
| | d[2*(j*nz+k)+1] = 0; |
| | } |
| | } |
| | } |
| | } |
| } | } |
| | |
| void PmeYPencil::forward_fft() { | void PmeYPencil::forward_fft() { |
| |
| int jb = send_order[isend]; | int jb = send_order[isend]; |
| int ny = block2; | int ny = block2; |
| if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2; | if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2; |
| PmeTransMsg *msg = new (nx*ny*nz*2,PRIORITY_SIZE) PmeTransMsg; | int hd = ( hasData ? 1 : 0 ); |
| | PmeTransMsg *msg = new (hd*nx*ny*nz*2,PRIORITY_SIZE) PmeTransMsg; |
| msg->lattice = lattice; | msg->lattice = lattice; |
| msg->sourceNode = thisIndex.x; | msg->sourceNode = thisIndex.x; |
| | msg->hasData = hasData; |
| msg->nx = nx; | msg->nx = nx; |
| | if ( hasData ) { |
| float *md = msg->qgrid; | float *md = msg->qgrid; |
| const float *d = data; | const float *d = data; |
| for ( int i=0; i<nx; ++i, d += K2*nz*2 ) { | for ( int i=0; i<nx; ++i, d += K2*nz*2 ) { |
| |
| } | } |
| if ( md != msg->qgrid + nx*ny*nz*2 ) CkPrintf("error in YX at %d %d %d\n", | if ( md != msg->qgrid + nx*ny*nz*2 ) CkPrintf("error in YX at %d %d %d\n", |
| thisIndex.x, jb, thisIndex.z); | thisIndex.x, jb, thisIndex.z); |
| | } |
| msg->sequence = sequence; | msg->sequence = sequence; |
| SET_PRIORITY(msg,sequence,PME_TRANS2_PRIORITY) | SET_PRIORITY(msg,sequence,PME_TRANS2_PRIORITY) |
| initdata.xPencil(0,jb,thisIndex.z).recvTrans(msg); | initdata.xPencil(0,jb,thisIndex.z).recvTrans(msg); |
| |
| int K1 = initdata.grid.K1; | int K1 = initdata.grid.K1; |
| int ib = msg->sourceNode; | int ib = msg->sourceNode; |
| int nx = msg->nx; | int nx = msg->nx; |
| | if ( msg->hasData ) { |
| const float *md = msg->qgrid; | const float *md = msg->qgrid; |
| for ( int i=ib*block1; i<(ib*block1+nx); ++i ) { | for ( int i=ib*block1; i<(ib*block1+nx); ++i ) { |
| float *d = data + i*ny*nz*2; | float *d = data + i*ny*nz*2; |
| |
| } | } |
| } | } |
| } | } |
| | } else { |
| | for ( int i=ib*block1; i<(ib*block1+nx); ++i ) { |
| | float *d = data + i*ny*nz*2; |
| | for ( int j=0; j<ny; ++j, d += nz*2 ) { |
| | for ( int k=0; k<nz; ++k ) { |
| | d[2*k] = 0; |
| | d[2*k+1] = 0; |
| | } |
| | } |
| | } |
| | } |
| } | } |
| | |
| void PmeXPencil::forward_fft() { | void PmeXPencil::forward_fft() { |
| |
| int xBlocks = initdata.xBlocks; | int xBlocks = initdata.xBlocks; |
| int block1 = initdata.grid.block1; | int block1 = initdata.grid.block1; |
| int K1 = initdata.grid.K1; | int K1 = initdata.grid.K1; |
| | int send_evir = 1; |
| for ( int isend=0; isend<xBlocks; ++isend ) { | for ( int isend=0; isend<xBlocks; ++isend ) { |
| int ib = send_order[isend]; | int ib = send_order[isend]; |
| | if ( ! needs_reply[ib] ) continue; |
| int nx = block1; | int nx = block1; |
| if ( (ib+1)*block1 > K1 ) nx = K1 - ib*block1; | if ( (ib+1)*block1 > K1 ) nx = K1 - ib*block1; |
| PmeUntransMsg *msg = new (nx*ny*nz*2,(ib==0?1:0),PRIORITY_SIZE) PmeUntransMsg; | PmeUntransMsg *msg = new (nx*ny*nz*2,send_evir,PRIORITY_SIZE) PmeUntransMsg; |
| if ( ib == 0 ) msg->evir[0] = evir; | if ( send_evir ) { |
| | msg->evir[0] = evir; |
| | msg->has_evir = 1; |
| | send_evir = 0; |
| | } else { |
| | msg->has_evir = 0; |
| | } |
| msg->sourceNode = thisIndex.y; | msg->sourceNode = thisIndex.y; |
| msg->ny = ny; | msg->ny = ny; |
| float *md = msg->qgrid; | float *md = msg->qgrid; |
| |
| | |
| void PmeYPencil::recv_untrans(const PmeUntransMsg *msg) { | void PmeYPencil::recv_untrans(const PmeUntransMsg *msg) { |
| if ( imsg == 0 ) evir = 0.; | if ( imsg == 0 ) evir = 0.; |
| if ( thisIndex.x == 0 ) evir += msg->evir[0]; | if ( msg->has_evir ) evir += msg->evir[0]; |
| int block2 = initdata.grid.block2; | int block2 = initdata.grid.block2; |
| int K2 = initdata.grid.K2; | int K2 = initdata.grid.K2; |
| int jb = msg->sourceNode; | int jb = msg->sourceNode; |
| |
| int yBlocks = initdata.yBlocks; | int yBlocks = initdata.yBlocks; |
| int block2 = initdata.grid.block2; | int block2 = initdata.grid.block2; |
| int K2 = initdata.grid.K2; | int K2 = initdata.grid.K2; |
| | int send_evir = 1; |
| for ( int isend=0; isend<yBlocks; ++isend ) { | for ( int isend=0; isend<yBlocks; ++isend ) { |
| int jb = send_order[isend]; | int jb = send_order[isend]; |
| | if ( ! needs_reply[jb] ) continue; |
| int ny = block2; | int ny = block2; |
| if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2; | if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2; |
| PmeUntransMsg *msg = new (nx*ny*nz*2,(jb==0?1:0),PRIORITY_SIZE) PmeUntransMsg; | PmeUntransMsg *msg = new (nx*ny*nz*2,send_evir,PRIORITY_SIZE) PmeUntransMsg; |
| if ( jb == 0 ) msg->evir[0] = evir; | if ( send_evir ) { |
| | msg->evir[0] = evir; |
| | msg->has_evir = 1; |
| | send_evir = 0; |
| | } else { |
| | msg->has_evir = 0; |
| | } |
| msg->sourceNode = thisIndex.z; | msg->sourceNode = thisIndex.z; |
| msg->ny = nz; | msg->ny = nz; |
| float *md = msg->qgrid; | float *md = msg->qgrid; |
| |
| | |
| void PmeZPencil::recv_untrans(const PmeUntransMsg *msg) { | void PmeZPencil::recv_untrans(const PmeUntransMsg *msg) { |
| if ( imsg == 0 ) evir = 0.; | if ( imsg == 0 ) evir = 0.; |
| if ( thisIndex.y == 0 ) evir += msg->evir[0]; | if ( msg->has_evir ) evir += msg->evir[0]; |
| int block3 = initdata.grid.block3; | int block3 = initdata.grid.block3; |
| int dim3 = initdata.grid.dim3; | int dim3 = initdata.grid.dim3; |
| int kb = msg->sourceNode; | int kb = msg->sourceNode; |
| |
| } | } |
| | |
| void PmeZPencil::send_ungrid(PmeGridMsg *msg) { | void PmeZPencil::send_ungrid(PmeGridMsg *msg) { |
| if ( imsg == 0 ) msg->evir[0] = evir; else msg->evir[0] = 0.; | |
| | |
| int pe = msg->sourceNode; | int pe = msg->sourceNode; |
| msg->sourceNode = thisIndex.x * initdata.yBlocks + thisIndex.y; | msg->sourceNode = thisIndex.x * initdata.yBlocks + thisIndex.y; |
| int dim3 = initdata.grid.dim3; | int dim3 = initdata.grid.dim3; |