NAMD
Public Member Functions | Public Attributes | List of all members
PmeXPencil Class Reference
Inheritance diagram for PmeXPencil:
PmePencil< CBase_PmeXPencil >

Public Member Functions

PmeXPencil_SDAG_CODE PmeXPencil ()
 
 PmeXPencil (CkMigrateMessage *)
 
 ~PmeXPencil ()
 
void fft_init ()
 
void recv_trans (const PmeTransMsg *)
 
void forward_fft ()
 
void pme_kspace ()
 
void backward_fft ()
 
void send_untrans ()
 
void send_subset_untrans (int fromIdx, int toIdx)
 
void node_process_trans (PmeTransMsg *)
 
void evir_init ()
 
- Public Member Functions inherited from PmePencil< CBase_PmeXPencil >
 PmePencil ()
 
 ~PmePencil ()
 
void base_init (PmePencilInitMsg *msg)
 
void order_init (int nBlocks)
 

Public Attributes

fftw_plan forward_plan
 
fftw_plan backward_plan
 
int ny
 
int nz
 
int recipEvirPe
 
PmeKSpacemyKSpace
 
- Public Attributes inherited from PmePencil< CBase_PmeXPencil >
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
 

Additional Inherited Members

- Public Types inherited from PmePencil< CBase_PmeXPencil >
typedef int AtomicInt
 

Detailed Description

Definition at line 4705 of file ComputePme.C.

Constructor & Destructor Documentation

PmeXPencil_SDAG_CODE PmeXPencil::PmeXPencil ( )
inline

Definition at line 4708 of file ComputePme.C.

References PmePencil< CBase_PmeXPencil >::imsg, PmePencil< CBase_PmeXPencil >::imsgb, myKSpace, and recipEvirPe.

4708 { __sdag_init(); myKSpace = 0; setMigratable(false); imsg=imsgb=0; recipEvirPe = -999; }
PmeKSpace * myKSpace
Definition: ComputePme.C:4739
int recipEvirPe
Definition: ComputePme.C:4737
PmeXPencil::PmeXPencil ( CkMigrateMessage *  )
inline

Definition at line 4709 of file ComputePme.C.

4709 { __sdag_init(); }
PmeXPencil::~PmeXPencil ( )
inline

Definition at line 4710 of file ComputePme.C.

4710  {
4711  #ifdef NAMD_FFTW
4712  #ifdef NAMD_FFTW_3
4713  delete [] forward_plans;
4714  delete [] backward_plans;
4715  #endif
4716  #endif
4717  }

Member Function Documentation

void PmeXPencil::backward_fft ( )

Definition at line 5718 of file ComputePme.C.

References backward_plan, CKLOOP_CTRL_PME_BACKWARDFFT, PmePencil< CBase_PmeXPencil >::data, PmePencilInitMsgData::grid, PmePencil< CBase_PmeXPencil >::initdata, PmeGrid::K1, Node::Object(), PmeXZPencilFFT(), Node::simParameters, SimParameters::useCkLoop, PmePencil< CBase_PmeXPencil >::work, PmePencilInitMsgData::yBlocks, and PmePencilInitMsgData::zBlocks.

Referenced by node_process_trans().

