MeshStreamer: rewrote location caching scheme using arrays instead of a map
authorLukasz Wesolowski <wesolwsk@illinois.edu>
Mon, 2 Jan 2012 07:21:11 +0000 (01:21 -0600)
committerLukasz Wesolowski <wesolwsk@illinois.edu>
Mon, 2 Jan 2012 07:21:11 +0000 (01:21 -0600)
to reduce overhead. With the optimization RandomAccess still runs a little
slower than without it so I am leaving it off by default.

src/libs/ck-libs/MeshStreamer/MeshStreamer.h

index 9fe44f263c55423ca089d50d1a4b5daa4167d4ad..fd3343e3411d641f7d09c8e994b96c7b7bc8bc0f 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef _MESH_STREAMER_H_
 #define _MESH_STREAMER_H_
 
 #ifndef _MESH_STREAMER_H_
 #define _MESH_STREAMER_H_
 
+#include <algorithm>
 #include "MeshStreamer.decl.h"
 // allocate more total buffer space than the maximum buffering limit but flush upon
 // reaching totalBufferCapacity_
 #include "MeshStreamer.decl.h"
 // allocate more total buffer space than the maximum buffering limit but flush upon
 // reaching totalBufferCapacity_
@@ -18,11 +19,7 @@ class MeshLocation {
   MeshStreamerMessageType msgType;
 };
 
   MeshStreamerMessageType msgType;
 };
 
-//#define HASH_LOCATIONS
-
-#ifdef HASH_LOCATIONS
-#include <map>
-#endif
+// #define CACHE_LOCATIONS
 
 /*
 class LocalMessage : public CMessage_LocalMessage {
 
 /*
 class LocalMessage : public CMessage_LocalMessage {
@@ -111,8 +108,9 @@ private:
     MeshStreamerMessage<dtype> **columnBuffers_; 
     MeshStreamerMessage<dtype> **planeBuffers_;
 
     MeshStreamerMessage<dtype> **columnBuffers_; 
     MeshStreamerMessage<dtype> **planeBuffers_;
 
-#ifdef HASH_LOCATIONS
-    std::map<int, MeshLocation> hashedLocations; 
+#ifdef CACHE_LOCATIONS
+    MeshLocation *cachedLocations;
+    bool *isCached; 
 #endif
 
     void determineLocation(const int destinationPe, 
 #endif
 
     void determineLocation(const int destinationPe, 
@@ -219,6 +217,13 @@ MeshStreamer<dtype>::MeshStreamer(int totalBufferCapacity, int numRows,
   myColumnIndex_ = indexWithinPlane - myRowIndex_ * numColumns_; 
 
   isPeriodicFlushEnabled_ = false; 
   myColumnIndex_ = indexWithinPlane - myRowIndex_ * numColumns_; 
 
   isPeriodicFlushEnabled_ = false; 
+
+#ifdef CACHE_LOCATIONS
+  cachedLocations = new MeshLocation[numNodes_];
+  isCached = new bool[numNodes_];
+  std::fill(isCached, isCached + numNodes_, false);
+#endif
+
 }
 
 template <class dtype>
 }
 
 template <class dtype>
@@ -245,10 +250,9 @@ void MeshStreamer<dtype>::determineLocation(const int destinationPe,
 
   int nodeIndex, indexWithinPlane; 
 
 
   int nodeIndex, indexWithinPlane; 
 
-#ifdef HASH_LOCATIONS
-  std::map<int, MeshLocation>::iterator it;
-  if ((it = hashedLocations.find(destinationPe)) != hashedLocations.end()) {
-    destinationCoordinates = it->second;
+#ifdef CACHE_LOCATIONS
+  if (isCached[destinationPe] == true) {
+    destinationCoordinates = cachedLocations[destinationPe]; 
     return;
   }
 #endif
     return;
   }
 #endif
@@ -272,8 +276,8 @@ void MeshStreamer<dtype>::determineLocation(const int destinationPe,
     }
   }
 
     }
   }
 
-#ifdef HASH_LOCATIONS
-  hashedLocations[destinationPe] = destinationCoordinates;
+#ifdef CACHE_LOCATIONS
+  cachedLocations[destinationPe] = destinationCoordinates;
 #endif
 
 }
 #endif
 
 }