Fixed a nasty mipspro QT bug. Got rocsolid to work with charm++ again.
authorMilind Bhandarkar <milind@cs.uiuc.edu>
Tue, 22 Feb 2000 05:47:26 +0000 (05:47 +0000)
committerMilind Bhandarkar <milind@cs.uiuc.edu>
Tue, 22 Feb 2000 05:47:26 +0000 (05:47 +0000)
src/QuickThreads/md/mipspro.s
src/ck-core/tempo.C
src/ck-core/tempo.h
src/conv-core/threads.c
src/langs/ampi/ampi.C
src/langs/ampi/ampiimpl.h
src/libs/ck-libs/ampi/ampi.C
src/libs/ck-libs/ampi/ampiimpl.h

index b95ed0e9e232d4b49fa93598dc02115ad05483d4..3534006690145cfefa65be348e6b8ce6bc7d0aa7 100644 (file)
@@ -155,24 +155,28 @@ qt_start:
        */
         .ent qt_block
 qt_block:
-       daddiu $sp, $sp,-64             /* 6 8-byte regs, saved ret pc, aligned. */
-       swc1 $f20,  0($sp)
-       swc1 $f22,  8($sp)
-       swc1 $f24, 16($sp)
-       swc1 $f26, 24($sp)
-       swc1 $f28, 32($sp)
-       swc1 $f30, 40($sp)
-       sd $31, 48($sp)
+       daddiu $sp, $sp,-80             /* 6 8-byte regs, saved ret pc, aligned. */
+       sdc1 $f24,  0($sp)
+       sdc1 $f25,  8($sp)
+       sdc1 $f26, 16($sp)
+       sdc1 $f27, 24($sp)
+       sdc1 $f28, 32($sp)
+       sdc1 $f29, 40($sp)
+       sdc1 $f30, 48($sp)
+       sdc1 $f31, 56($sp)
+       sd $31, 64($sp)
        jal qt_blocki
         nop
-       lwc1 $f20,  0($sp)
-       lwc1 $f22,  8($sp)
-       lwc1 $f24, 16($sp)
-       lwc1 $f26, 24($sp)
-       lwc1 $f28, 32($sp)
-       lwc1 $f30, 40($sp)
-       ld $31, 48($sp)
-       daddiu $sp, $sp,64
+       ldc1 $f24,  0($sp)
+       ldc1 $f25,  8($sp)
+       ldc1 $f26, 16($sp)
+       ldc1 $f27, 24($sp)
+       ldc1 $f28, 32($sp)
+       ldc1 $f29, 40($sp)
+       ldc1 $f30, 48($sp)
+       ldc1 $f31, 56($sp)
+       ld $31, 64($sp)
+       daddiu $sp, $sp,80
        j $31
         nop
         .end qt_block
index b6a04cb62406f4255709bfc2b83774d2a6602ead..00c9ce03d8b0adf2b15188512d60fd000c4dafb6 100644 (file)
@@ -152,15 +152,16 @@ void
 TempoArray::ckTempoBarrier(void)
 {
   if(thisIndex) {
-    ckTempoSendElem(BARR_TAG, thisIndex, (void*) 0, 0, 0);
-    ckTempoRecv(BARR_TAG, 0, (void*) 0, 0);
+    ckTempoSendElem(BARR_TAG, nGOps, (void*) 0, 0, 0);
+    ckTempoRecv(BARR_TAG, nGOps, (void*) 0, 0);
   } else {
      int i;
      for(i=1;i<numElements;i++)
-       ckTempoRecv(BARR_TAG, (void *) 0, 0);
+       ckTempoRecv(BARR_TAG, nGOps, (void *) 0, 0);
      for(i=1;i<numElements;i++)
-       ckTempoSendElem(BARR_TAG, 0, (void *) 0, 0, i);
+       ckTempoSendElem(BARR_TAG, nGOps, (void *) 0, 0, i);
   }
+  nGOps++;
 }
 
 void
@@ -168,10 +169,11 @@ TempoArray::ckTempoBcast(int sender, int tag, void *buffer, int buflen)
 {
   if(sender) {
     int i;
-    for(i=1;i<numElements;i++)
-      ckTempoSendElem(tag, BCAST_TAG, buffer, buflen, i);
-  } else
-    ckTempoRecv(tag, BCAST_TAG, buffer, buflen);
+    for(i=0;i<numElements;i++)
+      ckTempoSendElem(tag, BCAST_TAG+nGOps, buffer, buflen, i);
+  }
+  ckTempoRecv(tag, BCAST_TAG+nGOps, buffer, buflen);
+  nGOps++;
 }
 
 static void doOp(int op, int type, int count, void *inbuf, void *outbuf)
@@ -240,13 +242,14 @@ TempoArray::ckTempoReduce(int root, int op, void *inbuf, void *outbuf,
     void *tbuf = malloc(size);
     _MEMCHECK(tbuf);
     for(int i=0; i<numElements-1; i++) {
-      ckTempoRecv(REDUCE_TAG, tbuf, size);
+      ckTempoRecv(REDUCE_TAG, nGOps, tbuf, size);
       doOp(op, type, count, tbuf, outbuf);
     }
     free(tbuf);
   } else {
-    ckTempoSendElem(REDUCE_TAG, inbuf, size, root);
+    ckTempoSendElem(REDUCE_TAG, nGOps, inbuf, size, root);
   }
+  nGOps++;
 }
 
 void 
index 9aa0c38b79de53410408f7d48ae41ded795e5fcc..c2705c03de4083e501dd044809f5f73d72eb9ad8 100644 (file)
@@ -81,9 +81,10 @@ class TempoGroup : public Group, public Tempo
 
 class TempoArray : public ArrayElement, public Tempo
 {
+  int nGOps;
   public:
     TempoArray(ArrayElementCreateMessage *msg) : ArrayElement(msg)
-      { finishConstruction(); }
+      { nGOps=0; finishConstruction(); }
     TempoArray(ArrayElementMigrateMessage *msg) : ArrayElement(msg)
       { /*finishMigration();*/ }
     static void ckTempoSendElem(int tag1, int tag2, void *buffer, int buflen,
index ffa42a8d0d7cd34a0fa9cc5bd95fef35daa9b0b6..463a1bdcd7d63bc28982359b6082bd3c16f17891 100644 (file)
@@ -814,7 +814,7 @@ CthThread CthUnpackThread(void *buffer)
 
 #else
 
-#define STACKSIZE (32768)
+#define STACKSIZE (327680)
 
 #if CMK_MEMORY_PROTECTABLE
 
index 6daff0319dd74607571f6c61652162e033982d8b..ad8a799c94b825af2760783d75fc032b7fdf6beb 100644 (file)
@@ -52,7 +52,7 @@ void
 main::qd(void)
 {
   // CkWaitQD();
-  CkPrintf("Created Elements\n");
+  // CkPrintf("Created Elements\n");
   CProxy_ampi jarray(arr);
   for(int i=0; i<nblocks; i++)
     jarray[i].run();
@@ -92,6 +92,7 @@ ampi::ampi(ArrayElementCreateMessage *msg) : TempoArray(msg)
     irequests[i].nextfree = (i+1)%100;
     irequests[i].prevfree = ((i-1)+100)%100;
   }
+  nbcasts = 0;
   // delete msg;
 }
 
@@ -168,7 +169,7 @@ ampi::run(void)
   CtvAccess(ampiPtr) = this;
   CtvAccess(numMigrateCalls) = 0;
 
-  //CkPrintf("[%d] main_ called\n", getIndex());
+  // CkPrintf("[%d] main_ called\n", getIndex());
   main_();
   myThis = (ampi*) ampiArray->getElement(myIdx);
   //CkPrintf("[%d] main_ finished\n", myThis->getIndex());
@@ -358,9 +359,12 @@ extern "C" int MPI_Bcast(void *buf, int count, int type, int root,
 {
   ampi *ptr = CtvAccess(ampiPtr);
   int size = typesize(type, count, ptr);
-  //CkPrintf("[%d] Broadcast called size=%d\n", ptr->getIndex(), size);
-  ptr->ckTempoBcast(((root)==ptr->getIndex())?1:0, MPI_BCAST_TAG, buf, size);
-  //CkPrintf("[%d] Broadcast finished\n", ptr->getIndex());
+  ptr->nbcasts++;
+  // CkPrintf("[%d] %dth Broadcast called size=%d\n", ptr->getIndex(), 
+           // ptr->nbcasts, size);
+  ptr->ckTempoBcast(((root)==ptr->getIndex())?1:0, 
+                    MPI_BCAST_TAG+ptr->nbcasts, buf, size);
+  // CkPrintf("[%d] %dth Broadcast finished\n", ptr->getIndex(), ptr->nbcasts);
   return 0;
 }
 
@@ -463,6 +467,8 @@ extern "C" int MPI_Waitall(int count, MPI_Request *request, MPI_Status *sts)
   ampi *ptr = CtvAccess(ampiPtr);
   int i;
   for(i=0;i<count;i++) {
+    if(request[i] == (-1))
+      continue;
     if(request[i] < 100) { // persistent request
       PersReq *req = &(ptr->requests[request[i]]);
       if(req->sndrcv == 2) { // recv request
@@ -473,6 +479,8 @@ extern "C" int MPI_Waitall(int count, MPI_Request *request, MPI_Status *sts)
     } else { // irecv request
       int index = request[i] - 100;
       PersReq *req = &(ptr->irequests[index]);
+      // CkPrintf("[%d] waiting for size=%d, tag=%d from %d\n", 
+              // ptr->getIndex(), req->size, req->tag, req->proc);
       ptr->ckTempoRecv(req->tag, req->proc, req->buf, req->size);
       // CkPrintf("[%d] received buf=%p, size=%d, tag=%d from %d\n", 
               // ptr->getIndex(), req->buf, req->size, req->tag, req->proc);
@@ -589,6 +597,7 @@ extern "C" int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest,
     ampi *ptr = CtvAccess(ampiPtr);
     ptr->ckTempoSendElem(tag, ptr->getIndex(), buf, 
                          typesize(datatype, count, ptr), dest);
+    *request = (-1);
     return 0;
 }
 
index 027c24f324f3540e0b43312561a79399863d2555..5e5e8a7894118e9f04de74c099fb8334deccd355 100644 (file)
@@ -65,6 +65,7 @@ class ampi : public TempoArray {
     PersReq irequests[100];
     int nirequests;
     int firstfree;
+    int nbcasts; // to keep bcasts from mixing up
     void *packedBlock;
 
     ampi(ArrayElementCreateMessage *msg);
index 6daff0319dd74607571f6c61652162e033982d8b..ad8a799c94b825af2760783d75fc032b7fdf6beb 100644 (file)
@@ -52,7 +52,7 @@ void
 main::qd(void)
 {
   // CkWaitQD();
-  CkPrintf("Created Elements\n");
+  // CkPrintf("Created Elements\n");
   CProxy_ampi jarray(arr);
   for(int i=0; i<nblocks; i++)
     jarray[i].run();
@@ -92,6 +92,7 @@ ampi::ampi(ArrayElementCreateMessage *msg) : TempoArray(msg)
     irequests[i].nextfree = (i+1)%100;
     irequests[i].prevfree = ((i-1)+100)%100;
   }
+  nbcasts = 0;
   // delete msg;
 }
 
@@ -168,7 +169,7 @@ ampi::run(void)
   CtvAccess(ampiPtr) = this;
   CtvAccess(numMigrateCalls) = 0;
 
-  //CkPrintf("[%d] main_ called\n", getIndex());
+  // CkPrintf("[%d] main_ called\n", getIndex());
   main_();
   myThis = (ampi*) ampiArray->getElement(myIdx);
   //CkPrintf("[%d] main_ finished\n", myThis->getIndex());
@@ -358,9 +359,12 @@ extern "C" int MPI_Bcast(void *buf, int count, int type, int root,
 {
   ampi *ptr = CtvAccess(ampiPtr);
   int size = typesize(type, count, ptr);
-  //CkPrintf("[%d] Broadcast called size=%d\n", ptr->getIndex(), size);
-  ptr->ckTempoBcast(((root)==ptr->getIndex())?1:0, MPI_BCAST_TAG, buf, size);
-  //CkPrintf("[%d] Broadcast finished\n", ptr->getIndex());
+  ptr->nbcasts++;
+  // CkPrintf("[%d] %dth Broadcast called size=%d\n", ptr->getIndex(), 
+           // ptr->nbcasts, size);
+  ptr->ckTempoBcast(((root)==ptr->getIndex())?1:0, 
+                    MPI_BCAST_TAG+ptr->nbcasts, buf, size);
+  // CkPrintf("[%d] %dth Broadcast finished\n", ptr->getIndex(), ptr->nbcasts);
   return 0;
 }
 
@@ -463,6 +467,8 @@ extern "C" int MPI_Waitall(int count, MPI_Request *request, MPI_Status *sts)
   ampi *ptr = CtvAccess(ampiPtr);
   int i;
   for(i=0;i<count;i++) {
+    if(request[i] == (-1))
+      continue;
     if(request[i] < 100) { // persistent request
       PersReq *req = &(ptr->requests[request[i]]);
       if(req->sndrcv == 2) { // recv request
@@ -473,6 +479,8 @@ extern "C" int MPI_Waitall(int count, MPI_Request *request, MPI_Status *sts)
     } else { // irecv request
       int index = request[i] - 100;
       PersReq *req = &(ptr->irequests[index]);
+      // CkPrintf("[%d] waiting for size=%d, tag=%d from %d\n", 
+              // ptr->getIndex(), req->size, req->tag, req->proc);
       ptr->ckTempoRecv(req->tag, req->proc, req->buf, req->size);
       // CkPrintf("[%d] received buf=%p, size=%d, tag=%d from %d\n", 
               // ptr->getIndex(), req->buf, req->size, req->tag, req->proc);
@@ -589,6 +597,7 @@ extern "C" int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest,
     ampi *ptr = CtvAccess(ampiPtr);
     ptr->ckTempoSendElem(tag, ptr->getIndex(), buf, 
                          typesize(datatype, count, ptr), dest);
+    *request = (-1);
     return 0;
 }
 
index 027c24f324f3540e0b43312561a79399863d2555..5e5e8a7894118e9f04de74c099fb8334deccd355 100644 (file)
@@ -65,6 +65,7 @@ class ampi : public TempoArray {
     PersReq irequests[100];
     int nirequests;
     int firstfree;
+    int nbcasts; // to keep bcasts from mixing up
     void *packedBlock;
 
     ampi(ArrayElementCreateMessage *msg);