5718  {
5719 #ifdef NAMD_FFTW
5720 #ifdef MANUAL_DEBUG_FFTW3
5721  dumpMatrixFloat3("bw_x_b", data, initdata.grid.K1, ny, nz, thisIndex.x, thisIndex.y, thisIndex.z);
5722 #endif
5723 
5724 #ifdef NAMD_FFTW_3
5725 #if CMK_SMP && USE_CKLOOP
5726  int useCkLoop = Node::Object()->simParameters->useCkLoop;
5727  if(useCkLoop>=CKLOOP_CTRL_PME_BACKWARDFFT
5728  && CkNumPes() >= 2 * initdata.yBlocks * initdata.zBlocks) {
5729  //for(int i=0; i<numPlans; i++) fftwf_execute(backward_plans[i]);
5730  //transform the above loop
5731  CkLoop_Parallelize(PmeXZPencilFFT, 1, (void *)backward_plans, CkMyNodeSize(), 0, numPlans-1); //sync
5732  return;
5733  }
5734 #endif
5735  fftwf_execute(backward_plan);
5736 #else
5737  fftw(backward_plan, ny*nz,
5738  ((fftw_complex *) data), ny*nz, 1, (fftw_complex *) work, 1, 0);
5739 #endif
5740 #ifdef MANUAL_DEBUG_FFTW3
5741  dumpMatrixFloat3("bw_x_a", data, initdata.grid.K1, ny, nz, thisIndex.x, thisIndex.y, thisIndex.z);
5742 #endif
5743 #endif
5744 }
static Node * Object()
Definition: Node.h:86
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
SimParameters * simParameters
Definition: Node.h:178
int K1
Definition: PmeBase.h:18
static void PmeXZPencilFFT(int first, int last, void *result, int paraNum, void *param)
Definition: ComputePme.C:5183
fftw_plan backward_plan
Definition: ComputePme.C:4733
#define CKLOOP_CTRL_PME_BACKWARDFFT
Definition: SimParameters.h:97
void PmeXPencil::evir_init ( )

Definition at line 4763 of file ComputePme.C.

References findRecipEvirPe(), PmePencil< CBase_PmeXPencil >::initdata, PmePencilInitMsgData::pmeProxy, and recipEvirPe.

4763  {
4765  initdata.pmeProxy[recipEvirPe].addRecipEvirClient();
4766 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
CProxy_ComputePmeMgr pmeProxy
Definition: ComputePme.C:223
static int findRecipEvirPe()
Definition: ComputePme.C:247
int recipEvirPe
Definition: ComputePme.C:4737
void PmeXPencil::fft_init ( )

Definition at line 5041 of file ComputePme.C.

References backward_plan, PmeGrid::block2, PmeGrid::block3, PmePencil< CBase_PmeXPencil >::data, PmeGrid::dim3, ComputePmeMgr::fftw_plan_lock, SimParameters::FFTWEstimate, fftwf_malloc, SimParameters::FFTWPatient, forward_plan, PmePencilInitMsgData::grid, if(), PmePencil< CBase_PmeXPencil >::initdata, PmeGrid::K1, PmeGrid::K2, myKSpace, NAMD_die(), nz, PmePencil< CBase_PmeXPencil >::order_init(), PmePencilInitMsgData::pmeNodeProxy, Node::simParameters, SimParameters::useCkLoop, PmePencil< CBase_PmeXPencil >::work, and PmePencilInitMsgData::xBlocks.

5041  {
5042  CProxy_Node nd(CkpvAccess(BOCclass_group).node);
5043  Node *node = nd.ckLocalBranch();
5045 #if USE_NODE_PAR_RECEIVE
5046  ((NodePmeMgr *)CkLocalNodeBranch(initdata.pmeNodeProxy))->registerXPencil(thisIndex,this);
5047 #endif
5048 
5049  int K1 = initdata.grid.K1;
5050  int K2 = initdata.grid.K2;
5051  int dim3 = initdata.grid.dim3;
5052  int block2 = initdata.grid.block2;
5053  int block3 = initdata.grid.block3;
5054 
5055  ny = block2;
5056  if ( (thisIndex.y + 1) * block2 > K2 ) ny = K2 - thisIndex.y * block2;
5057  nz = block3;
5058  if ( (thisIndex.z+1)*block3 > dim3/2 ) nz = dim3/2 - thisIndex.z*block3;
5059 
5060 #ifdef NAMD_FFTW
5062 
5063  data = (float *) fftwf_malloc( sizeof(float) * K1*ny*nz*2);
5064  work = new float[2*K1];
5065 
5067 
5068 #ifdef NAMD_FFTW_3
5069  /* need array of sizes for the how many */
5070  int fftwFlags = simParams->FFTWPatient ? FFTW_PATIENT : simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE ;
5071  int sizeLines=ny*nz;
5072  int planLineSizes[1];
5073  planLineSizes[0]=K1;
5074  forward_plan = fftwf_plan_many_dft(1, planLineSizes, sizeLines,
5075  (fftwf_complex *) data, NULL, sizeLines, 1,
5076  (fftwf_complex *) data, NULL, sizeLines, 1,
5077  FFTW_FORWARD,
5078  fftwFlags);
5079  backward_plan = fftwf_plan_many_dft(1, planLineSizes, sizeLines,
5080  (fftwf_complex *) data, NULL, sizeLines, 1,
5081  (fftwf_complex *) data, NULL, sizeLines, 1,
5082  FFTW_BACKWARD,
5083  fftwFlags);
5084 
5085 #if CMK_SMP && USE_CKLOOP
5086  if(simParams->useCkLoop) {
5087  //How many FFT plans to be created? The grain-size issue!!.
5088  //Currently, I am choosing the min(nx, ny) to be coarse-grain
5089  numPlans = (ny<=nz?ny:nz);
5090  // limit attempted parallelism due to false sharing
5091  //if ( numPlans < CkMyNodeSize() ) numPlans = (ny>=nz?ny:nz);
5092  //if ( numPlans < CkMyNodeSize() ) numPlans = sizeLines;
5093  if ( sizeLines/numPlans < 4 ) numPlans = 1;
5094  int howmany = sizeLines/numPlans;
5095  forward_plans = new fftwf_plan[numPlans];
5096  backward_plans = new fftwf_plan[numPlans];
5097  for(int i=0; i<numPlans; i++) {
5098  int curStride = i*howmany;
5099  forward_plans[i] = fftwf_plan_many_dft(1, planLineSizes, howmany,
5100  ((fftwf_complex *)data)+curStride, NULL, sizeLines, 1,
5101  ((fftwf_complex *)data)+curStride, NULL, sizeLines, 1,
5102  FFTW_FORWARD,
5103  fftwFlags);
5104 
5105  backward_plans[i] = fftwf_plan_many_dft(1, planLineSizes, howmany,
5106  ((fftwf_complex *)data)+curStride, NULL, sizeLines, 1,
5107  ((fftwf_complex *)data)+curStride, NULL, sizeLines, 1,
5108  FFTW_BACKWARD,
5109  fftwFlags);
5110  }
5111  }else
5112 #endif
5113  {
5114  forward_plans = NULL;
5115  backward_plans = NULL;
5116  }
5117 #else
5118  forward_plan = fftw_create_plan_specific(K1, FFTW_FORWARD,
5119  ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
5120  | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
5121  ny*nz, (fftw_complex *) work, 1);
5122  backward_plan = fftw_create_plan_specific(K1, FFTW_BACKWARD,
5123  ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
5124  | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
5125  ny*nz, (fftw_complex *) work, 1);
5126 #endif
5127  CmiUnlock(ComputePmeMgr::fftw_plan_lock);
5128 #else
5129  NAMD_die("Sorry, FFTW must be compiled in to use PME.");
5130 #endif
5131 
5133  thisIndex.y*block2, thisIndex.y*block2 + ny,
5134  thisIndex.z*block3, thisIndex.z*block3 + nz);
5135 
5136 }
static CmiNodeLock fftw_plan_lock
Definition: ComputePme.C:420
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
int dim3
Definition: PmeBase.h:19
Definition: Node.h:78
void order_init(int nBlocks)
Definition: ComputePme.C:4529
int K2
Definition: PmeBase.h:18
SimParameters * simParameters
Definition: Node.h:178
int K1
Definition: PmeBase.h:18
if(ComputeNonbondedUtil::goMethod==2)
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:224
int block2
Definition: PmeBase.h:21
PmeKSpace * myKSpace
Definition: ComputePme.C:4739
int block3
Definition: PmeBase.h:21
void NAMD_die(const char *err_msg)
Definition: common.C:85
#define simParams
Definition: Output.C:127
fftw_plan backward_plan
Definition: ComputePme.C:4733
fftw_plan forward_plan
Definition: ComputePme.C:4733
#define fftwf_malloc
Definition: ComputePme.C:13
void PmeXPencil::forward_fft ( )

Definition at line 5659 of file ComputePme.C.

