NAMD
Public Member Functions | List of all members
PmeYPencil Class Reference
Inheritance diagram for PmeYPencil:
PmePencil< CBase_PmeYPencil >

Public Member Functions

PmeYPencil_SDAG_CODE PmeYPencil ()
 
 PmeYPencil (CkMigrateMessage *)
 
void fft_init ()
 
void recv_trans (const PmeTransMsg *)
 
void forward_fft ()
 
void forward_subset_fft (int fromIdx, int toIdx)
 
void send_trans ()
 
void send_subset_trans (int fromIdx, int toIdx)
 
void recv_untrans (const PmeUntransMsg *)
 
void node_process_trans (PmeTransMsg *)
 
void recvNodeAck (PmeAckMsg *)
 
void node_process_untrans (PmeUntransMsg *)
 
void backward_fft ()
 
void backward_subset_fft (int fromIdx, int toIdx)
 
void send_untrans ()
 
void send_subset_untrans (int fromIdx, int toIdx)
 
- Public Member Functions inherited from PmePencil< CBase_PmeYPencil >
 PmePencil ()
 
 ~PmePencil ()
 
void base_init (PmePencilInitMsg *msg)
 
void order_init (int nBlocks)
 

Additional Inherited Members

- Public Types inherited from PmePencil< CBase_PmeYPencil >
typedef int AtomicInt
 
- Public Attributes inherited from PmePencil< CBase_PmeYPencil >
PmePencilInitMsgData initdata
 
Lattice lattice
 
PmeReduction evir
 
int sequence
 
AtomicInt imsg
 
AtomicInt imsgb
 
int hasData
 
int offload
 
float * data
 
float * work
 
int * send_order
 
int * needs_reply
 

Detailed Description

Definition at line 4724 of file ComputePme.C.

Constructor & Destructor Documentation

◆ PmeYPencil() [1/2]

PmeYPencil_SDAG_CODE PmeYPencil::PmeYPencil ( )
inline

Definition at line 4727 of file ComputePme.C.

References PmePencil< CBase_PmeYPencil >::imsg, and PmePencil< CBase_PmeYPencil >::imsgb.

4727 { __sdag_init(); setMigratable(false); imsg=imsgb=0;}

◆ PmeYPencil() [2/2]

PmeYPencil::PmeYPencil ( CkMigrateMessage *  )
inline

Definition at line 4728 of file ComputePme.C.

4728 { __sdag_init(); }

Member Function Documentation

◆ backward_fft()

void PmeYPencil::backward_fft ( )

Definition at line 6022 of file ComputePme.C.

References CKLOOP_CTRL_PME_BACKWARDFFT, PmePencil< CBase_PmeYPencil >::data, PmePencilInitMsgData::grid, PmePencil< CBase_PmeYPencil >::initdata, PmeGrid::K2, Node::Object(), PmeYPencilBackwardFFT(), Node::simParameters, SimParameters::useCkLoop, PmePencil< CBase_PmeYPencil >::work, PmePencilInitMsgData::xBlocks, and PmePencilInitMsgData::zBlocks.

Referenced by node_process_untrans().

6022  {
6023 #ifdef NAMD_FFTW
6024 #ifdef MANUAL_DEBUG_FFTW3
6025  dumpMatrixFloat3("bw_y_b", data, nx, initdata.grid.K2, nz, thisIndex.x, thisIndex.y, thisIndex.z);
6026 #endif
6027 
6028 #ifdef NAMD_FFTW_3
6029 #if CMK_SMP && USE_CKLOOP
6030  int useCkLoop = Node::Object()->simParameters->useCkLoop;
6031  if(useCkLoop>=CKLOOP_CTRL_PME_BACKWARDFFT
6032  && CkNumPes() >= 2 * initdata.xBlocks * initdata.zBlocks) {
6033  CkLoop_Parallelize(PmeYPencilBackwardFFT, 1, (void *)this, CkMyNodeSize(), 0, nx-1); //sync
6034  return;
6035  }
6036 #endif
6037  //the above is a transformation of the following loop using CkLoop
6038  for ( int i=0; i<nx; ++i ) {
6039 #if CMK_BLUEGENEL
6040  CmiNetworkProgress();
6041 #endif
6042  fftwf_execute_dft(backward_plan,
6043  ((fftwf_complex *) data) + i * nz * initdata.grid.K2,
6044  ((fftwf_complex *) data) + i * nz * initdata.grid.K2);
6045  }
6046 #else
6047  for ( int i=0; i<nx; ++i ) {
6048 #if CMK_BLUEGENEL
6049  CmiNetworkProgress();
6050 #endif
6051  fftw(backward_plan, nz,
6052  ((fftw_complex *) data) + i * nz * initdata.grid.K2,
6053  nz, 1, (fftw_complex *) work, 1, 0);
6054  }
6055 #endif
6056 
6057 #ifdef MANUAL_DEBUG_FFTW3
6058  dumpMatrixFloat3("bw_y_a", data, nx, initdata.grid.K2, nz, thisIndex.x, thisIndex.y, thisIndex.z);
6059 #endif
6060 
6061 #endif
6062 }
static Node * Object()
Definition: Node.h:86
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
int K2
Definition: PmeBase.h:21
SimParameters * simParameters
Definition: Node.h:181
static void PmeYPencilBackwardFFT(int first, int last, void *result, int paraNum, void *param)
Definition: ComputePme.C:6005
#define CKLOOP_CTRL_PME_BACKWARDFFT

