fixing log problem, and little modification to the interface to allow
authorFilippo Gioachin <gioachin@illinois.edu>
Wed, 7 Jul 2004 03:48:36 +0000 (03:48 +0000)
committerFilippo Gioachin <gioachin@illinois.edu>
Wed, 7 Jul 2004 03:48:36 +0000 (03:48 +0000)
converse to register a destination for the messages

src/conv-com/convcomlibstrategy.C
src/conv-com/convcomlibstrategy.h
src/conv-com/pipebroadcastconverse.C
src/conv-com/pipebroadcastconverse.h

index a7caca3bbe167040c22dba82b299de2076ca519e..ed97437579a71996eecf3f6c45c45834c72bb6f7 100644 (file)
@@ -15,6 +15,7 @@ Strategy::Strategy() : PUP::able() {
     converseStrategy = this;
     higherLevel = this;
     isStrategyBracketed = 0;
+    destinationHandler = 0;
 };
 
 //Each strategy must define his own Pup interface.
@@ -24,6 +25,7 @@ void Strategy::pup(PUP::er &p){
 
     p | isStrategyBracketed;
     p | type;
+    p | destinationHandler;
 
     if (p.isUnpacking()) {
       converseStrategy = this;
index 38aab626bd9da1e5a1af01818ebfe84d5ccdfa38..be70223118a9b4e18d5b1821ddc6e2877a6ab596 100644 (file)
@@ -71,6 +71,7 @@ class Strategy : public PUP::able{
     int type;
     int isStrategyBracketed;
     int myInstanceID;
+    int destinationHandler;
 
     //Charm strategies for modularity may have converse strategies in
     //them.  For the code to work in both Charm and converse, this
@@ -100,6 +101,9 @@ class Strategy : public PUP::able{
     int getType() {return type;}
     void setType(int t) {type = t;}
 
+    void setDestination(int handler) {destinationHandler = handler;}
+    int getDestination() {return destinationHandler;}
+
     void setConverseStrategy(Strategy *s){
         converseStrategy = s;
     }
@@ -119,7 +123,7 @@ class Strategy : public PUP::able{
     //This method can be used to deliver a message through the correct class
     //when converse does not know if the message was originally sent from
     //converse itself of from a higher level language like charm
-    virtual void deliverer(char*) {CmiAbort("Strategy::deliverer: If used, should be first redefined\n");};
+    virtual void deliverer(char*, int) {CmiAbort("Strategy::deliverer: If used, should be first redefined\n");};
 
     //Each strategy must define his own Pup interface.
     virtual void pup(PUP::er &p);
index 2f631deedec4ec88153b059dd8abbb4327042819..f7149300a8f09bc7044a284f1c3626e2ce75d95d 100644 (file)
@@ -1,6 +1,12 @@
 #include <math.h>
 #include "pipebroadcastconverse.h"
 
+inline int log_of_2 (int i) {
+  int m;
+  for (m=0; i>(1<<m); ++m);
+  return m;
+}
+
 //PipeBcastHashKey CODE
 int PipeBcastHashKey::staticCompare(const void *k1,const void *k2,size_t ){
     return ((const PipeBcastHashKey *)k1)->
@@ -12,7 +18,7 @@ CkHashCode PipeBcastHashKey::staticHash(const void *v,size_t){
 }
 
 void PipeBroadcastConverse::commonInit(){
-  log_of_2_inv = 1/log((double)2);
+  //log_of_2_inv = 1/log((double)2);
   seqNumber = 0;
 }
 
@@ -43,7 +49,7 @@ void PipeBroadcastConverse::propagate(char *env, int isFragmented, int srcPeNumb
     break;
   case USE_HYPERCUBE:
     tmp = srcPeNumber ^ CmiMyPe();
-    k = int(log((double)CmiNumPes()) * log_of_2_inv + 2);
+    k = log_of_2(CmiNumPes()) + 2;
     if (tmp) {
       do {--k;} while (!(tmp>>k));
     }
@@ -93,6 +99,7 @@ void PipeBroadcastConverse::propagate(char *env, int isFragmented, int srcPeNumb
 void PipeBroadcastConverse::storing(char* fragment, int isFragmented) {
   char *complete;
   int isFinished=0;
+  int totalDimension;
   //ComlibPrintf("isArray = %d\n", (getType() == ARRAY_STRATEGY));
 
   // check if the message is fragmented
@@ -114,6 +121,7 @@ void PipeBroadcastConverse::storing(char* fragment, int isFragmented) {
       if (--position->remaining == 0) {  // message completely received
        isFinished = 1;
        complete = incomingMsg;
+       totalDimension = position->dimension;
        // delete from the hash table
        fragments.remove(key);
       }
@@ -143,12 +151,17 @@ void PipeBroadcastConverse::storing(char* fragment, int isFragmented) {
   }
 
   if (isFinished) {
-    higherLevel->deliverer(complete);
+    higherLevel->deliverer(complete, totalDimension);
   }
 }
 
-void PipeBroadcastConverse::deliverer(char *msg) {
-  // TO BE DONE
+void PipeBroadcastConverse::deliverer(char *msg, int dimension) {
+  if (destinationHandler) {
+    CmiSetHandler(msg, destinationHandler);
+    CmiSyncSendAndFree(CmiMyPe(), dimension, msg);
+  } else {
+    CmiPrintf("[%d] Pipelined Broadcast: message not delivered since destination not set!");
+  }
 }
 
 PipeBroadcastConverse::PipeBroadcastConverse(int _topology, int _pipeSize, Strategy *parent) : Strategy(), topology(_topology), pipeSize(_pipeSize) {
@@ -221,7 +234,7 @@ void PipeBroadcastConverse::pup(PUP::er &p){
   ComlibPrintf("[%d] PipeBroadcast converse pupping %s, size=%d, topology=%d\n",CmiMyPe(), (p.isPacking()==0)?(p.isUnpacking()?"UnPacking":"sizer"):("Packing"),pipeSize,topology);
 
   if (p.isUnpacking()) {
-    log_of_2_inv = 1/log((double)2);
+    //log_of_2_inv = 1/log((double)2);
     messageBuf = new CkQ<MessageHolder *>;
     propagateHandle_frag = CmiRegisterHandler((CmiHandler)propagate_handler_frag);
   }
index 533eaf7a885447f502dbfa924ea7a48de5f361f6..65f00cc92183756239b82d861ffb5da752bacaae 100644 (file)
@@ -67,7 +67,7 @@ class PipeBroadcastConverse : public Strategy {
 
   int pipeSize; // this is the size of the splitted messages, including the converse header
   int topology;
-  double log_of_2_inv;
+  //double log_of_2_inv;
   int seqNumber;
   CkQ <MessageHolder*> *messageBuf;
   CkHashtableT<PipeBcastHashKey, PipeBcastHashObj *> fragments;
@@ -79,7 +79,7 @@ class PipeBroadcastConverse : public Strategy {
   PipeBroadcastConverse(CkMigrateMessage *) {};
   int getPipeSize() { return pipeSize; };
   void commonInit();
-  void deliverer(char *msg);
+  void deliverer(char *msg, int dim);
   void storing(char *msg, int isFrag);
   void propagate(char *msg, int isFrag, int srcPeNumber, int totalSendingSize, setFunction setPeNumber);