References CKLOOP_CTRL_PME_FORWARDFFT, PmePencil< CBase_PmeXPencil >::data, forward_plan, PmePencilInitMsgData::grid, PmePencil< CBase_PmeXPencil >::initdata, PmeGrid::K1, Node::Object(), PmeXZPencilFFT(), Node::simParameters, SimParameters::useCkLoop, PmePencil< CBase_PmeXPencil >::work, PmePencilInitMsgData::yBlocks, and PmePencilInitMsgData::zBlocks.

Referenced by node_process_trans().

5659  {
5660 #ifdef NAMD_FFTW
5661 
5662 #ifdef MANUAL_DEBUG_FFTW3
5663  dumpMatrixFloat3("fw_x_b", data, initdata.grid.K1, ny, nz, thisIndex.x, thisIndex.y, thisIndex.z);
5664 #endif
5665 
5666 #ifdef NAMD_FFTW_3
5667 #if CMK_SMP && USE_CKLOOP
5668  int useCkLoop = Node::Object()->simParameters->useCkLoop;
5669  if(useCkLoop>=CKLOOP_CTRL_PME_FORWARDFFT
5670  && CkNumPes() >= 2 * initdata.yBlocks * initdata.zBlocks) {
5671  //for(int i=0; i<numPlans; i++) fftwf_execute(forward_plans[i]);
5672  //transform the above loop
5673  CkLoop_Parallelize(PmeXZPencilFFT, 1, (void *)forward_plans, CkMyNodeSize(), 0, numPlans-1); //sync
5674  return;
5675  }
5676 #endif
5677  fftwf_execute(forward_plan);
5678 #else
5679  fftw(forward_plan, ny*nz,
5680  ((fftw_complex *) data), ny*nz, 1, (fftw_complex *) work, 1, 0);
5681 #endif
5682 #ifdef MANUAL_DEBUG_FFTW3
5683  dumpMatrixFloat3("fw_x_a", data, initdata.grid.K1, ny, nz, thisIndex.x, thisIndex.y, thisIndex.z);
5684 #endif
5685 
5686 #endif
5687 }
static Node * Object()
Definition: Node.h:86
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
SimParameters * simParameters
Definition: Node.h:178
int K1
Definition: PmeBase.h:18
static void PmeXZPencilFFT(int first, int last, void *result, int paraNum, void *param)
Definition: ComputePme.C:5183
#define CKLOOP_CTRL_PME_FORWARDFFT
Definition: SimParameters.h:94
fftw_plan forward_plan
Definition: ComputePme.C:4733
void PmeXPencil::node_process_trans ( PmeTransMsg msg)

Definition at line 5602 of file ComputePme.C.

References backward_fft(), forward_fft(), PmeTransMsg::hasData, PmePencil< CBase_PmeXPencil >::hasData, PmePencil< CBase_PmeXPencil >::imsg, PmePencil< CBase_PmeXPencil >::initdata, PmePencil< CBase_PmeXPencil >::needs_reply, pme_kspace(), recv_trans(), send_untrans(), PmeTransMsg::sourceNode, and PmePencilInitMsgData::xBlocks.

Referenced by NodePmeMgr::recvXTrans().