◆ backward_subset_fft()

void PmeYPencil::backward_subset_fft ( int  fromIdx,
int  toIdx 
)

Definition at line 6010 of file ComputePme.C.

References PmePencil< CBase_PmeYPencil >::data, PmePencilInitMsgData::grid, PmePencil< CBase_PmeYPencil >::initdata, and PmeGrid::K2.

Referenced by PmeYPencilBackwardFFT().

6010  {
6011 #ifdef NAMD_FFTW
6012 #ifdef NAMD_FFTW_3
6013  for(int i=fromIdx; i<=toIdx; i++){
6014  fftwf_execute_dft(backward_plan,
6015  ((fftwf_complex *) data) + i * nz * initdata.grid.K2,
6016  ((fftwf_complex *) data) + i * nz * initdata.grid.K2);
6017  }
6018 #endif
6019 #endif
6020 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
int K2
Definition: PmeBase.h:21

◆ fft_init()

void PmeYPencil::fft_init ( )

Definition at line 4954 of file ComputePme.C.

References PmeGrid::block1, PmeGrid::block3, PmePencil< CBase_PmeYPencil >::data, PmeGrid::dim2, PmeGrid::dim3, PmePencil< CBase_PmeYPencil >::evir, ComputePmeMgr::fftw_plan_lock, fftwf_malloc, PmePencilInitMsgData::grid, PmePencil< CBase_PmeYPencil >::initdata, PmeGrid::K1, PmeGrid::K2, NAMD_die(), PmePencil< CBase_PmeYPencil >::order_init(), PmePencilInitMsgData::pmeNodeProxy, Node::simParameters, simParams, PmePencil< CBase_PmeYPencil >::work, and PmePencilInitMsgData::yBlocks.

4954  {
4955  CProxy_Node nd(CkpvAccess(BOCclass_group).node);
4956  Node *node = nd.ckLocalBranch();
4958 
4959 #if USE_NODE_PAR_RECEIVE
4960  ((NodePmeMgr *)CkLocalNodeBranch(initdata.pmeNodeProxy))->registerYPencil(thisIndex,this);
4961 #endif
4962 
4963  int K1 = initdata.grid.K1;
4964  int K2 = initdata.grid.K2;
4965  int dim2 = initdata.grid.dim2;
4966  int dim3 = initdata.grid.dim3;
4967  int block1 = initdata.grid.block1;
4968  int block3 = initdata.grid.block3;
4969 
4970  nx = block1;
4971  if ( (thisIndex.x + 1) * block1 > K1 ) nx = K1 - thisIndex.x * block1;
4972  nz = block3;
4973  if ( (thisIndex.z+1)*block3 > dim3/2 ) nz = dim3/2 - thisIndex.z*block3;
4974 
4975 #ifdef NAMD_FFTW
4977 
4978  data = (float *) fftwf_malloc( sizeof(float) * nx*dim2*nz*2);
4979  work = new float[2*K2];
4980 
4982 
4983 #ifdef NAMD_FFTW_3
4984  /* need array of sizes for the dimensions */
4985  /* ideally this should be implementable as a single multidimensional
4986  * plan, but that has proven tricky to implement, so we maintain the
4987  * loop of 1d plan executions. */
4988  int sizeLines=nz;
4989  int planLineSizes[1];
4990  planLineSizes[0]=K2;
4991  int fftwFlags = simParams->FFTWPatient ? FFTW_PATIENT : simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE ;
4992  forward_plan = fftwf_plan_many_dft(1, planLineSizes, sizeLines,
4993  (fftwf_complex *) data, NULL, sizeLines, 1,
4994  (fftwf_complex *) data, NULL, sizeLines, 1,
4995  FFTW_FORWARD,
4996  fftwFlags);
4997  backward_plan = fftwf_plan_many_dft(1, planLineSizes, sizeLines,
4998  (fftwf_complex *) data, NULL, sizeLines, 1,
4999  (fftwf_complex *) data, NULL, sizeLines, 1,
5000  FFTW_BACKWARD,
5001  fftwFlags);
5002  CkAssert(forward_plan != NULL);
5003  CkAssert(backward_plan != NULL);
5004 #else
5005  forward_plan = fftw_create_plan_specific(K2, FFTW_FORWARD,
5006  ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
5007  | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
5008  nz, (fftw_complex *) work, 1);
5009  backward_plan = fftw_create_plan_specific(K2, FFTW_BACKWARD,
5010  ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
5011  | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
5012  nz, (fftw_complex *) work, 1);
5013 #endif
5014  CmiUnlock(ComputePmeMgr::fftw_plan_lock);
5015 #else
5016  NAMD_die("Sorry, FFTW must be compiled in to use PME.");
5017 #endif
5018 
5019 #if USE_NODE_PAR_RECEIVE
5020  evir = 0;
5021  CmiMemoryWriteFence();
5022 #endif
5023 }
int dim2
Definition: PmeBase.h:22
static CmiNodeLock fftw_plan_lock
Definition: ComputePme.C:442
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
int dim3
Definition: PmeBase.h:22
Definition: Node.h:78
void order_init(int nBlocks)
Definition: ComputePme.C:4612
int K2
Definition: PmeBase.h:21
SimParameters * simParameters
Definition: Node.h:181
int K1
Definition: PmeBase.h:21
int block1
Definition: PmeBase.h:24
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:246
int block3
Definition: PmeBase.h:24
void NAMD_die(const char *err_msg)
Definition: common.C:147
#define simParams
Definition: Output.C:131
#define fftwf_malloc
Definition: ComputePme.C:13

◆ forward_fft()

void PmeYPencil::forward_fft ( )

Definition at line 5511 of file ComputePme.C.

References CKLOOP_CTRL_PME_FORWARDFFT, PmePencil< CBase_PmeYPencil >::data, PmeGrid::dim2, PmePencil< CBase_PmeYPencil >::evir, PmePencilInitMsgData::grid, PmePencil< CBase_PmeYPencil >::initdata, PmeGrid::K2, Node::Object(), PmeYPencilForwardFFT(), Node::simParameters, SimParameters::useCkLoop, PmePencil< CBase_PmeYPencil >::work, PmePencilInitMsgData::xBlocks, and PmePencilInitMsgData::zBlocks.

Referenced by node_process_trans().

5511  {
5512  evir = 0.;
5513 #ifdef NAMD_FFTW
5514 #ifdef MANUAL_DEBUG_FFTW3
5515  dumpMatrixFloat3("fw_y_b", data, nx, initdata.grid.K2, nz, thisIndex.x, thisIndex.y, thisIndex.z);
5516 #endif
5517 
5518 #ifdef NAMD_FFTW_3
5519 #if CMK_SMP && USE_CKLOOP
5520  int useCkLoop = Node::Object()->simParameters->useCkLoop;
5521  if(useCkLoop>=CKLOOP_CTRL_PME_FORWARDFFT
5522  && CkNumPes() >= 2 * initdata.xBlocks * initdata.zBlocks) {
5523  CkLoop_Parallelize(PmeYPencilForwardFFT, 1, (void *)this, CkMyNodeSize(), 0, nx-1); //sync
5524  return;
5525  }
5526 #endif
5527  //the above is a transformation of the following loop using CkLoop
5528  for ( int i=0; i<nx; ++i ) {
5529  fftwf_execute_dft(forward_plan, ((fftwf_complex *) data) + i
5530  * nz * initdata.grid.K2,
5531  ((fftwf_complex *) data) + i * nz * initdata.grid.K2);
5532  }
5533 #else
5534  for ( int i=0; i<nx; ++i ) {
5535  fftw(forward_plan, nz,
5536  ((fftw_complex *) data) + i * nz * initdata.grid.K2,
5537  nz, 1, (fftw_complex *) work, 1, 0);
5538  }
5539 #endif
5540 #ifdef MANUAL_DEBUG_FFTW3
5541  dumpMatrixFloat3("fw_y_a", data, nx, initdata.grid.dim2, nz, thisIndex.x, thisIndex.y, thisIndex.z);
5542 #endif
5543 
5544 #endif
5545 }
static Node * Object()
Definition: Node.h:86
int dim2
Definition: PmeBase.h:22
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
int K2
Definition: PmeBase.h:21
SimParameters * simParameters
Definition: Node.h:181
#define CKLOOP_CTRL_PME_FORWARDFFT
Definition: SimParameters.h:97
static void PmeYPencilForwardFFT(int first, int last, void *result, int paraNum, void *param)
Definition: ComputePme.C:5495

◆ forward_subset_fft()

void PmeYPencil::forward_subset_fft ( int  fromIdx,
int  toIdx 
)

Definition at line 5499 of file ComputePme.C.

References PmePencil< CBase_PmeYPencil >::data, PmePencilInitMsgData::grid, PmePencil< CBase_PmeYPencil >::initdata, and PmeGrid::K2.

Referenced by PmeYPencilForwardFFT().

5499  {
5500 #ifdef NAMD_FFTW
5501 #ifdef NAMD_FFTW_3
5502  for(int i=fromIdx; i<=toIdx; i++){
5503  fftwf_execute_dft(forward_plan, ((fftwf_complex *) data) + i
5504  * nz * initdata.grid.K2,
5505  ((fftwf_complex *) data) + i * nz * initdata.grid.K2);
5506  }
5507 #endif
5508 #endif
5509 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
int K2
Definition: PmeBase.h:21

◆ node_process_trans()

void PmeYPencil::node_process_trans ( PmeTransMsg msg)

Definition at line 5025 of file ComputePme.C.

References forward_fft(), PmeTransMsg::hasData, PmePencil< CBase_PmeYPencil >::hasData, PmePencil< CBase_PmeYPencil >::imsg, PmePencil< CBase_PmeYPencil >::initdata, PmePencil< CBase_PmeYPencil >::needs_reply, recv_trans(), send_trans(), PmeTransMsg::sourceNode, and PmePencilInitMsgData::yBlocks.

Referenced by NodePmeMgr::recvYTrans().

5026 {
5027  if ( msg->hasData ) hasData = 1;
5028  needs_reply[msg->sourceNode] = msg->hasData;
5029  recv_trans(msg);
5030  int limsg;
5031  CmiMemoryAtomicFetchAndInc(imsg,limsg);
5032  if(limsg+1 == initdata.yBlocks)
5033  {
5034  if ( hasData ) {
5035  forward_fft();
5036  }
5037  send_trans();
5038  imsg=0;
5039  CmiMemoryWriteFence();
5040  }
5041 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
void recv_trans(const PmeTransMsg *)
Definition: ComputePme.C:5458
void send_trans()
Definition: ComputePme.C:5609
int sourceNode
Definition: ComputePme.C:159
void forward_fft()
Definition: ComputePme.C:5511

◆ node_process_untrans()

void PmeYPencil::node_process_untrans ( PmeUntransMsg msg)

Definition at line 5048 of file ComputePme.C.

References backward_fft(), PmePencil< CBase_PmeYPencil >::hasData, PmePencil< CBase_PmeYPencil >::imsgb, PmePencil< CBase_PmeYPencil >::initdata, NAMD_bug(), recv_untrans(), send_untrans(), and PmePencilInitMsgData::yBlocks.

Referenced by recvNodeAck(), and NodePmeMgr::recvYUntrans().

5049 {
5050  if ( msg ) {
5051  if ( ! hasData ) NAMD_bug("PmeYPencil::node_process_untrans non-null msg but not hasData");
5052  recv_untrans(msg);
5053  } else if ( hasData ) NAMD_bug("PmeYPencil::node_process_untrans hasData but null msg");
5054  int limsg;
5055  CmiMemoryAtomicFetchAndInc(imsgb,limsg);
5056  if(limsg+1 == initdata.yBlocks)
5057  {
5058  if ( hasData ) {
5059  backward_fft();
5060  }
5061  hasData=0;
5062  imsgb=0;
5063  CmiMemoryWriteFence();
5064  send_untrans();
5065  }
5066 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
void NAMD_bug(const char *err_msg)
Definition: common.C:195
void recv_untrans(const PmeUntransMsg *)
Definition: ComputePme.C:5981
void backward_fft()
Definition: ComputePme.C:6022
void send_untrans()
Definition: ComputePme.C:6128

◆ recv_trans()

void PmeYPencil::recv_trans ( const PmeTransMsg msg)

Definition at line 5458 of file ComputePme.C.

References PmeGrid::block2, PmePencil< CBase_PmeYPencil >::data, PmePencilInitMsgData::grid, PmeTransMsg::hasData, PmePencil< CBase_PmeYPencil >::imsg, PmePencil< CBase_PmeYPencil >::initdata, PmeGrid::K2, PmeTransMsg::lattice, PmePencil< CBase_PmeYPencil >::lattice, PmeTransMsg::nx, PmeTransMsg::qgrid, PmeTransMsg::sequence, PmePencil< CBase_PmeYPencil >::sequence, and PmeTransMsg::sourceNode.

Referenced by node_process_trans().

5458  {
5459  if ( imsg == 0 ) {
5460  lattice = msg->lattice;
5461  sequence = msg->sequence;
5462  }
5463  int block2 = initdata.grid.block2;
5464  int K2 = initdata.grid.K2;
5465  int jb = msg->sourceNode;
5466  int ny = msg->nx;
5467  if ( msg->hasData ) {
5468  const float *md = msg->qgrid;
5469  float *d = data;
5470  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
5471  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
5472  for ( int k=0; k<nz; ++k ) {
5473 #ifdef ZEROCHECK
5474  if ( (*md) == 0. ) CkPrintf("0 in ZY at %d %d %d %d %d %d %d %d %d\n",
5475  thisIndex.x, jb, thisIndex.z, i, j, k, nx, ny, nz);
5476 #endif
5477  d[2*(j*nz+k)] = *(md++);
5478  d[2*(j*nz+k)+1] = *(md++);
5479  }
5480  }
5481  }
5482  } else {
5483  float *d = data;
5484  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
5485  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
5486  for ( int k=0; k<nz; ++k ) {
5487  d[2*(j*nz+k)] = 0;
5488  d[2*(j*nz+k)+1] = 0;
5489  }
5490  }
5491  }
5492  }
5493 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
int K2
Definition: PmeBase.h:21
float * qgrid
Definition: ComputePme.C:165
int block2
Definition: PmeBase.h:24
int sourceNode
Definition: ComputePme.C:159
Lattice lattice
Definition: ComputePme.C:162

◆ recv_untrans()

void PmeYPencil::recv_untrans ( const PmeUntransMsg msg)

Definition at line 5981 of file ComputePme.C.

References PmeGrid::block2, PmePencil< CBase_PmeYPencil >::data, PmePencilInitMsgData::grid, PmePencil< CBase_PmeYPencil >::initdata, PmeGrid::K2, PmeUntransMsg::ny, PmeUntransMsg::qgrid, and PmeUntransMsg::sourceNode.

Referenced by node_process_untrans().

5981  {
5982  int block2 = initdata.grid.block2;
5983  int K2 = initdata.grid.K2;
5984  int jb = msg->sourceNode;
5985  int ny = msg->ny;
5986  const float *md = msg->qgrid;
5987  float *d = data;
5988  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
5989 #if CMK_BLUEGENEL
5990  CmiNetworkProgress();
5991 #endif
5992  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
5993  for ( int k=0; k<nz; ++k ) {
5994 #ifdef ZEROCHECK
5995  if ( (*md) == 0. ) CkPrintf("0 in XY at %d %d %d %d %d %d %d %d %d\n",
5996  thisIndex.x, jb, thisIndex.z, i, j, k, nx, ny, nz);
5997 #endif
5998  d[2*(j*nz+k)] = *(md++);
5999  d[2*(j*nz+k)+1] = *(md++);
6000  }
6001  }
6002  }
6003 }
float * qgrid
Definition: ComputePme.C:182
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
int K2
Definition: PmeBase.h:21
int block2
Definition: PmeBase.h:24

◆ recvNodeAck()

void PmeYPencil::recvNodeAck ( PmeAckMsg msg)

Definition at line 5043 of file ComputePme.C.

References node_process_untrans().

5043  {
5044  delete msg;
5046 }
void node_process_untrans(PmeUntransMsg *)
Definition: ComputePme.C:5048

◆ send_subset_trans()

void PmeYPencil::send_subset_trans ( int  fromIdx,
int  toIdx 
)

Definition at line 5552 of file ComputePme.C.

References PmeGrid::block2, PmePencil< CBase_PmeYPencil >::data, PmeTransMsg::destElem, PmePencilInitMsgData::grid, PmeTransMsg::hasData, PmePencil< CBase_PmeYPencil >::hasData, PmePencil< CBase_PmeYPencil >::initdata, PmeGrid::K2, PmeTransMsg::lattice, PmePencil< CBase_PmeYPencil >::lattice, PmeTransMsg::nx, PME_TRANS2_PRIORITY, PmePencilInitMsgData::pmeNodeProxy, PRIORITY_SIZE, PmeTransMsg::qgrid, PmePencil< CBase_PmeYPencil >::send_order, PmeTransMsg::sequence, PmePencil< CBase_PmeYPencil >::sequence, SET_PRIORITY, PmeTransMsg::sourceNode, PmePencilInitMsgData::xm, PmePencilInitMsgData::xPencil, and PmePencilInitMsgData::yBlocks.

