Changes to topology section, deleting the non-existing example
authorNikhil Jain <nikhil@illinois.edu>
Fri, 24 Aug 2012 15:40:52 +0000 (10:40 -0500)
committerNikhil Jain <nikhil@illinois.edu>
Fri, 24 Aug 2012 15:40:52 +0000 (10:40 -0500)
doc/charm++/manual.tex
doc/charm++/topology.tex
examples/charm++/topology/matmul2d/Makefile [deleted file]
examples/charm++/topology/matmul2d/matmul2d.C [deleted file]
examples/charm++/topology/matmul2d/matmul2d.ci [deleted file]
examples/charm++/topology/matmul2d/matmul2d.h [deleted file]

index 36fea1b9aea7366be833fbf26194c572d8b74792..7d828e5de6e88bf64403b69a3c6bb4003c11ebc6 100644 (file)
@@ -93,7 +93,7 @@
 \chapter{Serializing Complex Types}
   \input{advancedpup}
 
-\chapter{Querying Network / Node Topology}
+\chapter{Querying Network Topology}
 \index{topomanager}
 \index{cputopology}
 \label{topo}
index 9200be1830d47827ebf9a61f4078c43781d0498c..3e8e9f7d6f81ef70cec9d4741e88996ccdf162df 100644 (file)
@@ -1,9 +1,9 @@
 The following calls provide information about the machine upon which the
 parallel program is executed. A processing element (PE) refers to a single CPU,
 whereas a node refers to a single machine -- a set of processing elements that share
-memory (i.e. an address space).  PEs and nodes are numbered separately starting
-from zero, i.e., PEs are numbered in range $[0,CmiNumPes())$, and nodes are
-numbered in range $[0,CmiNumNodes())$.
+memory (i.e. an address space).  PEs and nodes are ranked separately starting
+from zero, i.e., PEs are ranked in range 0 to {\em CmiNumPes()}, and nodes are
+ranked in range 0 to {\em CmiNumNodes()}.
 
 \section{Network Topology}
 Charm++ provides a unified abstraction for querying topology of IBM's BG/L, BG/P
@@ -17,22 +17,32 @@ dimensions (except BG/Q).
 \item [getDimNA(), getDimNB(), getDimNC(), getDimND(), getDimNE():] Returns the
 length of A, B, C, D and E dimensions on BG/Q.
 \item [getDimNT():] Returns the length of T dimension. TopoManager uses T
-dimension to represent different cores that reside within a physical code.
+dimension to represent different cores that reside within a physical node.
 \item [rankToCoordinates(int pe, int \&x, int \&y, int \&z, int \&t):] Get the
-coordinates of PE with number {\em pe} (except BG/Q).
+coordinates of PE with rank {\em pe} (except BG/Q).
 \item [rankToCoordinates(int pe, int \&a, int \&b, int \&c, int \&d, int \&e, int
-\&t):] Get the coordinates of PE with number {\em pe} on BG/Q.
-\item [coordinatesToRank(int x, int y, int z, int t):] Returns the number of PE
+\&t):] Get the coordinates of PE with rank {\em pe} on BG/Q.
+\item [coordinatesToRank(int x, int y, int z, int t):] Returns the rank of PE
 with given coordinates (except BG/Q).
 \item [coordinatesToRank(int a, int b, int c, int d, int e, int t):] Returns the
-number of PE with given coordinates on BG/Q.
+rank of PE with given coordinates on BG/Q.
 \item [getHopsBetweenRanks(int pe1, int pe2):] Returns the distance between the
 given PEs in terms of the hops count on the network between the two PEs.
 \item [printAllocation(FILE *fp):] Outputs the allocation for a particular
 execution to the given file.
-
 \end{description}
 
+\noindent For example, one can obtain rank of a processor, whose coordinates are known, on 
+BG/P as well as on Cray XE6 using the following code:
+
+\begin{alltt}
+TopoManager tmgr;
+int rank,x,y,z,t;
+x = y = z = t = 2;
+rank = tmgr.coordinatesToRank(x,y,z,t);
+\end{alltt}
+
+\noindent For more example, please refer to examples/charm++/topology.
 %\section{Node Topology}
 
 %Thus if a parallel program is executing on one 4-processor workstation and one