5603 {
5604  if(msg->hasData) hasData=1;
5605  needs_reply[msg->sourceNode] = msg->hasData;
5606  recv_trans(msg);
5607  int limsg;
5608  CmiMemoryAtomicFetchAndInc(imsg,limsg);
5609  if(limsg+1 == initdata.xBlocks)
5610  {
5611  if(hasData){
5612  forward_fft();
5613  pme_kspace();
5614  backward_fft();
5615  }
5616  send_untrans();
5617  imsg=0;
5618  CmiMemoryWriteFence();
5619  }
5620 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
void recv_trans(const PmeTransMsg *)
Definition: ComputePme.C:5622
void pme_kspace()
Definition: ComputePme.C:5689
void forward_fft()
Definition: ComputePme.C:5659
void send_untrans()
Definition: ComputePme.C:5809
int sourceNode
Definition: ComputePme.C:137
void backward_fft()
Definition: ComputePme.C:5718
void PmeXPencil::pme_kspace ( )

Definition at line 5689 of file ComputePme.C.

References CKLOOP_CTRL_PME_KSPACE, PmeKSpace::compute_energy(), PmePencil< CBase_PmeXPencil >::data, PmePencil< CBase_PmeXPencil >::evir, ComputeNonbondedUtil::ewaldcof, PmePencil< CBase_PmeXPencil >::initdata, PmePencil< CBase_PmeXPencil >::lattice, myKSpace, Node::Object(), PmePencilInitMsgData::yBlocks, and PmePencilInitMsgData::zBlocks.

Referenced by node_process_trans().

5689  {
5690 
5691  evir = 0.;
5692 
5693 #ifdef FFTCHECK
5694  return;
5695 #endif
5696 
5698 
5699  int useCkLoop = 0;
5700 #if CMK_SMP && USE_CKLOOP
5701  if ( Node::Object()->simParameters->useCkLoop >= CKLOOP_CTRL_PME_KSPACE
5702  && CkNumPes() >= 2 * initdata.yBlocks * initdata.zBlocks ) {
5703  useCkLoop = 1;
5704  }
5705 #endif
5706 
5707  int numGrids = 1;
5708  for ( int g=0; g<numGrids; ++g ) {
5709  evir[0] = myKSpace->compute_energy(data+0*g,
5710  lattice, ewaldcof, &(evir[1]), useCkLoop);
5711  }
5712 
5713 #if USE_NODE_PAR_RECEIVE
5714  CmiMemoryWriteFence();
5715 #endif
5716 }
static Node * Object()
Definition: Node.h:86
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
PmeKSpace * myKSpace
Definition: ComputePme.C:4739
double compute_energy(float q_arr[], const Lattice &lattice, double ewald, double virial[], int useCkLoop)
Definition: PmeKSpace.C:321
#define CKLOOP_CTRL_PME_KSPACE
Definition: SimParameters.h:96
double BigReal
Definition: common.h:114
void PmeXPencil::recv_trans ( const PmeTransMsg msg)

Definition at line 5622 of file ComputePme.C.

References PmeGrid::block1, PmePencil< CBase_PmeXPencil >::data, PmePencilInitMsgData::grid, PmeTransMsg::hasData, PmePencil< CBase_PmeXPencil >::imsg, PmePencil< CBase_PmeXPencil >::initdata, PmeGrid::K1, PmeTransMsg::lattice, PmePencil< CBase_PmeXPencil >::lattice, PmeTransMsg::nx, ny, nz, PmeTransMsg::qgrid, PmeTransMsg::sequence, PmePencil< CBase_PmeXPencil >::sequence, and PmeTransMsg::sourceNode.

Referenced by node_process_trans().

5622  {
5623  if ( imsg == 0 ) {
5624  lattice = msg->lattice;
5625  sequence = msg->sequence;
5626  }
5627  int block1 = initdata.grid.block1;
5628  int K1 = initdata.grid.K1;
5629  int ib = msg->sourceNode;
5630  int nx = msg->nx;
5631  if ( msg->hasData ) {
5632  const float *md = msg->qgrid;
5633  for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
5634  float *d = data + i*ny*nz*2;
5635  for ( int j=0; j<ny; ++j, d += nz*2 ) {
5636  for ( int k=0; k<nz; ++k ) {
5637 #ifdef ZEROCHECK
5638  if ( (*md) == 0. ) CkPrintf("0 in YX at %d %d %d %d %d %d %d %d %d\n",
5639  ib, thisIndex.y, thisIndex.z, i, j, k, nx, ny, nz);
5640 #endif
5641  d[2*k] = *(md++);
5642  d[2*k+1] = *(md++);
5643  }
5644  }
5645  }
5646  } else {
5647  for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
5648  float *d = data + i*ny*nz*2;
5649  for ( int j=0; j<ny; ++j, d += nz*2 ) {
5650  for ( int k=0; k<nz; ++k ) {
5651  d[2*k] = 0;
5652  d[2*k+1] = 0;
5653  }
5654  }
5655  }
5656  }
5657 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
int K1
Definition: PmeBase.h:18
int block1
Definition: PmeBase.h:21
float * qgrid
Definition: ComputePme.C:143
int sourceNode
Definition: ComputePme.C:137
Lattice lattice
Definition: ComputePme.C:140
void PmeXPencil::send_subset_untrans ( int  fromIdx,
int  toIdx 
)

