assume input is correctly skewed
authorPritish Jetley <pjetley2@illinois.edu>
Sat, 29 Nov 2008 02:50:05 +0000 (02:50 +0000)
committerPritish Jetley <pjetley2@illinois.edu>
Sat, 29 Nov 2008 02:50:05 +0000 (02:50 +0000)
examples/charm++/topology/matmul2d/Makefile
examples/charm++/topology/matmul2d/matmul2d.C
examples/charm++/topology/matmul2d/matmul2d.ci
examples/charm++/topology/matmul2d/matmul2d.h

index f3a0ba2c27e4ae697754161d6eabbe4ce8294b73..7bd693202e0ae6030df122f856d9368fd453410d 100644 (file)
@@ -1,5 +1,4 @@
-OPTS=-O3
-CHARMC=../../../../bin/charmc $(OPTS)
+CHARMC=/home/jetley/workspace/charm/net-linux/bin/charmc $(OPTS)
 
 OBJS = matmul2d.o
 
@@ -9,7 +8,7 @@ matmul2d: $(OBJS)
        $(CHARMC) -language charm++ -o matmul2d $(OBJS)
 
 projections: $(OBJS)
-       $(CHARMC) -language charm++ -tracemode projections -lz -o matmul2d.prj $(OBJS)
+       $(CHARMC) -language charm++ -tracemode projections -o matmul2d.prj $(OBJS)
 
 summary: $(OBJS)
        $(CHARMC) -language charm++ -tracemode summary -lz -o matmul2d.sum $(OBJS)
index ee830f77863f3d4068e065c40ad6ff5d99e0c612..adac27fc92e78f51935c98ce12ae28679d7217e9 100644 (file)
 #include "stdlib.h"
 
 Main::Main(CkArgMsg* m) {
-  if ( (m->argc != 3) && (m->argc != 5) && (m->argc != 7) ) {
-    CkPrintf("%s [array_size] [block_size]\n", m->argv[0]);
-    CkPrintf("OR %s [array_size_X] [array_size_Y] [block_size_X] [block_size_Y]\n", m->argv[0]);
-    CkPrintf("OR %s [array_size_X] [array_size_Y] [block_size_X] [block_size_Y] [torus_dim_X] [torus_dim_Y]\n", m->argv[0]);
+  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]
-  if(m->argc == 3) {
-    arrayDimX = arrayDimY = atoi(m->argv[1]);
-    blockDimX = blockDimY = atoi(m->argv[2]);
-  }
   /*
   else if (m->argc == 5) {
     arrayDimX = atoi(m->argv[1]);
@@ -41,33 +41,30 @@ Main::Main(CkArgMsg* m) {
     torusDimY = atoi(m->argv[6]);
   }
   */
-  else{
-    CkAbort("Square matrices only: matmul2d array_dim block_dim\n");
-  }
 
-  if (arrayDimX < blockDimX || arrayDimX % blockDimX != 0)
-    CkAbort("array_size_X % block_size_X != 0!");
-  if (arrayDimY < blockDimY || arrayDimY % blockDimY != 0)
-    CkAbort("array_size_Y % block_size_Y != 0!");
-
-  num_chare_x = arrayDimX / blockDimX;
-  num_chare_y = arrayDimY / blockDimY;
+  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_chare_x);
-  CkPrintf("Array Dimensions: %d %d\n", arrayDimX, arrayDimY);
-  CkPrintf("Block Dimensions: %d %d\n", blockDimX, blockDimY);
-  CkPrintf("Chare-array Dimensions: %d %d\n", num_chare_x, num_chare_y);
+  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_chare_x, num_chare_y);
+  compute = CProxy_Compute::ckNew(num_chares_per_dim, num_chares_per_dim);
 
   // Start the computation
   startTime = CmiWallTimer();
