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 4641 of file ComputePme.C.

Constructor & Destructor Documentation

PmeYPencil_SDAG_CODE PmeYPencil::PmeYPencil ( )
inline

Definition at line 4644 of file ComputePme.C.

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

4644 { __sdag_init(); setMigratable(false); imsg=imsgb=0;}
PmeYPencil::PmeYPencil ( CkMigrateMessage *  )
inline

Definition at line 4645 of file ComputePme.C.

4645 { __sdag_init(); }

Member Function Documentation

void PmeYPencil::backward_fft ( )

Definition at line 5938 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().

5938  {
5939 #ifdef NAMD_FFTW
5940 #ifdef MANUAL_DEBUG_FFTW3
5941  dumpMatrixFloat3("bw_y_b", data, nx, initdata.grid.K2, nz, thisIndex.x, thisIndex.y, thisIndex.z);
5942 #endif
5943 
5944 #ifdef NAMD_FFTW_3
5945 #if CMK_SMP && USE_CKLOOP
5946  int useCkLoop = Node::Object()->simParameters->useCkLoop;
5947  if(useCkLoop>=CKLOOP_CTRL_PME_BACKWARDFFT
5948  && CkNumPes() >= 2 * initdata.xBlocks * initdata.zBlocks) {
5949  CkLoop_Parallelize(PmeYPencilBackwardFFT, 1, (void *)this, CkMyNodeSize(), 0, nx-1); //sync
5950  return;
5951  }
5952 #endif
5953  //the above is a transformation of the following loop using CkLoop
5954  for ( int i=0; i<nx; ++i ) {
5955 #if CMK_BLUEGENEL
5956  CmiNetworkProgress();
5957 #endif
5958  fftwf_execute_dft(backward_plan,
5959  ((fftwf_complex *) data) + i * nz * initdata.grid.K2,
5960  ((fftwf_complex *) data) + i * nz * initdata.grid.K2);
5961  }
5962 #else
5963  for ( int i=0; i<nx; ++i ) {
5964 #if CMK_BLUEGENEL
5965  CmiNetworkProgress();
5966 #endif
5967  fftw(backward_plan, nz,
5968  ((fftw_complex *) data) + i * nz * initdata.grid.K2,
5969  nz, 1, (fftw_complex *) work, 1, 0);
5970  }
5971 #endif
5972 
5973 #ifdef MANUAL_DEBUG_FFTW3
5974  dumpMatrixFloat3("bw_y_a", data, nx, initdata.grid.K2, nz, thisIndex.x, thisIndex.y, thisIndex.z);
5975 #endif
5976 
5977 #endif
5978 }
static Node * Object()
Definition: Node.h:86
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
int K2
Definition: PmeBase.h:18
SimParameters * simParameters
Definition: Node.h:178
static void PmeYPencilBackwardFFT(int first, int last, void *result, int paraNum, void *param)
Definition: ComputePme.C:5921
#define CKLOOP_CTRL_PME_BACKWARDFFT
Definition: SimParameters.h:97
void PmeYPencil::backward_subset_fft ( int  fromIdx,
int  toIdx 
)

Definition at line 5926 of file ComputePme.C.

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

Referenced by PmeYPencilBackwardFFT().