diff --git a/examples/charm++/topology/matmul2d/Makefile b/examples/charm++/topology/matmul2d/Makefile
deleted file mode 100644 (file)
index 388f9a9..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-CHARMC=../../../../bin/charmc $(OPTS)
-
-OBJS = matmul2d.o
-
-all: matmul2d
-
-matmul2d: $(OBJS)
-       $(CHARMC) -language charm++ -o matmul2d $(OBJS)
-
-projections: $(OBJS)
-       $(CHARMC) -language charm++ -tracemode projections -o matmul2d.prj $(OBJS)
-
-summary: $(OBJS)
-       $(CHARMC) -language charm++ -tracemode summary -lz -o matmul2d.sum $(OBJS)
-
-matmul2d.decl.h: matmul2d.ci
-       $(CHARMC)  matmul2d.ci
-
-clean:
-       rm -f *.decl.h *.def.h conv-host *.o matmul2d matmul2d.prj charmrun *~ mat.*
-
-matmul2d.o: matmul2d.C matmul2d.h matmul2d.decl.h
-       $(CHARMC) -c matmul2d.C 
diff --git a/examples/charm++/topology/matmul2d/matmul2d.C b/examples/charm++/topology/matmul2d/matmul2d.C
deleted file mode 100644 (file)
index adac27f..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-#include "matmul2d.decl.h"
-#include "matmul2d.h"
-#include "TopoManager.h"
-/*
-#include <cstdio>
-#include <iostream>
-#include <fstream>
-#include <sstream>
-*/
-#include "stdio.h"
-#include "stdlib.h"
-
-Main::Main(CkArgMsg* m) {
-  if (m->argc != 4){ 
-    CkPrintf("%s [N] [K] [num_chares_per_dim]\n", m->argv[0]);
-    CkAbort("Abort");
-  }
-  else {
-    N = atoi(m->argv[1]);
-    K = atoi(m->argv[2]);
-    num_chares_per_dim = atoi(m->argv[3]);
-    T = N/num_chares_per_dim;
-  }
-
-  // store the main proxy
-  mainProxy = thisProxy;
-
-  // get the size of the global array, size of each chare and size of the torus [optional]
-  /*
-  else if (m->argc == 5) {
-    arrayDimX = atoi(m->argv[1]);
-    arrayDimY = atoi(m->argv[2]);
-    blockDimX = atoi(m->argv[3]);
-    blockDimY = atoi(m->argv[4]);
-  } else if (m->argc == 7){
-    arrayDimX = atoi(m->argv[1]);
-    arrayDimY = atoi(m->argv[2]);
-    blockDimX = atoi(m->argv[3]);
-    blockDimY = atoi(m->argv[4]);
-    torusDimX = atoi(m->argv[5]);
-    torusDimY = atoi(m->argv[6]);
-  }
-  */
-
-  if (N < T || N % T != 0)
-    CkAbort("N % T != 0!");
-  if (K < T || K % T != 0)
-    CkAbort("K % T != 0!");
-
-  // print info
-  CkPrintf("Running Matrix Multiplication on %d processors with (%d, %d) chares\n", CkNumPes(), num_chares_per_dim, num_chares_per_dim);
-  CkPrintf("Array Dimensions: %d %d\n", N, K);
-  CkPrintf("Block Dimensions: %dx%d, %dx%d\n", T, K/num_chares_per_dim, K/num_chares_per_dim, T);
-  CkPrintf("Chare-array Dimensions: %d %d\n", num_chares_per_dim, num_chares_per_dim);
-
-  // Create new array of worker chares
-  compute = CProxy_Compute::ckNew(num_chares_per_dim, num_chares_per_dim);
-
-  // Start the computation
-  startTime = CmiWallTimer();
-  if(num_chares_per_dim == 1){
-    compute(0,0).compute();
-  }
-  else{
-    compute.compute();
-    //compute.start();
-  }
-}
-
-void Main::done(){
-  endTime = CmiWallTimer();
-  CkPrintf("Fin: %f sec\n", endTime-startTime);
-  CkExit();
-}
-
-// Constructor, initialize values
-Compute::Compute() {
-
-  int s1 = (K/num_chares_per_dim)*T;
-  int s2 = T*T;
-  for(int i = 0; i < 2; i++){
-    A[i] = new float[s1];
-    B[i] = new float[s1];
-  }
-  C = new float[s2];
-
-  for(int i = 0; i < s1; i++){
-    A[0][i] = MAGIC_A;
-    B[0][i] = MAGIC_B;
-  }
-  for(int i = 0; i < s2; i++){
-    C[i] = 0;
-  }
-    
-  step = 0;  
-  row = thisIndex.y;
-  col = thisIndex.x;
-
-  whichLocal = 0;
-  remaining = 2;
-  iteration = 0;
-
-  //comps = 0;
-}
-
-Compute::Compute(CkMigrateMessage* m) {
-}
-
-Compute::~Compute() {
-  delete [] A[0];
-  delete [] A[1];
-  delete [] B[0];
-  delete [] B[1];
-  delete [] C;
-}
-
-void Compute::start(){
-  int newBuf = 1 - whichLocal;
-  /*
-  //1. send A
-  Compute *c = thisProxy((col-row+num_chare_x)%num_chare_x, row).ckLocal();
-  if(c == 0){
-    thisProxy((col-row+num_chare_x)%num_chare_x, row).recvBlockA(A[whichLocal], blockDimX*blockDimY, newBuf);
-  }
-  else{
-    c->recvBlockA(A[whichLocal], blockDimX*blockDimY, newBuf);
-  }
-  
-  //2. send B
-  c = thisProxy(col, (row-col+num_chare_y)%num_chare_y).ckLocal();
-  if(c == 0){
-    thisProxy(col, (row-col+num_chare_y)%num_chare_y).recvBlockB(B[whichLocal], blockDimX*blockDimY, newBuf);
-  }
-  else{
-    c->recvBlockB(B[whichLocal], blockDimX*blockDimY, newBuf);
-  }
-  */
-  whichLocal = newBuf;
-}
-
-void Compute::compute(){
-  //int count = 0;
-#ifdef USE_OPT_ROUTINES
-  const char trans = 'N';
-  const double alpha = 1.0;
-  const double beta = 0.0;
-
-  sgemm(&trans, &trans, blockDimX, blockDimZ, blockDimY, alpha, A, blockDimX, B, blockDimY, beta, C, blockDimX);
-#else
-  int i, j, k;
-
-  float *thisa = A[whichLocal];
-  float *thisb = B[whichLocal];
-
-  for(i = 0; i < T; i++){
-    for(j = 0; j < T; j++){
-      float sum = 0.0;
-      for(k = 0; k < (K/num_chares_per_dim); k++){
-        sum += thisa[i*(K/num_chares_per_dim)+k]*thisb[k*(T)+j];
-        //comps++;
-      }
-      C[i*T+j] += sum;
-    }
-  }
-#endif
-
-  remaining = 2;
-  iteration++;
-  if(iteration == num_chares_per_dim){
-#ifdef MATMUL2D_WRITE_FILE
-    // create a file
-    //ostringstream oss;
-    char buf[128];
-    
-    sprintf(buf, "mat.%d.%d", row, col);
-    //oss << "mat." << row << "." << col;
-    //ofstream ofs(oss.str().c_str());
-    FILE *fp = fopen(buf, "w");
-
-    for(int i = 0; i < blockDimX; i++){
-      for(int j = 0; j < blockDimX; j++){
-        //ofs << C[i*blockDimX+j];
-        fprintf(fp, "%f ", C[i*blockDimX+j]);
-      }
-      //ofs << endl;
-      fprintf(fp, "\n");
-
-    }
-    fclose(fp);
-#endif
-    contribute(0,0,CkReduction::concat, CkCallback(CkIndex_Main::done(), mainProxy));
-    CkPrintf("[%d,%d] comps: %d iter: %d\n", thisIndex.x, thisIndex.y, -1, iteration);
-  }
-  else{
-    contribute(0,0,CkReduction::concat,CkCallback(CkIndex_Compute::resumeFromBarrier(), thisProxy));
-  }
-}
-
-void Compute::resumeFromBarrier(){
-  // At this point, everyone has used their A and B buffers
-  int newBuf = 1-whichLocal;
-  // We must put our own 
-  // 1. First put A
-
-  //if(num_chare_x == 0 || num_chare_y ==0)
-  //  CkPrintf("(%d,%d): 0 divisor\n", thisIndex.y, thisIndex.x);
-#ifdef MATMUL2D_DEBUG
-  CkPrintf("(%d,%d): A nbr: (%d,%d), iteration: %d\n", thisIndex.y, thisIndex.x, row, (col-1+num_chare_x)%num_chare_x, iteration);
-#endif
-  /*
-  CkPrintf("(%d,%d): B nbr: (%d,%d)\n", thisIndex.y, thisIndex.x, (row-1+num_chare_y)%num_chare_y, col);
-  */
-
-  int size = (K/num_chares_per_dim)*T;
-
-  //Compute *c = thisProxy((col-1+num_chares_per_dim)%num_chares_per_dim, row).ckLocal();
-  //if(c == 0){
-  thisProxy((col-1+num_chares_per_dim)%num_chares_per_dim, row).recvBlockA(A[whichLocal], size, newBuf);
-  //}
-  //else{
-  //  c->recvBlockA(A[whichLocal], blockDimX*blockDimY, newBuf);
-  //}
-  // 2. Then put B
-  //c =  thisProxy(col, (row-1+num_chare_y)%num_chare_y).ckLocal();
-  //if(c == 0){
-  thisProxy(col, (row-1+num_chares_per_dim)%num_chares_per_dim).recvBlockB(B[whichLocal], size, newBuf);
-  //}
-  //else{
-  //  c->recvBlockB(B[whichLocal], blockDimX*blockDimY, newBuf);
-  //}
-  // toggle between local buffers
-  whichLocal = newBuf;
-}
-
-void Compute::recvBlockA(float *block, int size, int whichBuf){
-  memcpy(A[whichBuf], block, sizeof(float)*size);
-  remaining--;
-  if(remaining == 0){
-    compute();
-  }
-}
-
-void Compute::recvBlockB(float *block, int size, int whichBuf){
-  memcpy(B[whichBuf], block, sizeof(float)*size);
-  remaining--;
-  if(remaining == 0){
-    compute();
-  }
-}
-
-ComputeMap::ComputeMap(int _adx, int _ady){
-  arrayDimX = _adx;
-  arrayDimY = _ady;
-
-  map = new int[_adx*_ady];
-  
-}
-
-int ComputeMap::procNum(int arrayHdl, const CkArrayIndex &idx){
-  int *index = (int *)(idx.data());
-  int row = index[1];
-  int col = index[0];
-
-  return map[row*arrayDimX + col];
-}
-#include "matmul2d.def.h"
diff --git a/examples/charm++/topology/matmul2d/matmul2d.ci b/examples/charm++/topology/matmul2d/matmul2d.ci
deleted file mode 100644 (file)
index bdc549b..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-mainmodule matmul2d {
-  readonly CProxy_Main mainProxy;
-  readonly CProxy_Compute compute;
-
-  readonly int N;
-  readonly int K;
-  readonly int num_chares_per_dim;
-  readonly int T;
-
-  mainchare Main {
-    entry Main(CkArgMsg *m);
-    entry void done();
-  };
-
-  array [2D] Compute {
-    entry Compute(void);
-    entry void start();
-    entry void compute();
-    entry void recvBlockA(float arr[size], int size, int whichBuf);
-    entry void recvBlockB(float arr[size], int size, int whichBuf);
-    entry void resumeFromBarrier();
-  };
-
-  group ComputeMap : CkArrayMap {
-    entry ComputeMap(int x, int y);
-  };
-};
diff --git a/examples/charm++/topology/matmul2d/matmul2d.h b/examples/charm++/topology/matmul2d/matmul2d.h
deleted file mode 100644 (file)
index ccce3b8..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-// Read-only global variables
-
-/*readonly*/ CProxy_Main mainProxy;
-/*readonly*/ CProxy_Compute compute;
-
-/*readonly*/ int N;
-/*readonly*/ int K;
-/*readonly*/ int num_chares_per_dim;
-/*readonly*/ int T;
-
-static unsigned long next = 1;
-
-int myrand(int numpes) {
-  next = next * 1103515245 + 12345;
-  return((unsigned)(next/65536) % numpes);
-}
-
-#define USE_TOPOMAP    0
-#define USE_RRMAP      0
-#define USE_RNDMAP     0
-
-
-#define UNROLL_DEPTH 3
-#define MAGIC_A 1.0
-#define MAGIC_B 4.0
-
-class Main : public CBase_Main {
-  
-  double startTime;
-  double endTime;
-  
-  public:    
-  Main(CkArgMsg* m);
-  void done();
-};
-
-class Compute: public CBase_Compute {
-  int step;
-  float *A[2], *B[2], *C;
-
-  int row, col;
-  int remaining;
-  int whichLocal;
-  int iteration;
-  //int comps;
-
-
-  public:
-  Compute();
-  Compute(CkMigrateMessage* m);
-  ~Compute();
-
-  void start();
-  void compute();
-  void recvBlockA(float *block, int size, int whichBuf);
-  void recvBlockB(float *block, int size, int whichBuf);
-  void resumeFromBarrier();
-
-};
-
-class ComputeMap : public CBase_ComputeMap {
-  
-  int arrayDimX, arrayDimY;
-
-  int *map;
-
-  public:
-  ComputeMap(int, int);
-  ~ComputeMap(){delete []map;}
-  int procNum(int, const CkArrayIndex &idx);
-
-};