Definition at line 5751 of file ComputePme.C.

References PmeGrid::block1, PmePencil< CBase_PmeXPencil >::data, PmeUntransMsg::destElem, PmePencilInitMsgData::grid, PmePencil< CBase_PmeXPencil >::initdata, PmeGrid::K1, PmePencil< CBase_PmeXPencil >::needs_reply, PmeUntransMsg::ny, ny, nz, PME_UNTRANS_PRIORITY, PmePencilInitMsgData::pmeNodeProxy, PRIORITY_SIZE, PmeUntransMsg::qgrid, PmePencil< CBase_PmeXPencil >::send_order, PmePencil< CBase_PmeXPencil >::sequence, SET_PRIORITY, PmeUntransMsg::sourceNode, PmePencilInitMsgData::xBlocks, PmePencilInitMsgData::ym, and PmePencilInitMsgData::yPencil.

Referenced by PmeXPencilSendUntrans().

5751  {
5752  int xBlocks = initdata.xBlocks;
5753  int block1 = initdata.grid.block1;
5754  int K1 = initdata.grid.K1;
5755 
5756  for(int isend=fromIdx; isend<=toIdx; isend++) {
5757  int ib = send_order[isend];
5758  if ( ! needs_reply[ib] ) {
5759  PmeAckMsg *msg = new (PRIORITY_SIZE) PmeAckMsg;
5760  CmiEnableUrgentSend(1);
5762 #if USE_NODE_PAR_RECEIVE
5763  initdata.yPencil(ib,0,thisIndex.z).recvNodeAck(msg);
5764 #else
5765  initdata.yPencil(ib,0,thisIndex.z).recvAck(msg);
5766 #endif
5767  CmiEnableUrgentSend(0);
5768  continue;
5769  }
5770  int nx = block1;
5771  if ( (ib+1)*block1 > K1 ) nx = K1 - ib*block1;
5772  PmeUntransMsg *msg = new (nx*ny*nz*2,PRIORITY_SIZE) PmeUntransMsg;
5773  msg->sourceNode = thisIndex.y;
5774  msg->ny = ny;
5775  float *md = msg->qgrid;
5776  for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
5777  float *d = data + i*ny*nz*2;
5778  for ( int j=0; j<ny; ++j, d += nz*2 ) {
5779  for ( int k=0; k<nz; ++k ) {
5780  *(md++) = d[2*k];
5781  *(md++) = d[2*k+1];
5782  }
5783  }
5784  }
5786  CmiEnableUrgentSend(1);
5787 #if USE_NODE_PAR_RECEIVE
5788  msg->destElem=CkArrayIndex3D(ib,0, thisIndex.z);
5789 #if Y_PERSIST
5790  CmiUsePersistentHandle(&untrans_handle[isend], 1);
5791 #endif
5792  initdata.pmeNodeProxy[CmiNodeOf(initdata.ym.ckLocalBranch()->procNum(0,msg->destElem))].recvYUntrans(msg);
5793 #if Y_PERSIST
5794  CmiUsePersistentHandle(NULL, 0);
5795 #endif
5796 #else
5797 #if Y_PERSIST
5798  // CmiUsePersistentHandle(&untrans_handle[isend], 1);
5799 #endif
5800  initdata.yPencil(ib,0,thisIndex.z).recvUntrans(msg);
5801 #if Y_PERSIST
5802  // CmiUsePersistentHandle(NULL, 0);
5803 #endif
5804 #endif
5805  CmiEnableUrgentSend(0);
5806  }
5807 }
float * qgrid
Definition: ComputePme.C:160
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
int K1
Definition: PmeBase.h:18
int block1
Definition: PmeBase.h:21
CProxy_PmeYPencil yPencil
Definition: ComputePme.C:221
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:224
#define PRIORITY_SIZE
Definition: Priorities.h:13
#define PME_UNTRANS_PRIORITY
Definition: Priorities.h:33
CProxy_PmePencilMap ym
Definition: ComputePme.C:226
#define SET_PRIORITY(MSG, SEQ, PRIO)
Definition: Priorities.h:18
CkArrayIndex3D destElem
Definition: ComputePme.C:161
void PmeXPencil::send_untrans ( )