5926  {
5927 #ifdef NAMD_FFTW
5928 #ifdef NAMD_FFTW_3
5929  for(int i=fromIdx; i<=toIdx; i++){
5930  fftwf_execute_dft(backward_plan,
5931  ((fftwf_complex *) data) + i * nz * initdata.grid.K2,
5932  ((fftwf_complex *) data) + i * nz * initdata.grid.K2);
5933  }
5934 #endif
5935 #endif
5936 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
int K2
Definition: PmeBase.h:18
void PmeYPencil::fft_init ( )

Definition at line 4871 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, SimParameters::FFTWEstimate, fftwf_malloc, SimParameters::FFTWPatient, PmePencilInitMsgData::grid, if(), PmePencil< CBase_PmeYPencil >::initdata, PmeGrid::K1, PmeGrid::K2, NAMD_die(), PmePencil< CBase_PmeYPencil >::order_init(), PmePencilInitMsgData::pmeNodeProxy, Node::simParameters, PmePencil< CBase_PmeYPencil >::work, and PmePencilInitMsgData::yBlocks.

4871  {
4872  CProxy_Node nd(CkpvAccess(BOCclass_group).node);
4873  Node *node = nd.ckLocalBranch();
4875 
4876 #if USE_NODE_PAR_RECEIVE
4877  ((NodePmeMgr *)CkLocalNodeBranch(initdata.pmeNodeProxy))->registerYPencil(thisIndex,this);
4878 #endif
4879 
4880  int K1 = initdata.grid.K1;
4881  int K2 = initdata.grid.K2;
4882  int dim2 = initdata.grid.dim2;
4883  int dim3 = initdata.grid.dim3;
4884  int block1 = initdata.grid.block1;
4885  int block3 = initdata.grid.block3;
4886 
4887  nx = block1;
4888  if ( (thisIndex.x + 1) * block1 > K1 ) nx = K1 - thisIndex.x * block1;
4889  nz = block3;
4890  if ( (thisIndex.z+1)*block3 > dim3/2 ) nz = dim3/2 - thisIndex.z*block3;
4891 
4892 #ifdef NAMD_FFTW
4894 
4895  data = (float *) fftwf_malloc( sizeof(float) * nx*dim2*nz*2);
4896  work = new float[2*K2];
4897 
4899 
4900 #ifdef NAMD_FFTW_3
4901  /* need array of sizes for the dimensions */
4902  /* ideally this should be implementable as a single multidimensional
4903  * plan, but that has proven tricky to implement, so we maintain the
4904  * loop of 1d plan executions. */
4905  int sizeLines=nz;
4906  int planLineSizes[1];
4907  planLineSizes[0]=K2;
4908  int fftwFlags = simParams->FFTWPatient ? FFTW_PATIENT : simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE ;
4909  forward_plan = fftwf_plan_many_dft(1, planLineSizes, sizeLines,
4910  (fftwf_complex *) data, NULL, sizeLines, 1,
4911  (fftwf_complex *) data, NULL, sizeLines, 1,
4912  FFTW_FORWARD,
4913  fftwFlags);
4914  backward_plan = fftwf_plan_many_dft(1, planLineSizes, sizeLines,
4915  (fftwf_complex *) data, NULL, sizeLines, 1,
4916  (fftwf_complex *) data, NULL, sizeLines, 1,
4917  FFTW_BACKWARD,
4918  fftwFlags);
4919  CkAssert(forward_plan != NULL);
4920  CkAssert(backward_plan != NULL);
4921 #else
4922  forward_plan = fftw_create_plan_specific(K2, FFTW_FORWARD,
4923  ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
4924  | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
4925  nz, (fftw_complex *) work, 1);
4926  backward_plan = fftw_create_plan_specific(K2, FFTW_BACKWARD,
4927  ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
4928  | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
4929  nz, (fftw_complex *) work, 1);
4930 #endif
4931  CmiUnlock(ComputePmeMgr::fftw_plan_lock);
4932 #else
4933  NAMD_die("Sorry, FFTW must be compiled in to use PME.");
4934 #endif
4935 
4936 #if USE_NODE_PAR_RECEIVE
4937  evir = 0;
4938  CmiMemoryWriteFence();
4939 #endif
4940 }
int dim2
Definition: PmeBase.h:19
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
int block1
Definition: PmeBase.h:21
if(ComputeNonbondedUtil::goMethod==2)
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:224
int block3
Definition: PmeBase.h:21
void NAMD_die(const char *err_msg)
Definition: common.C:85
#define simParams
Definition: Output.C:127
#define fftwf_malloc
Definition: ComputePme.C:13
void PmeYPencil::forward_fft ( )

Definition at line 5428 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().

5428  {
5429  evir = 0.;
5430 #ifdef NAMD_FFTW
5431 #ifdef MANUAL_DEBUG_FFTW3
5432  dumpMatrixFloat3("fw_y_b", data, nx, initdata.grid.K2, nz, thisIndex.x, thisIndex.y, thisIndex.z);
5433 #endif
5434 
5435 #ifdef NAMD_FFTW_3
5436 #if CMK_SMP && USE_CKLOOP
5437  int useCkLoop = Node::Object()->simParameters->useCkLoop;
5438  if(useCkLoop>=CKLOOP_CTRL_PME_FORWARDFFT
5439  && CkNumPes() >= 2 * initdata.xBlocks * initdata.zBlocks) {
5440  CkLoop_Parallelize(PmeYPencilForwardFFT, 1, (void *)this, CkMyNodeSize(), 0, nx-1); //sync
5441  return;
5442  }
5443 #endif
5444  //the above is a transformation of the following loop using CkLoop
5445  for ( int i=0; i<nx; ++i ) {
5446  fftwf_execute_dft(forward_plan, ((fftwf_complex *) data) + i
5447  * nz * initdata.grid.K2,
5448  ((fftwf_complex *) data) + i * nz * initdata.grid.K2);
5449  }
5450 #else
5451  for ( int i=0; i<nx; ++i ) {
5452  fftw(forward_plan, nz,
5453  ((fftw_complex *) data) + i * nz * initdata.grid.K2,
5454  nz, 1, (fftw_complex *) work, 1, 0);
5455  }
5456 #endif
5457 #ifdef MANUAL_DEBUG_FFTW3
5458  dumpMatrixFloat3("fw_y_a", data, nx, initdata.grid.dim2, nz, thisIndex.x, thisIndex.y, thisIndex.z);
5459 #endif
5460 
5461 #endif
5462 }
static Node * Object()
Definition: Node.h:86
int dim2
Definition: PmeBase.h:19
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
int K2
Definition: PmeBase.h:18
SimParameters * simParameters
Definition: Node.h:178
#define CKLOOP_CTRL_PME_FORWARDFFT
Definition: SimParameters.h:94
static void PmeYPencilForwardFFT(int first, int last, void *result, int paraNum, void *param)
Definition: ComputePme.C:5412
void PmeYPencil::forward_subset_fft ( int  fromIdx,
int  toIdx 
)

Definition at line 5416 of file ComputePme.C.

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

Referenced by PmeYPencilForwardFFT().

5416  {
5417 #ifdef NAMD_FFTW
5418 #ifdef NAMD_FFTW_3
5419  for(int i=fromIdx; i<=toIdx; i++){
5420  fftwf_execute_dft(forward_plan, ((fftwf_complex *) data) + i
5421  * nz * initdata.grid.K2,
5422  ((fftwf_complex *) data) + i * nz * initdata.grid.K2);
5423  }
5424 #endif
5425 #endif
5426 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
int K2
Definition: PmeBase.h:18
void PmeYPencil::node_process_trans ( PmeTransMsg msg)

Definition at line 4942 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().

4943 {
4944  if ( msg->hasData ) hasData = 1;
4945  needs_reply[msg->sourceNode] = msg->hasData;
4946  recv_trans(msg);
4947  int limsg;
4948  CmiMemoryAtomicFetchAndInc(imsg,limsg);
4949  if(limsg+1 == initdata.yBlocks)
4950  {
4951  if ( hasData ) {
4952  forward_fft();
4953  }
4954  send_trans();
4955  imsg=0;
4956  CmiMemoryWriteFence();
4957  }
4958 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
void recv_trans(const PmeTransMsg *)
Definition: ComputePme.C:5375
void send_trans()
Definition: ComputePme.C:5526
int sourceNode
Definition: ComputePme.C:137
void forward_fft()
Definition: ComputePme.C:5428
void PmeYPencil::node_process_untrans ( PmeUntransMsg msg)

Definition at line 4965 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().

4966 {
4967  if ( msg ) {
4968  if ( ! hasData ) NAMD_bug("PmeYPencil::node_process_untrans non-null msg but not hasData");
4969  recv_untrans(msg);
4970  } else if ( hasData ) NAMD_bug("PmeYPencil::node_process_untrans hasData but null msg");
4971  int limsg;
4972  CmiMemoryAtomicFetchAndInc(imsgb,limsg);
4973  if(limsg+1 == initdata.yBlocks)
4974  {
4975  if ( hasData ) {
4976  backward_fft();
4977  }
4978  hasData=0;
4979  imsgb=0;
4980  CmiMemoryWriteFence();
4981  send_untrans();
4982  }
4983 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
void NAMD_bug(const char *err_msg)
Definition: common.C:129
void recv_untrans(const PmeUntransMsg *)
Definition: ComputePme.C:5897
void backward_fft()
Definition: ComputePme.C:5938
void send_untrans()
Definition: ComputePme.C:6044
void PmeYPencil::recv_trans ( const PmeTransMsg msg)

Definition at line 5375 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().

5375  {
5376  if ( imsg == 0 ) {
5377  lattice = msg->lattice;
5378  sequence = msg->sequence;
5379  }
5380  int block2 = initdata.grid.block2;
5381  int K2 = initdata.grid.K2;
5382  int jb = msg->sourceNode;
5383  int ny = msg->nx;
5384  if ( msg->hasData ) {
5385  const float *md = msg->qgrid;
5386  float *d = data;
5387  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
5388  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
5389  for ( int k=0; k<nz; ++k ) {
5390 #ifdef ZEROCHECK
5391  if ( (*md) == 0. ) CkPrintf("0 in ZY at %d %d %d %d %d %d %d %d %d\n",
5392  thisIndex.x, jb, thisIndex.z, i, j, k, nx, ny, nz);
5393 #endif
5394  d[2*(j*nz+k)] = *(md++);
5395  d[2*(j*nz+k)+1] = *(md++);
5396  }
5397  }
5398  }
5399  } else {
5400  float *d = data;
5401  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
5402  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
5403  for ( int k=0; k<nz; ++k ) {
5404  d[2*(j*nz+k)] = 0;
5405  d[2*(j*nz+k)+1] = 0;
5406  }
5407  }
5408  }
5409  }
5410 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
int K2
Definition: PmeBase.h:18
float * qgrid
Definition: ComputePme.C:143
int block2
Definition: PmeBase.h:21
int sourceNode
Definition: ComputePme.C:137
Lattice lattice
Definition: ComputePme.C:140
void PmeYPencil::recv_untrans ( const PmeUntransMsg msg)

Definition at line 5897 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().

5897  {
5898  int block2 = initdata.grid.block2;
5899  int K2 = initdata.grid.K2;
5900  int jb = msg->sourceNode;
5901  int ny = msg->ny;
5902  const float *md = msg->qgrid;
5903  float *d = data;
5904  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
5905 #if CMK_BLUEGENEL
5906  CmiNetworkProgress();
5907 #endif
5908  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
5909  for ( int k=0; k<nz; ++k ) {
5910 #ifdef ZEROCHECK
5911  if ( (*md) == 0. ) CkPrintf("0 in XY at %d %d %d %d %d %d %d %d %d\n",
5912  thisIndex.x, jb, thisIndex.z, i, j, k, nx, ny, nz);
5913 #endif
5914  d[2*(j*nz+k)] = *(md++);
5915  d[2*(j*nz+k)+1] = *(md++);
5916  }
5917  }
5918  }
5919 }
float * qgrid
Definition: ComputePme.C:160
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
int K2
Definition: PmeBase.h:18
int block2
Definition: PmeBase.h:21
void PmeYPencil::recvNodeAck ( PmeAckMsg msg)

Definition at line 4960 of file ComputePme.C.

References node_process_untrans().

4960  {
4961  delete msg;
4963 }
void node_process_untrans(PmeUntransMsg *)
Definition: ComputePme.C:4965
void PmeYPencil::send_subset_trans ( int  fromIdx,
int  toIdx 
)

Definition at line 5469 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().

5469  {
5470  int yBlocks = initdata.yBlocks;
5471  int block2 = initdata.grid.block2;
5472  int K2 = initdata.grid.K2;
5473  for ( int isend=fromIdx; isend<=toIdx; ++isend ) {
5474  int jb = send_order[isend];
5475  int ny = block2;
5476  if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2;
5477  int hd = ( hasData ? 1 : 0 );
5478  PmeTransMsg *msg = new (hd*nx*ny*nz*2,PRIORITY_SIZE) PmeTransMsg;
5479  msg->lattice = lattice;
5480  msg->sourceNode = thisIndex.x;
5481  msg->hasData = hasData;
5482  msg->nx = nx;
5483  if ( hasData ) {
5484  float *md = msg->qgrid;
5485  const float *d = data;
5486  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
5487  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
5488  for ( int k=0; k<nz; ++k ) {
5489  *(md++) = d[2*(j*nz+k)];
5490  *(md++) = d[2*(j*nz+k)+1];
5491  #ifdef ZEROCHECK
5492  if ( *(md-2) == 0. ) CkPrintf("send 0 in YX at %d %d %d %d %d %d %d %d %d\n",
5493  thisIndex.x, jb, thisIndex.z, i, j, k, nx, ny, nz);
5494  #endif
5495  }
5496  }
5497  }
5498  if ( md != msg->qgrid + nx*ny*nz*2 ) CkPrintf("error in YX at %d %d %d\n",
5499  thisIndex.x, jb, thisIndex.z);
5500  }
5501  msg->sequence = sequence;
5503  CmiEnableUrgentSend(1);
5504 #if USE_NODE_PAR_RECEIVE
5505  msg->destElem=CkArrayIndex3D(0,jb,thisIndex.z);
5506 #if X_PERSIST
5507  CmiUsePersistentHandle(&trans_handle[isend], 1);
5508 #endif
5509  initdata.pmeNodeProxy[CmiNodeOf(initdata.xm.ckLocalBranch()->procNum(0,msg->destElem))].recvXTrans(msg);
5510 #if X_PERSIST
5511  CmiUsePersistentHandle(NULL, 0);
5512 #endif
5513 #else
5514 #if X_PERSIST
5515  CmiUsePersistentHandle(&trans_handle[isend], 1);
5516 #endif
5517  initdata.xPencil(0,jb,thisIndex.z).recvTrans(msg);
5518 #if X_PERSIST
5519  CmiUsePersistentHandle(NULL, 0);
5520 #endif
5521 #endif
5522  CmiEnableUrgentSend(0);
5523  }
5524 }
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
#define PME_TRANS2_PRIORITY
Definition: Priorities.h:32
int K2
Definition: PmeBase.h:18
CProxy_PmePencilMap xm
Definition: ComputePme.C:225
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:224
float * qgrid
Definition: ComputePme.C:143
int block2
Definition: PmeBase.h:21
#define PRIORITY_SIZE
Definition: Priorities.h:13
int sourceNode
Definition: ComputePme.C:137
CkArrayIndex3D destElem
Definition: ComputePme.C:144
Lattice lattice
Definition: ComputePme.C:140
#define SET_PRIORITY(MSG, SEQ, PRIO)
Definition: Priorities.h:18
CProxy_PmeXPencil xPencil
Definition: ComputePme.C:220
void PmeYPencil::send_subset_untrans ( int  fromIdx,
int  toIdx 
)