Referenced by PmeYPencilSendTrans().

5552  {
5553  int yBlocks = initdata.yBlocks;
5554  int block2 = initdata.grid.block2;
5555  int K2 = initdata.grid.K2;
5556  for ( int isend=fromIdx; isend<=toIdx; ++isend ) {
5557  int jb = send_order[isend];
5558  int ny = block2;
5559  if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2;
5560  int hd = ( hasData ? 1 : 0 );
5561  PmeTransMsg *msg = new (hd*nx*ny*nz*2,PRIORITY_SIZE) PmeTransMsg;
5562  msg->lattice = lattice;
5563  msg->sourceNode = thisIndex.x;
5564  msg->hasData = hasData;
5565  msg->nx = nx;
5566  if ( hasData ) {
5567  float *md = msg->qgrid;
5568  const float *d = data;
5569  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
5570  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
5571  for ( int k=0; k<nz; ++k ) {
5572  *(md++) = d[2*(j*nz+k)];
5573  *(md++) = d[2*(j*nz+k)+1];
5574  #ifdef ZEROCHECK
5575  if ( *(md-2) == 0. ) CkPrintf("send 0 in YX at %d %d %d %d %d %d %d %d %d\n",
5576  thisIndex.x, jb, thisIndex.z, i, j, k, nx, ny, nz);
5577  #endif
5578  }
5579  }
5580  }
5581  if ( md != msg->qgrid + nx*ny*nz*2 ) CkPrintf("error in YX at %d %d %d\n",
5582  thisIndex.x, jb, thisIndex.z);
5583  }
5584  msg->sequence = sequence;
5586  CmiEnableUrgentSend(1);
5587 #if USE_NODE_PAR_RECEIVE
5588  msg->destElem=CkArrayIndex3D(0,jb,thisIndex.z);
5589 #if X_PERSIST
5590  CmiUsePersistentHandle(&trans_handle[isend], 1);
5591 #endif
5592  initdata.pmeNodeProxy[CmiNodeOf(initdata.xm.ckLocalBranch()->procNum(0,msg->destElem))].recvXTrans(msg);
5593 #if X_PERSIST
5594  CmiUsePersistentHandle(NULL, 0);
5595 #endif
5596 #else
5597 #if X_PERSIST
5598  CmiUsePersistentHandle(&trans_handle[isend], 1);
5599 #endif
5600  initdata.xPencil(0,jb,thisIndex.z).recvTrans(msg);
5601 #if X_PERSIST
5602  CmiUsePersistentHandle(NULL, 0);
5603 #endif
5604 #endif
5605  CmiEnableUrgentSend(0);
5606  }
5607 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
#define PME_TRANS2_PRIORITY
Definition: Priorities.h:32
int K2
Definition: PmeBase.h:21
CProxy_PmePencilMap xm
Definition: ComputePme.C:247
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:246
float * qgrid
Definition: ComputePme.C:165
int block2
Definition: PmeBase.h:24
#define PRIORITY_SIZE
Definition: Priorities.h:13
int sourceNode
Definition: ComputePme.C:159
CkArrayIndex3D destElem
Definition: ComputePme.C:166
Lattice lattice
Definition: ComputePme.C:162
#define SET_PRIORITY(MSG, SEQ, PRIO)
Definition: Priorities.h:18
CProxy_PmeXPencil xPencil
Definition: ComputePme.C:242