Definition at line 5809 of file ComputePme.C.

References PmeGrid::block1, CKLOOP_CTRL_PME_SENDUNTRANS, PmePencil< CBase_PmeXPencil >::data, PmeUntransMsg::destElem, PmeEvirMsg::evir, PmePencil< CBase_PmeXPencil >::evir, PmePencilInitMsgData::grid, PmePencil< CBase_PmeXPencil >::initdata, PmeGrid::K1, PmePencil< CBase_PmeXPencil >::needs_reply, PmeUntransMsg::ny, ny, nz, Node::Object(), PME_UNGRID_PRIORITY, PME_UNTRANS_PRIORITY, PmePencilInitMsgData::pmeNodeProxy, PmePencilInitMsgData::pmeProxy, PmeXPencilSendUntrans(), PRIORITY_SIZE, PmeUntransMsg::qgrid, recipEvirPe, PmePencil< CBase_PmeXPencil >::send_order, PmePencil< CBase_PmeXPencil >::sequence, SET_PRIORITY, Node::simParameters, PmeUntransMsg::sourceNode, SimParameters::useCkLoop, PmePencilInitMsgData::xBlocks, PmePencilInitMsgData::yBlocks, PmePencilInitMsgData::ym, PmePencilInitMsgData::yPencil, and PmePencilInitMsgData::zBlocks.

Referenced by node_process_trans().

5809  {
5810 
5811  { // send energy and virial
5812  int numGrids = 1;
5813  PmeEvirMsg *newmsg = new (numGrids, PRIORITY_SIZE) PmeEvirMsg;
5814  newmsg->evir[0] = evir;
5816  CmiEnableUrgentSend(1);
5817  initdata.pmeProxy[recipEvirPe].recvRecipEvir(newmsg);
5818  CmiEnableUrgentSend(0);
5819  }
5820 
5821 #if USE_PERSISTENT
5822  if (untrans_handle == NULL) setup_persistent();
5823 #endif
5824 #if CMK_SMP && USE_CKLOOP
5825  int useCkLoop = Node::Object()->simParameters->useCkLoop;
5826  if(useCkLoop>=CKLOOP_CTRL_PME_SENDUNTRANS
5827  && CkNumPes() >= 2 * initdata.yBlocks * initdata.zBlocks) {
5828  int xBlocks = initdata.xBlocks;
5829 
5830 #if USE_NODE_PAR_RECEIVE
5831  //CkLoop_Parallelize(PmeXPencilSendUntrans, 1, (void *)this, CkMyNodeSize(), 0, xBlocks-1, 1); //has to sync
5832  CkLoop_Parallelize(PmeXPencilSendUntrans, 1, (void *)this, xBlocks, 0, xBlocks-1, 1); //has to sync
5833 #else
5834  //CkLoop_Parallelize(PmeXPencilSendUntrans, 1, (void *)this, CkMyNodeSize(), 0, xBlocks-1, 0); //not sync
5835  CkLoop_Parallelize(PmeXPencilSendUntrans, 1, (void *)this, xBlocks, 0, xBlocks-1, 0); //not sync
5836 #endif
5837  return;
5838  }
5839 #endif
5840  int xBlocks = initdata.xBlocks;
5841  int block1 = initdata.grid.block1;
5842  int K1 = initdata.grid.K1;
5843  for ( int isend=0; isend<xBlocks; ++isend ) {
5844  int ib = send_order[isend];
5845  if ( ! needs_reply[ib] ) {
5846  PmeAckMsg *msg = new (PRIORITY_SIZE) PmeAckMsg;
5847  CmiEnableUrgentSend(1);
5849 #if USE_NODE_PAR_RECEIVE
5850  initdata.yPencil(ib,0,thisIndex.z).recvNodeAck(msg);
5851 #else
5852  initdata.yPencil(ib,0,thisIndex.z).recvAck(msg);
5853 #endif
5854  CmiEnableUrgentSend(0);
5855  continue;
5856  }
5857  int nx = block1;
5858  if ( (ib+1)*block1 > K1 ) nx = K1 - ib*block1;
5859  PmeUntransMsg *msg = new (nx*ny*nz*2,PRIORITY_SIZE) PmeUntransMsg;
5860  msg->sourceNode = thisIndex.y;
5861  msg->ny = ny;
5862  float *md = msg->qgrid;
5863  for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
5864  float *d = data + i*ny*nz*2;
5865  for ( int j=0; j<ny; ++j, d += nz*2 ) {
5866  for ( int k=0; k<nz; ++k ) {
5867  *(md++) = d[2*k];
5868  *(md++) = d[2*k+1];
5869  }
5870  }
5871  }
5873 
5874  CmiEnableUrgentSend(1);
5875 #if USE_NODE_PAR_RECEIVE
5876  msg->destElem=CkArrayIndex3D(ib,0, thisIndex.z);
5877 #if Y_PERSIST
5878  CmiUsePersistentHandle(&untrans_handle[isend], 1);
5879 #endif
5880  initdata.pmeNodeProxy[CmiNodeOf(initdata.ym.ckLocalBranch()->procNum(0,msg->destElem))].recvYUntrans(msg);
5881 #if Y_PERSIST
5882  CmiUsePersistentHandle(NULL, 0);
5883 #endif
5884 #else
5885 #if Y_PERSIST
5886  CmiUsePersistentHandle(&untrans_handle[isend], 1);
5887 #endif
5888  initdata.yPencil(ib,0,thisIndex.z).recvUntrans(msg);
5889 #if Y_PERSIST
5890  CmiUsePersistentHandle(NULL, 0);
5891 #endif
5892 #endif
5893  CmiEnableUrgentSend(0);
5894  }
5895 }
static Node * Object()
Definition: Node.h:86
float * qgrid
Definition: ComputePme.C:160
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
#define PME_UNGRID_PRIORITY
Definition: Priorities.h:74
SimParameters * simParameters
Definition: Node.h:178
int K1
Definition: PmeBase.h:18
int block1
Definition: PmeBase.h:21
CProxy_PmeYPencil yPencil
Definition: ComputePme.C:221
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:224
PmeReduction * evir
Definition: ComputePme.C:173
#define CKLOOP_CTRL_PME_SENDUNTRANS
Definition: SimParameters.h:98
#define PRIORITY_SIZE
Definition: Priorities.h:13
static void PmeXPencilSendUntrans(int first, int last, void *result, int paraNum, void *param)
Definition: ComputePme.C:5746
int recipEvirPe
Definition: ComputePme.C:4737
#define PME_UNTRANS_PRIORITY
Definition: Priorities.h:33
CProxy_PmePencilMap ym
Definition: ComputePme.C:226
#define SET_PRIORITY(MSG, SEQ, PRIO)
Definition: Priorities.h:18
CkArrayIndex3D destElem
Definition: ComputePme.C:161

Member Data Documentation

fftw_plan PmeXPencil::backward_plan

Definition at line 4733 of file ComputePme.C.

Referenced by backward_fft(), and fft_init().

fftw_plan PmeXPencil::forward_plan

Definition at line 4733 of file ComputePme.C.

Referenced by fft_init(), and forward_fft().

PmeKSpace* PmeXPencil::myKSpace

Definition at line 4739 of file ComputePme.C.

Referenced by fft_init(), pme_kspace(), and PmeXPencil().

int PmeXPencil::ny

Definition at line 4736 of file ComputePme.C.

Referenced by recv_trans(), send_subset_untrans(), and send_untrans().

int PmeXPencil::nz

Definition at line 4736 of file ComputePme.C.

Referenced by fft_init(), recv_trans(), send_subset_untrans(), and send_untrans().

int PmeXPencil::recipEvirPe

Definition at line 4737 of file ComputePme.C.

Referenced by evir_init(), PmeXPencil(), and send_untrans().


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