Definition at line 5985 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().

5985  {
5986  int yBlocks = initdata.yBlocks;
5987  int block2 = initdata.grid.block2;
5988  int K2 = initdata.grid.K2;
5989 
5990  for(int isend=fromIdx; isend<=toIdx; isend++) {
5991  int jb = send_order[isend];
5992  if ( ! needs_reply[jb] ) {
5993  PmeAckMsg *msg = new (PRIORITY_SIZE) PmeAckMsg;
5994  CmiEnableUrgentSend(1);
5996 #if USE_NODE_PAR_RECEIVE
5997  initdata.zPencil(thisIndex.x,jb,0).recvNodeAck(msg);
5998 #else
5999  initdata.zPencil(thisIndex.x,jb,0).recvAck(msg);
6000 #endif
6001  CmiEnableUrgentSend(0);
6002  continue;
6003  }
6004  int ny = block2;
6005  if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2;
6006  PmeUntransMsg *msg = new (nx*ny*nz*2,PRIORITY_SIZE) PmeUntransMsg;
6007  msg->sourceNode = thisIndex.z;
6008  msg->ny = nz;
6009  float *md = msg->qgrid;
6010  const float *d = data;
6011  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
6012  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
6013  for ( int k=0; k<nz; ++k ) {
6014  *(md++) = d[2*(j*nz+k)];
6015  *(md++) = d[2*(j*nz+k)+1];
6016  }
6017  }
6018  }
6020  CmiEnableUrgentSend(1);
6021 #if USE_NODE_PAR_RECEIVE
6022  msg->destElem=CkArrayIndex3D( thisIndex.x, jb, 0);
6023  // 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)));
6024 #if Z_PERSIST
6025  CmiUsePersistentHandle(&untrans_handle[isend], 1);
6026 #endif
6027  initdata.pmeNodeProxy[CmiNodeOf(initdata.zm.ckLocalBranch()->procNum(0,msg->destElem))].recvZUntrans(msg);
6028 #if Z_PERSIST
6029  CmiUsePersistentHandle(NULL, 0);
6030 #endif
6031 #else
6032 #if Z_PERSIST
6033  CmiUsePersistentHandle(&untrans_handle[isend], 1);
6034 #endif
6035  initdata.zPencil(thisIndex.x,jb,0).recvUntrans(msg);
6036 #if Z_PERSIST
6037  CmiUsePersistentHandle(NULL, 0);
6038 #endif
6039 #endif
6040  CmiEnableUrgentSend(0);
6041  }
6042 }
float * qgrid
Definition: ComputePme.C:160
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
int K2
Definition: PmeBase.h:18
CProxy_PmeZPencil zPencil
Definition: ComputePme.C:222
CProxy_PmePencilMap zm
Definition: ComputePme.C:227
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:224
int block2
Definition: PmeBase.h:21
#define PRIORITY_SIZE
Definition: Priorities.h:13
#define SET_PRIORITY(MSG, SEQ, PRIO)
Definition: Priorities.h:18
CkArrayIndex3D destElem
Definition: ComputePme.C:161
#define PME_UNTRANS2_PRIORITY
Definition: Priorities.h:34
void PmeYPencil::send_trans ( )

Definition at line 5526 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().

5526  {
5527 #if USE_PERSISTENT
5528  if (trans_handle == NULL) setup_persistent();
5529 #endif
5530 #if CMK_SMP && USE_CKLOOP
5531  int useCkLoop = Node::Object()->simParameters->useCkLoop;
5532  if(useCkLoop>=CKLOOP_CTRL_PME_SENDTRANS
5533  && CkNumPes() >= 2 * initdata.xBlocks * initdata.zBlocks) {
5540  //send_subset_trans(0, initdata.yBlocks-1);
5541  CkLoop_Parallelize(PmeYPencilSendTrans, 1, (void *)this, CkMyNodeSize(), 0, initdata.yBlocks-1, 1); //not sync
5542  return;
5543  }
5544 #endif
5545  int yBlocks = initdata.yBlocks;
5546  int block2 = initdata.grid.block2;
5547  int K2 = initdata.grid.K2;
5548  for ( int isend=0; isend<yBlocks; ++isend ) {
5549  int jb = send_order[isend];
5550  int ny = block2;
5551  if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2;
5552  int hd = ( hasData ? 1 : 0 );
5553  PmeTransMsg *msg = new (hd*nx*ny*nz*2,PRIORITY_SIZE) PmeTransMsg;
5554  msg->lattice = lattice;
5555  msg->sourceNode = thisIndex.x;
5556  msg->hasData = hasData;
5557  msg->nx = nx;
5558  if ( hasData ) {
5559  float *md = msg->qgrid;
5560  const float *d = data;
5561  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
5562  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
5563  for ( int k=0; k<nz; ++k ) {
5564  *(md++) = d[2*(j*nz+k)];
5565  *(md++) = d[2*(j*nz+k)+1];
5566 #ifdef ZEROCHECK
5567  if ( *(md-2) == 0. ) CkPrintf("send 0 in YX at %d %d %d %d %d %d %d %d %d\n",
5568  thisIndex.x, jb, thisIndex.z, i, j, k, nx, ny, nz);
5569 #endif
5570  }
5571  }
5572  }
5573  if ( md != msg->qgrid + nx*ny*nz*2 ) CkPrintf("error in YX at %d %d %d\n",
5574  thisIndex.x, jb, thisIndex.z);
5575  }
5576  msg->sequence = sequence;
5578  CmiEnableUrgentSend(1);
5579 #if USE_NODE_PAR_RECEIVE
5580  msg->destElem=CkArrayIndex3D(0,jb,thisIndex.z);
5581 #if X_PERSIST
5582  CmiUsePersistentHandle(&trans_handle[isend], 1);
5583 #endif
5584  initdata.pmeNodeProxy[CmiNodeOf(initdata.xm.ckLocalBranch()->procNum(0,msg->destElem))].recvXTrans(msg);
5585 #if X_PERSIST
5586  CmiUsePersistentHandle(NULL, 0);
5587 #endif
5588 #else
5589 #if X_PERSIST
5590  CmiUsePersistentHandle(&trans_handle[isend], 1);
5591 #endif
5592  initdata.xPencil(0,jb,thisIndex.z).recvTrans(msg);
5593 #if X_PERSIST
5594  CmiUsePersistentHandle(NULL, 0);
5595 #endif
5596 
5597 #endif
5598  CmiEnableUrgentSend(0);
5599  }
5600 }
static Node * Object()
Definition: Node.h:86
static void PmeYPencilSendTrans(int first, int last, void *result, int paraNum, void *param)
Definition: ComputePme.C:5464
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
#define PME_TRANS2_PRIORITY
Definition: Priorities.h:32
int K2
Definition: PmeBase.h:18
SimParameters * simParameters
Definition: Node.h:178
CProxy_PmePencilMap xm
Definition: ComputePme.C:225
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:224
float * qgrid
Definition: ComputePme.C:143
int block2
Definition: PmeBase.h:21
#define PRIORITY_SIZE
Definition: Priorities.h:13
int sourceNode
Definition: ComputePme.C:137
#define CKLOOP_CTRL_PME_SENDTRANS
Definition: SimParameters.h:95
CkArrayIndex3D destElem
Definition: ComputePme.C:144
Lattice lattice
Definition: ComputePme.C:140
#define SET_PRIORITY(MSG, SEQ, PRIO)
Definition: Priorities.h:18
CProxy_PmeXPencil xPencil
Definition: ComputePme.C:220
void PmeYPencil::send_untrans ( )

Definition at line 6044 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().

6044  {
6045 #if USE_PERSISTENT
6046  if (untrans_handle == NULL) setup_persistent();
6047 #endif
6048 #if CMK_SMP && USE_CKLOOP
6049  int useCkLoop = Node::Object()->simParameters->useCkLoop;
6050  if(useCkLoop>=CKLOOP_CTRL_PME_SENDUNTRANS
6051  && CkNumPes() >= 2 * initdata.xBlocks * initdata.zBlocks) {
6052  int yBlocks = initdata.yBlocks;
6053 
6054 #if USE_NODE_PAR_RECEIVE
6055  //CkLoop_Parallelize(PmeYPencilSendUntrans, 1, (void *)this, CkMyNodeSize(), 0, yBlocks-1, 1); //sync
6056  CkLoop_Parallelize(PmeYPencilSendUntrans, 1, (void *)this, yBlocks, 0, yBlocks-1, 1);
6057 #else
6058  //CkLoop_Parallelize(PmeYPencilSendUntrans, 1, (void *)this, CkMyNodeSize(), 0, yBlocks-1, 0); //not sync
6059  CkLoop_Parallelize(PmeYPencilSendUntrans, 1, (void *)this, yBlocks, 0, yBlocks-1, 0); //not sync
6060 #endif
6061  return;
6062  }
6063 #endif
6064  int yBlocks = initdata.yBlocks;
6065  int block2 = initdata.grid.block2;
6066  int K2 = initdata.grid.K2;
6067  for ( int isend=0; isend<yBlocks; ++isend ) {
6068  int jb = send_order[isend];
6069  if ( ! needs_reply[jb] ) {
6070  PmeAckMsg *msg = new (PRIORITY_SIZE) PmeAckMsg;
6071  CmiEnableUrgentSend(1);
6073 #if USE_NODE_PAR_RECEIVE
6074  initdata.zPencil(thisIndex.x,jb,0).recvNodeAck(msg);
6075 #else
6076  initdata.zPencil(thisIndex.x,jb,0).recvAck(msg);
6077 #endif
6078  CmiEnableUrgentSend(0);
6079  continue;
6080  }
6081  int ny = block2;
6082  if ( (jb+1)*block2 > K2 ) ny = K2 - jb*block2;
6083  PmeUntransMsg *msg = new (nx*ny*nz*2,PRIORITY_SIZE) PmeUntransMsg;
6084  msg->sourceNode = thisIndex.z;
6085  msg->ny = nz;
6086  float *md = msg->qgrid;
6087  const float *d = data;
6088  for ( int i=0; i<nx; ++i, d += K2*nz*2 ) {
6089  for ( int j=jb*block2; j<(jb*block2+ny); ++j ) {
6090  for ( int k=0; k<nz; ++k ) {
6091  *(md++) = d[2*(j*nz+k)];
6092  *(md++) = d[2*(j*nz+k)+1];
6093  }
6094  }
6095  }
6097 
6098  CmiEnableUrgentSend(1);
6099 #if USE_NODE_PAR_RECEIVE
6100  msg->destElem=CkArrayIndex3D( thisIndex.x, jb, 0);
6101  // 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)));
6102 #if Z_PERSIST
6103  CmiUsePersistentHandle(&untrans_handle[isend], 1);
6104 #endif
6105  initdata.pmeNodeProxy[CmiNodeOf(initdata.zm.ckLocalBranch()->procNum(0,msg->destElem))].recvZUntrans(msg);
6106 #if Z_PERSIST
6107  CmiUsePersistentHandle(NULL, 0);
6108 #endif
6109 #else
6110 #if Z_PERSIST
6111  CmiUsePersistentHandle(&untrans_handle[isend], 1);
6112 #endif
6113  initdata.zPencil(thisIndex.x,jb,0).recvUntrans(msg);
6114 #if Z_PERSIST
6115  CmiUsePersistentHandle(NULL, 0);
6116 #endif
6117 #endif
6118  CmiEnableUrgentSend(0);
6119  }
6120 
6121 #if USE_NODE_PAR_RECEIVE
6122  evir = 0.;
6123  CmiMemoryWriteFence();
6124 #endif
6125 }
static Node * Object()
Definition: Node.h:86
float * qgrid
Definition: ComputePme.C:160
PmePencilInitMsgData initdata
Definition: ComputePme.C:4541
int K2
Definition: PmeBase.h:18
CProxy_PmeZPencil zPencil
Definition: ComputePme.C:222
SimParameters * simParameters
Definition: Node.h:178
CProxy_PmePencilMap zm
Definition: ComputePme.C:227
CProxy_NodePmeMgr pmeNodeProxy
Definition: ComputePme.C:224
int block2
Definition: PmeBase.h:21
#define CKLOOP_CTRL_PME_SENDUNTRANS
Definition: SimParameters.h:98
#define PRIORITY_SIZE
Definition: Priorities.h:13
static void PmeYPencilSendUntrans(int first, int last, void *result, int paraNum, void *param)
Definition: ComputePme.C:5980
#define SET_PRIORITY(MSG, SEQ, PRIO)
Definition: Priorities.h:18
CkArrayIndex3D destElem
Definition: ComputePme.C:161
#define PME_UNTRANS2_PRIORITY
Definition: Priorities.h:34

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