◆ send_subset_untrans()

void PmeYPencil::send_subset_untrans ( int  fromIdx,
int  toIdx 
)

Definition at line 6069 of file ComputePme.C.

References PmeGrid::block2, PmePencil< CBase_PmeYPencil >::data, PmeUntransMsg::destElem, PmePencilInitMsgData::grid, PmePencil< CBase_PmeYPencil >::initdata, PmeGrid::K2, PmePencil< CBase_PmeYPencil >::needs_reply, PmeUntransMsg::ny, PME_UNTRANS2_PRIORITY, PmePencilInitMsgData::pmeNodeProxy, PRIORITY_SIZE, PmeUntransMsg::qgrid, PmePencil< CBase_PmeYPencil >::send_order, PmePencil< CBase_PmeYPencil >::sequence, SET_PRIORITY, PmeUntransMsg::sourceNode, PmePencilInitMsgData::yBlocks, PmePencilInitMsgData::zm, and PmePencilInitMsgData::zPencil.

Referenced by PmeYPencilSendUntrans().

6069  {
6070  int yBlocks = initdata.yBlocks;
6071  int block2 = initdata.grid.block2;
6072  int K2 = initdata.grid.K2;
6073 
6074  for(int isend=fromIdx; isend<=toIdx; isend++) {
6075  int jb = send_order[isend];
6076  if ( ! needs_reply[jb] ) {
6077  PmeAckMsg *msg = new (PRIORITY_SIZE) PmeAckMsg;
6078  CmiEnableUrgentSend(1);
6080 #if USE_NODE_PAR_RECEIVE
6081  initdata.zPencil(thisIndex.x,jb,0).recvNodeAck(msg);
6082 #else
6083  initdata.zPencil(thisIndex.x,jb,0).recvAck(msg);
6084 #endif
6085  CmiEnableUrgentSend(0);
6086  continue;
6087  }
6088  int ny = block2;
6089  if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2;
6090  PmeUntransMsg *msg = new (nx*ny*nz*2,PRIORITY_SIZE) PmeUntransMsg;
6091  msg->sourceNode = thisIndex.z;
6092  msg->ny = nz;
6093  float *md = msg->qgrid;
6094  const float *d = data;
6095  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
6096  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
6097  for ( int k=0; k<nz; ++k ) {
6098  *(md++) = d[2*(j*nz+k)];
6099  *(md++) = d[2*(j*nz+k)+1];
6100  }
6101  }
6102  }
6104  CmiEnableUrgentSend(1);
6105 #if USE_NODE_PAR_RECEIVE
6106  msg->destElem=CkArrayIndex3D( thisIndex.x, jb, 0);
6107  // CkPrintf("[%d] sending to %d %d %d recvZUntrans on node %d\n", CkMyPe(), thisIndex.x, jb, 0, CmiNodeOf(initdata.zm.ckLocalBranch()->procNum(0,msg->destElem)));
6108 #if Z_PERSIST
6109  CmiUsePersistentHandle(&untrans_handle[isend], 1);
6110 #endif
6111  initdata.pmeNodeProxy[CmiNodeOf(initdata.zm.ckLocalBranch()->procNum(0,msg->destElem))].recvZUntrans(msg);
6112 #if Z_PERSIST
6113  CmiUsePersistentHandle(NULL, 0);
6114 #endif
6115 #else
6116 #if Z_PERSIST
6117  CmiUsePersistentHandle(&untrans_handle[isend], 1);
6118 #endif
6119  initdata.zPencil(thisIndex.x,jb,0).recvUntrans(msg);
6120 #if Z_PERSIST
6121  CmiUsePersistentHandle(NULL, 0);
6122 #endif
6123 #endif
6124  CmiEnableUrgentSend(0);
6125  }
6126 }
float * qgrid
Definition: ComputePme.C:182
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
int K2
Definition: PmeBase.h:21
CProxy_PmeZPencil zPencil
Definition: ComputePme.C:244
CProxy_PmePencilMap zm
Definition: ComputePme.C:249
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:246
int block2
Definition: PmeBase.h:24
#define PRIORITY_SIZE
Definition: Priorities.h:13
#define SET_PRIORITY(MSG, SEQ, PRIO)
Definition: Priorities.h:18
CkArrayIndex3D destElem
Definition: ComputePme.C:183
#define PME_UNTRANS2_PRIORITY
Definition: Priorities.h:34