-  if(num_chare_x == 1 && num_chare_y == 1)
+  if(num_chares_per_dim == 1){
     compute(0,0).compute();
-  else
-    compute.start();
+  }
+  else{
+    compute.compute();
+    //compute.start();
+  }
 }
 
 void Main::done(){
@@ -79,15 +76,19 @@ void Main::done(){
 // 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[blockDimX*blockDimY];
-    B[i] = new float[blockDimX*blockDimY];
+    A[i] = new float[s1];
+    B[i] = new float[s1];
   }
-  C = new float[blockDimX*blockDimY];
+  C = new float[s2];
 
-  for(int i = 0; i < blockDimX*blockDimY; i++){
+  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;
   }
     
@@ -98,6 +99,8 @@ Compute::Compute() {
   whichLocal = 0;
   remaining = 2;
   iteration = 0;
+
+  //comps = 0;
 }
 
 Compute::Compute(CkMigrateMessage* m) {
@@ -113,6 +116,7 @@ Compute::~Compute() {
 
 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){
@@ -130,24 +134,39 @@ void Compute::start(){
   else{
     c->recvBlockB(B[whichLocal], blockDimX*blockDimY, newBuf);
   }
-
+  */
   whichLocal = newBuf;
 }
 
 void Compute::compute(){
   //int count = 0;
-  for(int i = 0; i < blockDimX; i++){
-    for(int j = 0; j < blockDimX; j++){
-      for(int k = 0; k < blockDimX; k++){
-        //CkPrintf("%d: C[%d,%d]: %f\n", count, i, j, C[i*blockDimX+j]);
-        C[i*blockDimX+j] += A[whichLocal][i*blockDimX+k]*B[whichLocal][k*blockDimX+j];
-        //count++;
+#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_chare_x){
+  if(iteration == num_chares_per_dim){
 #ifdef MATMUL2D_WRITE_FILE
     // create a file
     //ostringstream oss;
@@ -170,6 +189,7 @@ void Compute::compute(){
     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));
@@ -191,21 +211,23 @@ void Compute::resumeFromBarrier(){
   CkPrintf("(%d,%d): B nbr: (%d,%d)\n", thisIndex.y, thisIndex.x, (row-1+num_chare_y)%num_chare_y, col);
   */
 
-  Compute *c = thisProxy((col-1+num_chare_x)%num_chare_x, row).ckLocal();
-  if(c == 0){
-    thisProxy((col-1+num_chare_x)%num_chare_x, row).recvBlockA(A[whichLocal], blockDimX*blockDimY, newBuf);
-  }
-  else{
-    c->recvBlockA(A[whichLocal], blockDimX*blockDimY, newBuf);
-  }
+  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_chare_y)%num_chare_y).recvBlockB(B[whichLocal], blockDimX*blockDimY, newBuf);
-  }
-  else{
-    c->recvBlockB(B[whichLocal], blockDimX*blockDimY, newBuf);
-  }
+  //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;
 }
index 748a990d0ff483e65d2b16256a40a7ffb19af5fe..bdc549b1935735e2cc18ebe3a4fb753ded48050c 100644 (file)
@@ -2,14 +2,10 @@ mainmodule matmul2d {
   readonly CProxy_Main mainProxy;
   readonly CProxy_Compute compute;
 
-  readonly int num_chare_x;
-  readonly int num_chare_y;
-
-  readonly int blockDimX;
-  readonly int blockDimY;
-
-  readonly int arrayDimX;
-  readonly int arrayDimY;
+  readonly int N;
+  readonly int K;
+  readonly int num_chares_per_dim;
+  readonly int T;
 
   mainchare Main {
     entry Main(CkArgMsg *m);
index f60328665bdd19bd5fdeff1c3696ad92f7f27f46..ccce3b8cb1a9e3fc638caafb21fb462d2d4c2458 100644 (file)
@@ -3,17 +3,10 @@
 /*readonly*/ CProxy_Main mainProxy;
 /*readonly*/ CProxy_Compute compute;
 
-/*readonly*/ int arrayDimX;
-/*readonly*/ int arrayDimY;
-
-/*readonly*/ int blockDimX;
-/*readonly*/ int blockDimY;
-
-/*readonly*/ int torusDimX;
-/*readonly*/ int torusDimY;
-
-/*readonly*/ int num_chare_x;
-/*readonly*/ int num_chare_y;
+/*readonly*/ int N;
+/*readonly*/ int K;
+/*readonly*/ int num_chares_per_dim;
+/*readonly*/ int T;
 
 static unsigned long next = 1;
 
@@ -49,6 +42,7 @@ class Compute: public CBase_Compute {
   int remaining;
   int whichLocal;
   int iteration;
+  //int comps;
 
 
   public: