AMPI, BigSim: Let AMPI events record a size in the BigSim timeline
authorPhil Miller <mille121@illinois.edu>
Fri, 30 Oct 2009 16:59:38 +0000 (16:59 +0000)
committerPhil Miller <mille121@illinois.edu>
Fri, 30 Oct 2009 16:59:38 +0000 (16:59 +0000)
Modeling MPI collectives explicitly in the simulator requires
knowledge of how much data the collective is moving around. There was
previously no way to record this information explicitly.

- Add an interface in trace-bluegene to set the 'size' field of the
  current timeline entry.
- Add a call to this interface in AMPI_Allreduce.
- Refactor some duplication in AMPI_Allreduce.
- Fix a typo in AMPI_Iallreduce that would record it as
  AMPI_Allreduce.

src/ck-perf/trace-bluegene.C
src/ck-perf/trace-bluegene.h
src/libs/ck-libs/ampi/ampi.C

index a6f3efffa4c88354f56dd95642436d3e8510c4b8..ceb089efa837333f741e9329036ffc7339db88a6 100644 (file)
@@ -135,6 +135,13 @@ void TraceBluegene::bgAmpiBeginExec(char *msg, char *name, void **logs, int coun
   if (msg) curlog->addMsgBackwardDep(tTIMELINEREC, msg);
 }
 
+void TraceBluegene::bgAmpiSetSize(int size)
+{
+    if (!genTimeLog) return;
+    BgTimeLog *curlog = BgLastLog(tTIMELINEREC);
+    curlog->setSize(size);
+}
+
 void TraceBluegene::bgEndExec(int commit)
 {
   stopVTimer();
index fbb37be4a2933c31ef83bb21963cb62bb841eae4..7063cb11e8c43e6ec396d1b886c5a277460bf7ed 100644 (file)
@@ -33,6 +33,7 @@ class TraceBluegene : public Trace {
     void bgDummyBeginExec(const char* name,void** parentLogPtr, int split);
     void bgBeginExec(char* msg, char *str);
     void bgAmpiBeginExec(char *msg, char *str, void **logs, int count);
+    void bgAmpiSetSize(int size);
     void bgSetInfo(char *msg, const char *str, void **logs, int count);
     void bgEndExec(int);
     virtual void beginExecute(envelope *);
@@ -76,6 +77,9 @@ extern int traceBluegeneLinked;
 #define _TRACE_BGLIST_USER_EVENT_BRACKET(x,bt,et,pLogPtr,bgLogList) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->userBracketEvent(x,bt,et,pLogPtr,bgLogList))
 #define TRACE_BG_ADD_TAG(str)  _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgAddTag(str))
 
+# define TRACE_BG_AMPI_SET_SIZE(size) \
+    _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgAmpiSetSize(size))
+
 # define TRACE_BG_AMPI_SUSPEND()     \
        _TRACE_BG_END_EXECUTE(1); \
         /* if(CpvAccess(traceOn)) traceSuspend(); */
@@ -136,6 +140,7 @@ extern "C" void BgSetStartEvent();
 # define TRACE_BG_NEWSTART(t, str, events, count)
 # define TRACE_BG_AMPI_BREAK(t, str, event, count)
 # define TRACE_BG_AMPI_WAITALL(reqs)
+# define TRACE_BG_AMPI_SET_SIZE(size)
 #endif   /* CMK_TRACE_IN_CHARM */
 
 extern "C" void BgPrintf(const char *str);
index c4f6c8926a43beab2445bade7ec8f31849613192..32d4cc73b3e349b92cd290b8f61de279d6febb31 100644 (file)
@@ -2773,6 +2773,9 @@ int AMPI_Allreduce(void *inbuf, void *outbuf, int count, int type,
                   MPI_Op op, MPI_Comm comm)
 {
   AMPIAPI("AMPI_Allreduce");
+  ampi *ptr = getAmpiInstance(comm);
+  CkDDT_DataType *ddt_type = ptr->getDDT()->getType(type);
+  TRACE_BG_AMPI_SET_SIZE(count * ddt_type->getSize());
   if(comm==MPI_COMM_SELF) return copyDatatype(comm,type,count,inbuf,outbuf);
 
 #ifdef AMPIMSGLOG
@@ -2785,11 +2788,10 @@ int AMPI_Allreduce(void *inbuf, void *outbuf, int count, int type,
   }
 #endif
 
-  ampi *ptr = getAmpiInstance(comm);
   if(op == MPI_OP_NULL) CkAbort("MPI_Allreduce called with MPI_OP_NULL!!!");
   if(getAmpiParent()->isInter(comm)) CkAbort("MPI_Allreduce not allowed for Inter-communicator!");
 
-  CkReductionMsg *msg=makeRednMsg(ptr->getDDT()->getType(type),inbuf,count,type,op);
+  CkReductionMsg *msg=makeRednMsg(ddt_type, inbuf, count, type, op);
   CkCallback allreduceCB(CkIndex_ampi::reduceResult(0),ptr->getProxy());
   msg->setCallback(allreduceCB);
   ptr->contribute(msg);
@@ -2817,7 +2819,7 @@ CDECL
 int AMPI_Iallreduce(void *inbuf, void *outbuf, int count, int type,
                    MPI_Op op, MPI_Comm comm, MPI_Request* request)
 {
-  AMPIAPI("AMPI_Allreduce");
+  AMPIAPI("AMPI_Iallreduce");
   if(comm==MPI_COMM_SELF) return copyDatatype(comm,type,count,inbuf,outbuf);
 
   checkRequest(*request);