Files
rocm-systems/examples/lulesh/lulesh_tuple.h
T
Jonathan R. Madsen 39f17ae8b8 rocm-smi and KokkosTools support (#23)
* renamed omnitrace_thread_data to thread_data

* initial implementation

* Numerous fixes and updates

- Updated timemory submodule
- Updated perfetto submodule (pulls in fixes for TRACE_EVENT)
- pthread_gotcha only after omnitrace_init_tooling
- omnitrace banner
- config settings for rocm-smi freq and devices
- critical_trace::get_entries
- OMNITRACE_BASIC_PRINT
- rocm_smi perfetto category
- redirect roctracer warnings for ROCm 4.5.0
- property specializations for rocm-smi components
- units fixes data_tracker types
- roctracer entries for pthread_create and start_thread
- omnitrace-avail defaults to settings, not components
- settings have conforming names
- settings warn about duplicates
- ptl named threads
- decreased max freq for sampler SIGALRM
- rocm-smi names thread
- rocm-smi avoids call to hipGetDeviceCount
- name roctracer activity callback threads
- fixed binary rewrite test output names

* Update lulesh example

- supports non-UVM GPU

* Lulesh tweaks + formatting

* KokkosP + Mode + Roctracer sampling deadlock fix

- kokkosp support
- omnitrace_init_library
- config::print_settings()
- config::get_mode()
- omnitrace::Mode
- omnitrace-avail improvements (removes settings)
- handle get_verbose() < 0
- disable dyninst InstrStackFrames by default
- handle perf_event_paranoid > 1 by disabling PAPI
- SIGALRM max freq to 5.0
- Name threads
- rocm-smi handles get_use_perfetto() and get_use_timemory()
- HSA_ENABLE_INTERRUPT=0 when roctracer + sampling (fixes deadlock)

* Tests, API renaming, roctracer

- disable renaming of thread 0
- verbprintf_bare
- enable dyninst merge tramp
- tweaked some omnitrace exe verbose levels
- reworked roctracer::setup and roctracer::shutdown
- rocm_smi::data::poll checks get_state()
- omnitrace_trace_finalize -> omnitrace_finalize
- omnitrace_trace_init -> omnitrace_init
- omnitrace_trace_set_env -> omnitrace_set_env
- omnitrace_trace_set_mpi -> omnitrace_set_mpi
- sampling mode does not disable timemory
- disable roctracer before shutting down rocm-smi
- lulesh tests w/ and w/o kokkosp
- lulesh tests for perfetto only
    - with --dynamic-callsites --traps --allow-overlapping
- lulesh tests for timemory only
    - with --stdlib --dynamic-callsites --traps --allow-overlapping

* Update timemory submodule

- fix for TIMEMORY_PROPERTY_SPECIALIZATION

* get_verbose() handling + timemory submodule update

- Findroctracer.cmake uses find_package(hsakmt)

* Stability fixes + rework roctracer + perfetto

- reworked roctracer start up
- critical_trace perfetto basic values
- perfetto sampling category
- sampler checks signals
- peak_rss in sampling
- pthread_gotcha::shutdown()
- rocm_smi::device_count()
- HSA_TOOLS_LIB is set
- HSA_ENABLE_INTERRUPT in omnitrace exe
- omnitrace exe verbosity level changes
- Avoid instrumenting Impl ns in Kokkos
- gpu::device_count prefers rocm_smi instead of hip
- ptl blocks signals
- fixed pthread_gotcha roctracer_data values
- removed runtime-instrument-sampling tests
- timemory submodule update

* cmake formatting

* timemory + roctracer updates

- fix timemory issue with papi_common
- fix timemory issue with units
- define roctracer::is_setup()

* Miscellaneous tweaks

- Disable sampling during runtime instrument
- Fixed warnings about dynamic callsites
- Fixed backtrace output when timemory disabled
- Test tweaks

* cmake-format

* omnitrace_target_compile_definitions

* timemory submodule update

* config, omnitrace, State, mpi_gotcha updates

- use OMNITRACE_THROW instead of direct throw
- is_attached()
- is_binary_rewrite()
- get_is_continuous_integration()
- get_debug_init()
- get_debug_finalize()
- max_thread_bookmarks default to 1
- State::Init
- app_thread oneTimeCode
- runtime instrumentation uses waitpid
- fixed init_names
- include main in MPI runs
- fixed sampling setup when disabled
- reworked mpi_gotcha
- disabled critical trace in transpose test

* cmake-format

* handle rocm_smi::device_count() exception

* CI timeouts

* Re-enable runtime-instrument + sampling
2022-02-08 17:42:17 -06:00

611 lines
19 KiB
C++

#if !defined(USE_MPI)
# error "You should specify USE_MPI=0 or USE_MPI=1 on the compile line"
#endif
// OpenMP will be compiled in if this flag is set to 1 AND the compiler beging
// used supports it (i.e. the _OPENMP symbol is defined)
#define USE_OMP 1
#if USE_MPI
#include <mpi.h>
#endif
#include <mpi.h>
/*
define one of these three symbols:
SEDOV_SYNC_POS_VEL_NONE
SEDOV_SYNC_POS_VEL_EARLY
SEDOV_SYNC_POS_VEL_LATE
*/
#define SEDOV_SYNC_POS_VEL_EARLY 1
#include <math.h>
#include <vector>
//**************************************************
// Allow flexibility for arithmetic representations
//**************************************************
#define MAX(a, b) ( ((a) > (b)) ? (a) : (b))
// Precision specification
typedef float real4 ;
typedef double real8 ;
typedef long double real10 ; // 10 bytes on x86
typedef int Index_t ; // array subscript and loop index
typedef real8 Real_t ; // floating point representation
typedef int Int_t ; // integer representation
enum { VolumeError = -1, QStopError = -2 } ;
inline real4 SQRT(real4 arg) { return sqrtf(arg) ; }
inline real8 SQRT(real8 arg) { return sqrt(arg) ; }
inline real10 SQRT(real10 arg) { return sqrtl(arg) ; }
inline real4 CBRT(real4 arg) { return cbrtf(arg) ; }
inline real8 CBRT(real8 arg) { return cbrt(arg) ; }
inline real10 CBRT(real10 arg) { return cbrtl(arg) ; }
inline real4 FABS(real4 arg) { return fabsf(arg) ; }
inline real8 FABS(real8 arg) { return fabs(arg) ; }
inline real10 FABS(real10 arg) { return fabsl(arg) ; }
// Stuff needed for boundary conditions
// 2 BCs on each of 6 hexahedral faces (12 bits)
#define XI_M 0x00007
#define XI_M_SYMM 0x00001
#define XI_M_FREE 0x00002
#define XI_M_COMM 0x00004
#define XI_P 0x00038
#define XI_P_SYMM 0x00008
#define XI_P_FREE 0x00010
#define XI_P_COMM 0x00020
#define ETA_M 0x001c0
#define ETA_M_SYMM 0x00040
#define ETA_M_FREE 0x00080
#define ETA_M_COMM 0x00100
#define ETA_P 0x00e00
#define ETA_P_SYMM 0x00200
#define ETA_P_FREE 0x00400
#define ETA_P_COMM 0x00800
#define ZETA_M 0x07000
#define ZETA_M_SYMM 0x01000
#define ZETA_M_FREE 0x02000
#define ZETA_M_COMM 0x04000
#define ZETA_P 0x38000
#define ZETA_P_SYMM 0x08000
#define ZETA_P_FREE 0x10000
#define ZETA_P_COMM 0x20000
// MPI Message Tags
#define MSG_COMM_SBN 1024
#define MSG_SYNC_POS_VEL 2048
#define MSG_MONOQ 3072
#define MAX_FIELDS_PER_MPI_COMM 6
// Assume 128 byte coherence
// Assume Real_t is an "integral power of 2" bytes wide
#define CACHE_COHERENCE_PAD_REAL (128 / sizeof(Real_t))
#define CACHE_ALIGN_REAL(n) \
(((n) + (CACHE_COHERENCE_PAD_REAL - 1)) & ~(CACHE_COHERENCE_PAD_REAL-1))
//////////////////////////////////////////////////////
// Primary data structure
//////////////////////////////////////////////////////
/*
* The implementation of the data abstraction used for lulesh
* resides entirely in the Domain class below. You can change
* grouping and interleaving of fields here to maximize data layout
* efficiency for your underlying architecture or compiler.
*
* For example, fields can be implemented as STL objects or
* raw array pointers. As another example, individual fields
* m_x, m_y, m_z could be budled into
*
* struct { Real_t x, y, z ; } *m_coord ;
*
* allowing accessor functions such as
*
* "Real_t &x(Index_t idx) { return m_coord[idx].x ; }"
* "Real_t &y(Index_t idx) { return m_coord[idx].y ; }"
* "Real_t &z(Index_t idx) { return m_coord[idx].z ; }"
*/
class Domain {
public:
// Constructor
Domain(Int_t numRanks, Index_t colLoc,
Index_t rowLoc, Index_t planeLoc,
Index_t nx, Int_t tp, Int_t nr, Int_t balance, Int_t cost);
//
// ALLOCATION
//
void AllocateNodePersistent(Int_t numNode) // Node-centered
{
m_coord.resize(numNode); // coordinates
m_vel.resize(numNode); // velocities
m_acc.resize(numNode); // accelerations
m_force.resize(numNode); // forces
m_nodalMass.resize(numNode); // mass
}
void AllocateElemPersistent(Int_t numElem) // Elem-centered
{
m_nodelist.resize(8*numElem);
// elem connectivities through face
m_faceToElem.resize(numElem);
m_elemBC.resize(numElem);
m_e.resize(numElem);
m_pq.resize(numElem);
m_qlqq.resize(numElem);
m_vol.resize(numElem);
m_delv.resize(numElem);
m_vdov.resize(numElem);
m_arealg.resize(numElem);
m_ss.resize(numElem);
m_elemMass.resize(numElem);
}
void AllocateGradients(Int_t numElem, Int_t allElem)
{
// Position gradients
m_delx_xi.resize(numElem) ;
m_delx_eta.resize(numElem) ;
m_delx_zeta.resize(numElem) ;
// Velocity gradients
m_delv_xi.resize(allElem) ;
m_delv_eta.resize(allElem);
m_delv_zeta.resize(allElem) ;
}
void DeallocateGradients()
{
m_delx_zeta.clear() ;
m_delx_eta.clear() ;
m_delx_xi.clear() ;
m_delv_zeta.clear() ;
m_delv_eta.clear() ;
m_delv_xi.clear() ;
}
void AllocateStrains(Int_t numElem)
{
m_dxx.resize(numElem) ;
m_dyy.resize(numElem) ;
m_dzz.resize(numElem) ;
}
void DeallocateStrains()
{
m_dzz.clear() ;
m_dyy.clear() ;
m_dxx.clear() ;
}
//
// ACCESSORS
//
// Node-centered
// Nodal coordinates
Real_t& x(Index_t idx) { return m_coord[idx].x ; }
Real_t& y(Index_t idx) { return m_coord[idx].y ; }
Real_t& z(Index_t idx) { return m_coord[idx].z ; }
// Nodal velocities
Real_t& xd(Index_t idx) { return m_vel[idx].x ; }
Real_t& yd(Index_t idx) { return m_vel[idx].y ; }
Real_t& zd(Index_t idx) { return m_vel[idx].z ; }
// Nodal accelerations
Real_t& xdd(Index_t idx) { return m_acc[idx].x ; }
Real_t& ydd(Index_t idx) { return m_acc[idx].y ; }
Real_t& zdd(Index_t idx) { return m_acc[idx].z ; }
// Nodal forces
Real_t& fx(Index_t idx) { return m_force[idx].x ; }
Real_t& fy(Index_t idx) { return m_force[idx].y ; }
Real_t& fz(Index_t idx) { return m_force[idx].z ; }
// Nodal mass
Real_t& nodalMass(Index_t idx) { return m_nodalMass[idx] ; }
// Nodes on symmertry planes
Index_t symmX(Index_t idx) { return m_symmX[idx] ; }
Index_t symmY(Index_t idx) { return m_symmY[idx] ; }
Index_t symmZ(Index_t idx) { return m_symmZ[idx] ; }
bool symmXempty() { return m_symmX.empty(); }
bool symmYempty() { return m_symmY.empty(); }
bool symmZempty() { return m_symmZ.empty(); }
//
// Element-centered
//
Index_t& regElemSize(Index_t idx) { return m_regElemSize[idx] ; }
Index_t& regNumList(Index_t idx) { return m_regNumList[idx] ; }
Index_t* regNumList() { return &m_regNumList[0] ; }
Index_t* regElemlist(Int_t r) { return m_regElemlist[r] ; }
Index_t& regElemlist(Int_t r, Index_t idx) { return m_regElemlist[r][idx] ; }
Index_t* nodelist(Index_t idx) { return &m_nodelist[Index_t(8)*idx] ; }
// elem connectivities through face
Index_t& lxim(Index_t idx) { return m_faceToElem[idx].lxim ; }
Index_t& lxip(Index_t idx) { return m_faceToElem[idx].lxip ; }
Index_t& letam(Index_t idx) { return m_faceToElem[idx].letam ; }
Index_t& letap(Index_t idx) { return m_faceToElem[idx].letap ; }
Index_t& lzetam(Index_t idx) { return m_faceToElem[idx].lzetam ; }
Index_t& lzetap(Index_t idx) { return m_faceToElem[idx].lzetap ; }
// elem face symm/free-surface flag
Int_t& elemBC(Index_t idx) { return m_elemBC[idx] ; }
// Principal strains - temporary
Real_t& dxx(Index_t idx) { return m_dxx[idx] ; }
Real_t& dyy(Index_t idx) { return m_dyy[idx] ; }
Real_t& dzz(Index_t idx) { return m_dzz[idx] ; }
// Velocity gradient - temporary
Real_t& delv_xi(Index_t idx) { return m_delv_xi[idx] ; }
Real_t& delv_eta(Index_t idx) { return m_delv_eta[idx] ; }
Real_t& delv_zeta(Index_t idx) { return m_delv_zeta[idx] ; }
// Position gradient - temporary
Real_t& delx_xi(Index_t idx) { return m_delx_xi[idx] ; }
Real_t& delx_eta(Index_t idx) { return m_delx_eta[idx] ; }
Real_t& delx_zeta(Index_t idx) { return m_delx_zeta[idx] ; }
// Energy
Real_t& e(Index_t idx) { return m_e[idx] ; }
// Pressure
Real_t& p(Index_t idx) { return m_pq[idx].p ; }
// Artificial viscosity
Real_t& q(Index_t idx) { return m_pq[idx].q ; }
// Linear term for q
Real_t& ql(Index_t idx) { return m_qlqq[idx].ql ; }
// Quadratic term for q
Real_t& qq(Index_t idx) { return m_qlqq[idx].qq ; }
Real_t& delv(Index_t idx) { return m_delv[idx] ; }
// Relative volume
Real_t& v(Index_t idx) { return m_vol[idx].v ; }
// Reference volume
Real_t& volo(Index_t idx) { return m_vol[idx].volo ; }
// volume derivative over volume
Real_t& vdov(Index_t idx) { return m_vdov[idx] ; }
// Element characteristic length
Real_t& arealg(Index_t idx) { return m_arealg[idx] ; }
// Sound speed
Real_t& ss(Index_t idx) { return m_ss[idx] ; }
// Element mass
Real_t& elemMass(Index_t idx) { return m_elemMass[idx] ; }
Index_t nodeElemCount(Index_t idx)
{ return m_nodeElemStart[idx+1] - m_nodeElemStart[idx] ; }
Index_t *nodeElemCornerList(Index_t idx)
{ return &m_nodeElemCornerList[m_nodeElemStart[idx]] ; }
// Parameters
// Cutoffs
Real_t u_cut() const { return m_u_cut ; }
Real_t e_cut() const { return m_e_cut ; }
Real_t p_cut() const { return m_p_cut ; }
Real_t q_cut() const { return m_q_cut ; }
Real_t v_cut() const { return m_v_cut ; }
// Other constants (usually are settable via input file in real codes)
Real_t hgcoef() const { return m_hgcoef ; }
Real_t qstop() const { return m_qstop ; }
Real_t monoq_max_slope() const { return m_monoq_max_slope ; }
Real_t monoq_limiter_mult() const { return m_monoq_limiter_mult ; }
Real_t ss4o3() const { return m_ss4o3 ; }
Real_t qlc_monoq() const { return m_qlc_monoq ; }
Real_t qqc_monoq() const { return m_qqc_monoq ; }
Real_t qqc() const { return m_qqc ; }
Real_t eosvmax() const { return m_eosvmax ; }
Real_t eosvmin() const { return m_eosvmin ; }
Real_t pmin() const { return m_pmin ; }
Real_t emin() const { return m_emin ; }
Real_t dvovmax() const { return m_dvovmax ; }
Real_t refdens() const { return m_refdens ; }
// Timestep controls, etc...
Real_t& time() { return m_time ; }
Real_t& deltatime() { return m_deltatime ; }
Real_t& deltatimemultlb() { return m_deltatimemultlb ; }
Real_t& deltatimemultub() { return m_deltatimemultub ; }
Real_t& stoptime() { return m_stoptime ; }
Real_t& dtcourant() { return m_dtcourant ; }
Real_t& dthydro() { return m_dthydro ; }
Real_t& dtmax() { return m_dtmax ; }
Real_t& dtfixed() { return m_dtfixed ; }
Int_t& cycle() { return m_cycle ; }
Index_t& numRanks() { return m_numRanks ; }
Index_t& colLoc() { return m_colLoc ; }
Index_t& rowLoc() { return m_rowLoc ; }
Index_t& planeLoc() { return m_planeLoc ; }
Index_t& tp() { return m_tp ; }
Index_t& sizeX() { return m_sizeX ; }
Index_t& sizeY() { return m_sizeY ; }
Index_t& sizeZ() { return m_sizeZ ; }
Index_t& numReg() { return m_numReg ; }
Int_t& cost() { return m_cost ; }
Index_t& numElem() { return m_numElem ; }
Index_t& numNode() { return m_numNode ; }
Index_t& maxPlaneSize() { return m_maxPlaneSize ; }
Index_t& maxEdgeSize() { return m_maxEdgeSize ; }
//
// MPI-Related additional data
//
#if USE_MPI
// Communication Work space
Real_t *commDataSend ;
Real_t *commDataRecv ;
// Maximum number of block neighbors
MPI_Request recvRequest[26] ; // 6 faces + 12 edges + 8 corners
MPI_Request sendRequest[26] ; // 6 faces + 12 edges + 8 corners
#endif
private:
void BuildMesh(Int_t nx, Int_t edgeNodes, Int_t edgeElems);
void SetupThreadSupportStructures();
void CreateRegionIndexSets(Int_t nreg, Int_t balance);
void SetupCommBuffers(Int_t edgeNodes);
void SetupSymmetryPlanes(Int_t edgeNodes);
void SetupElementConnectivities(Int_t edgeElems);
void SetupBoundaryConditions(Int_t edgeElems);
//
// IMPLEMENTATION
//
/* Node-centered */
struct Tuple3 {
Real_t x, y, z ;
} ;
Kokkos::View<Tuple3*> m_coord ; /* coordinates */
Kokkos::View<Tuple3*> m_vel ; /* velocities */
Kokkos::View<Tuple3*> m_acc ; /* accelerations */
Kokkos::View<Tuple3*> m_force ; /* forces */
Kokkos::View<Real_t*> m_nodalMass ; /* mass */
Kokkos::View<Index_t*> m_symmX ; /* symmetry plane nodesets */
Kokkos::View<Index_t*> m_symmY ;
Kokkos::View<Index_t*> m_symmZ ;
// Element-centered
// Region information
Int_t m_numReg ;
Int_t m_cost; //imbalance cost
Index_t *m_regElemSize ; // Size of region sets
Index_t *m_regNumList ; // Region number per domain element
Index_t **m_regElemlist ; // region indexset
Kokkos::View<Index_t*> m_nodelist ; /* elemToNode connectivity */
struct FaceElemConn {
Index_t lxim, lxip, letam, letap, lzetam, lzetap ;
} ;
Kokkos::View<FaceElemConn*> m_faceToElem ; /* element conn across faces */
Kokkos::View<Int_t*> m_elemBC ; /* symmetry/free-surface flags for each elem face */
Kokkos::View<Real_t*> m_dxx ; /* principal strains -- temporary */
Kokkos::View<Real_t*> m_dyy ;
Kokkos::View<Real_t*> m_dzz ;
Kokkos::View<Real_t*> m_delv_xi ; /* velocity gradient -- temporary */
Kokkos::View<Real_t*> m_delv_eta ;
Kokkos::View<Real_t*> m_delv_zeta ;
Kokkos::View<Real_t*> m_delx_xi ; /* coordinate gradient -- temporary */
Kokkos::View<Real_t*> m_delx_eta ;
Kokkos::View<Real_t*> m_delx_zeta ;
Kokkos::View<Real_t*> m_e ; /* energy */
struct Pcomponents {
Real_t p, q ;
} ;
Kokkos::View<Pcomponents*> m_pq ; /* pressure and artificial viscosity */
struct Qcomponents {
Real_t ql, qq ;
} ;
Kokkos::View<Qcomponents*> m_qlqq ; /* linear and quadratic terms for q */
struct Volume {
Real_t v, volo ;
} ;
Kokkos::View<Volume*> m_vol ; /* relative and reference volume */
Kokkos::View<Real_t*> m_vnew ; /* new relative volume -- temporary */
Kokkos::View<Real_t*> m_delv ; /* m_vnew - m_v */
Kokkos::View<Real_t*> m_vdov ; /* volume derivative over volume */
Kokkos::View<Real_t*> m_arealg ; /* characteristic length of an element */
Kokkos::View<Real_t*> m_ss ; /* "sound speed" */
Kokkos::View<Real_t*> m_elemMass ; /* mass */
// Cutoffs (treat as constants)
const Real_t m_e_cut ; // energy tolerance
const Real_t m_p_cut ; // pressure tolerance
const Real_t m_q_cut ; // q tolerance
const Real_t m_v_cut ; // relative volume tolerance
const Real_t m_u_cut ; // velocity tolerance
// Other constants (usually setable, but hardcoded in this proxy app)
const Real_t m_hgcoef ; // hourglass control
const Real_t m_ss4o3 ;
const Real_t m_qstop ; // excessive q indicator
const Real_t m_monoq_max_slope ;
const Real_t m_monoq_limiter_mult ;
const Real_t m_qlc_monoq ; // linear term coef for q
const Real_t m_qqc_monoq ; // quadratic term coef for q
const Real_t m_qqc ;
const Real_t m_eosvmax ;
const Real_t m_eosvmin ;
const Real_t m_pmin ; // pressure floor
const Real_t m_emin ; // energy floor
const Real_t m_dvovmax ; // maximum allowable volume change
const Real_t m_refdens ; // reference density
// Variables to keep track of timestep, simulation time, and cycle
Real_t m_dtcourant ; // courant constraint
Real_t m_dthydro ; // volume change constraint
Int_t m_cycle ; // iteration count for simulation
Real_t m_dtfixed ; // fixed time increment
Real_t m_time ; // current time
Real_t m_deltatime ; // variable time increment
Real_t m_deltatimemultlb ;
Real_t m_deltatimemultub ;
Real_t m_dtmax ; // maximum allowable time increment
Real_t m_stoptime ; // end time for simulation
Int_t m_numRanks ;
Index_t m_colLoc ;
Index_t m_rowLoc ;
Index_t m_planeLoc ;
Index_t m_tp ;
Index_t m_sizeX ;
Index_t m_sizeY ;
Index_t m_sizeZ ;
Index_t m_numElem ;
Index_t m_numNode ;
Index_t m_maxPlaneSize ;
Index_t m_maxEdgeSize ;
// OMP hack
Index_t *m_nodeElemStart ;
Index_t *m_nodeElemCornerList ;
// Used in setup
Index_t m_rowMin, m_rowMax;
Index_t m_colMin, m_colMax;
Index_t m_planeMin, m_planeMax ;
} ;
typedef Real_t &(Domain::* Domain_member )(Index_t) ;
struct cmdLineOpts {
Int_t its; // -i
Int_t nx; // -s
Int_t numReg; // -r
Int_t numFiles; // -f
Int_t showProg; // -p
Int_t quiet; // -q
Int_t viz; // -v
Int_t cost; // -c
Int_t balance; // -b
};
// Function Prototypes
// lulesh-par
Real_t CalcElemVolume( const Real_t x[8],
const Real_t y[8],
const Real_t z[8]);
// lulesh-util
void ParseCommandLineOptions(int argc, char *argv[],
Int_t myRank, struct cmdLineOpts *opts);
void VerifyAndWriteFinalOutput(Real_t elapsed_time,
Domain& locDom,
Int_t nx,
Int_t numRanks);
// lulesh-viz
void DumpToVisit(Domain& domain, int numFiles, int myRank, int numRanks);
// lulesh-comm
void CommRecv(Domain& domain, Int_t msgType, Index_t xferFields,
Index_t dx, Index_t dy, Index_t dz,
bool doRecv, bool planeOnly);
void CommSend(Domain& domain, Int_t msgType,
Index_t xferFields, Domain_member *fieldData,
Index_t dx, Index_t dy, Index_t dz,
bool doSend, bool planeOnly);
void CommSBN(Domain& domain, Int_t xferFields, Domain_member *fieldData);
void CommSyncPosVel(Domain& domain);
void CommMonoQ(Domain& domain);
// lulesh-init
void InitMeshDecomp(Int_t numRanks, Int_t myRank,
Int_t *col, Int_t *row, Int_t *plane, Int_t *side);