◆ send_trans()

void PmeYPencil::send_trans ( )

Definition at line 5609 of file ComputePme.C.

References PmeGrid::block2, CKLOOP_CTRL_PME_SENDTRANS, PmePencil< CBase_PmeYPencil >::data, PmeTransMsg::destElem, PmePencilInitMsgData::grid, PmeTransMsg::hasData, PmePencil< CBase_PmeYPencil >::hasData, PmePencil< CBase_PmeYPencil >::initdata, PmeGrid::K2, PmeTransMsg::lattice, PmePencil< CBase_PmeYPencil >::lattice, PmeTransMsg::nx, Node::Object(), PME_TRANS2_PRIORITY, PmePencilInitMsgData::pmeNodeProxy, PmeYPencilSendTrans(), PRIORITY_SIZE, PmeTransMsg::qgrid, PmePencil< CBase_PmeYPencil >::send_order, PmeTransMsg::sequence, PmePencil< CBase_PmeYPencil >::sequence, SET_PRIORITY, Node::simParameters, PmeTransMsg::sourceNode, SimParameters::useCkLoop, PmePencilInitMsgData::xBlocks, PmePencilInitMsgData::xm, PmePencilInitMsgData::xPencil, PmePencilInitMsgData::yBlocks, and PmePencilInitMsgData::zBlocks.

Referenced by node_process_trans().

5609  {
5610 #if USE_PERSISTENT
5611  if (trans_handle == NULL) setup_persistent();
5612 #endif
5613 #if CMK_SMP && USE_CKLOOP
5614  int useCkLoop = Node::Object()->simParameters->useCkLoop;
5615  if(useCkLoop>=CKLOOP_CTRL_PME_SENDTRANS
5616  && CkNumPes() >= 2 * initdata.xBlocks * initdata.zBlocks) {
5623  //send_subset_trans(0, initdata.yBlocks-1);
5624  CkLoop_Parallelize(PmeYPencilSendTrans, 1, (void *)this, CkMyNodeSize(), 0, initdata.yBlocks-1, 1); //not sync
5625  return;
5626  }
5627 #endif
5628  int yBlocks = initdata.yBlocks;
5629  int block2 = initdata.grid.block2;
5630  int K2 = initdata.grid.K2;
5631  for ( int isend=0; isend<yBlocks; ++isend ) {
5632  int jb = send_order[isend];
5633  int ny = block2;
5634  if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2;
5635  int hd = ( hasData ? 1 : 0 );
5636  PmeTransMsg *msg = new (hd*nx*ny*nz*2,PRIORITY_SIZE) PmeTransMsg;
5637  msg->lattice = lattice;
5638  msg->sourceNode = thisIndex.x;
5639  msg->hasData = hasData;
5640  msg->nx = nx;
5641  if ( hasData ) {
5642  float *md = msg->qgrid;
5643  const float *d = data;
5644  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
5645  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
5646  for ( int k=0; k<nz; ++k ) {
5647  *(md++) = d[2*(j*nz+k)];
5648  *(md++) = d[2*(j*nz+k)+1];
5649 #ifdef ZEROCHECK
5650  if ( *(md-2) == 0. ) CkPrintf("send 0 in YX at %d %d %d %d %d %d %d %d %d\n",
5651  thisIndex.x, jb, thisIndex.z, i, j, k, nx, ny, nz);
5652 #endif
5653  }
5654  }
5655  }
5656  if ( md != msg->qgrid + nx*ny*nz*2 ) CkPrintf("error in YX at %d %d %d\n",
5657  thisIndex.x, jb, thisIndex.z);
5658  }
5659  msg->sequence = sequence;
5661  CmiEnableUrgentSend(1);
5662 #if USE_NODE_PAR_RECEIVE
5663  msg->destElem=CkArrayIndex3D(0,jb,thisIndex.z);
5664 #if X_PERSIST
5665  CmiUsePersistentHandle(&trans_handle[isend], 1);
5666 #endif
5667  initdata.pmeNodeProxy[CmiNodeOf(initdata.xm.ckLocalBranch()->procNum(0,msg->destElem))].recvXTrans(msg);
5668 #if X_PERSIST
5669  CmiUsePersistentHandle(NULL, 0);
5670 #endif
5671 #else
5672 #if X_PERSIST
5673  CmiUsePersistentHandle(&trans_handle[isend], 1);
5674 #endif
5675  initdata.xPencil(0,jb,thisIndex.z).recvTrans(msg);
5676 #if X_PERSIST
5677  CmiUsePersistentHandle(NULL, 0);
5678 #endif
5679 
5680 #endif
5681  CmiEnableUrgentSend(0);
5682  }
5683 }
static Node * Object()
Definition: Node.h:86
static void PmeYPencilSendTrans(int first, int last, void *result, int paraNum, void *param)
Definition: ComputePme.C:5547
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
#define PME_TRANS2_PRIORITY
Definition: Priorities.h:32
int K2
Definition: PmeBase.h:21
SimParameters * simParameters
Definition: Node.h:181
CProxy_PmePencilMap xm
Definition: ComputePme.C:247
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:246
float * qgrid
Definition: ComputePme.C:165
int block2
Definition: PmeBase.h:24
#define PRIORITY_SIZE
Definition: Priorities.h:13
int sourceNode
Definition: ComputePme.C:159
#define CKLOOP_CTRL_PME_SENDTRANS
Definition: SimParameters.h:98
CkArrayIndex3D destElem
Definition: ComputePme.C:166
Lattice lattice
Definition: ComputePme.C:162
#define SET_PRIORITY(MSG, SEQ, PRIO)
Definition: Priorities.h:18
CProxy_PmeXPencil xPencil
Definition: ComputePme.C:242

◆ send_untrans()

void PmeYPencil::send_untrans ( )

Definition at line 6128 of file ComputePme.C.

References PmeGrid::block2, CKLOOP_CTRL_PME_SENDUNTRANS, PmePencil< CBase_PmeYPencil >::data, PmeUntransMsg::destElem, PmePencil< CBase_PmeYPencil >::evir, PmePencilInitMsgData::grid, PmePencil< CBase_PmeYPencil >::initdata, PmeGrid::K2, PmePencil< CBase_PmeYPencil >::needs_reply, PmeUntransMsg::ny, Node::Object(), PME_UNTRANS2_PRIORITY, PmePencilInitMsgData::pmeNodeProxy, PmeYPencilSendUntrans(), PRIORITY_SIZE, PmeUntransMsg::qgrid, PmePencil< CBase_PmeYPencil >::send_order, PmePencil< CBase_PmeYPencil >::sequence, SET_PRIORITY, Node::simParameters, PmeUntransMsg::sourceNode, SimParameters::useCkLoop, PmePencilInitMsgData::xBlocks, PmePencilInitMsgData::yBlocks, PmePencilInitMsgData::zBlocks, PmePencilInitMsgData::zm, and PmePencilInitMsgData::zPencil.

Referenced by node_process_untrans().

6128  {
6129 #if USE_PERSISTENT
6130  if (untrans_handle == NULL) setup_persistent();
6131 #endif
6132 #if CMK_SMP && USE_CKLOOP
6133  int useCkLoop = Node::Object()->simParameters->useCkLoop;
6134  if(useCkLoop>=CKLOOP_CTRL_PME_SENDUNTRANS
6135  && CkNumPes() >= 2 * initdata.xBlocks * initdata.zBlocks) {
6136  int yBlocks = initdata.yBlocks;
6137 
6138 #if USE_NODE_PAR_RECEIVE
6139  //CkLoop_Parallelize(PmeYPencilSendUntrans, 1, (void *)this, CkMyNodeSize(), 0, yBlocks-1, 1); //sync
6140  CkLoop_Parallelize(PmeYPencilSendUntrans, 1, (void *)this, yBlocks, 0, yBlocks-1, 1);
6141 #else
6142  //CkLoop_Parallelize(PmeYPencilSendUntrans, 1, (void *)this, CkMyNodeSize(), 0, yBlocks-1, 0); //not sync
6143  CkLoop_Parallelize(PmeYPencilSendUntrans, 1, (void *)this, yBlocks, 0, yBlocks-1, 0); //not sync
6144 #endif
6145  return;
6146  }
6147 #endif
6148  int yBlocks = initdata.yBlocks;
6149  int block2 = initdata.grid.block2;
6150  int K2 = initdata.grid.K2;
6151  for ( int isend=0; isend<yBlocks; ++isend ) {
6152  int jb = send_order[isend];
6153  if ( ! needs_reply[jb] ) {
6154  PmeAckMsg *msg = new (PRIORITY_SIZE) PmeAckMsg;
6155  CmiEnableUrgentSend(1);
6157 #if USE_NODE_PAR_RECEIVE
6158  initdata.zPencil(thisIndex.x,jb,0).recvNodeAck(msg);
6159 #else
6160  initdata.zPencil(thisIndex.x,jb,0).recvAck(msg);
6161 #endif
6162  CmiEnableUrgentSend(0);
6163  continue;
6164  }
6165  int ny = block2;
6166  if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2;
6167  PmeUntransMsg *msg = new (nx*ny*nz*2,PRIORITY_SIZE) PmeUntransMsg;
6168  msg->sourceNode = thisIndex.z;
6169  msg->ny = nz;
6170  float *md = msg->qgrid;
6171  const float *d = data;
6172  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
6173  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
6174  for ( int k=0; k<nz; ++k ) {
6175  *(md++) = d[2*(j*nz+k)];
6176  *(md++) = d[2*(j*nz+k)+1];
6177  }
6178  }
6179  }
6181 
6182  CmiEnableUrgentSend(1);
6183 #if USE_NODE_PAR_RECEIVE
6184  msg->destElem=CkArrayIndex3D( thisIndex.x, jb, 0);
6185  // CkPrintf("[%d] sending to %d %d %d recvZUntrans on node %d\n", CkMyPe(), thisIndex.x, jb, 0, CmiNodeOf(initdata.zm.ckLocalBranch()->procNum(0,msg->destElem)));
6186 #if Z_PERSIST
6187  CmiUsePersistentHandle(&untrans_handle[isend], 1);
6188 #endif
6189  initdata.pmeNodeProxy[CmiNodeOf(initdata.zm.ckLocalBranch()->procNum(0,msg->destElem))].recvZUntrans(msg);
6190 #if Z_PERSIST
6191  CmiUsePersistentHandle(NULL, 0);
6192 #endif
6193 #else
6194 #if Z_PERSIST
6195  CmiUsePersistentHandle(&untrans_handle[isend], 1);
6196 #endif
6197  initdata.zPencil(thisIndex.x,jb,0).recvUntrans(msg);
6198 #if Z_PERSIST
6199  CmiUsePersistentHandle(NULL, 0);
6200 #endif
6201 #endif
6202  CmiEnableUrgentSend(0);
6203  }
6204 
6205 #if USE_NODE_PAR_RECEIVE
6206  evir = 0.;
6207  CmiMemoryWriteFence();
6208 #endif
6209 }
static Node * Object()
Definition: Node.h:86
float * qgrid
Definition: ComputePme.C:182
PmePencilInitMsgData initdata
Definition: ComputePme.C:4624
int K2
Definition: PmeBase.h:21
CProxy_PmeZPencil zPencil
Definition: ComputePme.C:244
SimParameters * simParameters
Definition: Node.h:181
CProxy_PmePencilMap zm
Definition: ComputePme.C:249
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:246
int block2
Definition: PmeBase.h:24
#define CKLOOP_CTRL_PME_SENDUNTRANS
#define PRIORITY_SIZE
Definition: Priorities.h:13
static void PmeYPencilSendUntrans(int first, int last, void *result, int paraNum, void *param)
Definition: ComputePme.C:6064
#define SET_PRIORITY(MSG, SEQ, PRIO)
Definition: Priorities.h:18
CkArrayIndex3D destElem
Definition: ComputePme.C:183
#define PME_UNTRANS2_PRIORITY
Definition: Priorities.h:34

The documentation for this class was generated from the following file: