00001
00032 #include <assert.h>
00033 #include <stdlib.h>
00034 #include <tree234.h>
00035
00036 #include <algorithm>
00037 #include <iostream>
00038 #include <ostream>
00039 #include <list>
00040 #include <map>
00041 #include <vector>
00042
00043
00044 #ifdef HAVE_UNORDERED_MAP
00045 #include <unordered_map>
00046 #define reuse_map_type std::unordered_map
00047 #else
00048 #define reuse_map_type std::map
00049 #endif
00050
00051 #define TAB "\t"
00052 #define ENDL "\n"
00053
00054 #define __seq id
00055 int reusecmp (void* va, void* vb);
00056
00057 #define INFINITY_REUSE (0)
00058 #define INVALID_SPATIAL (0xFFFFFFFFFFFFFFFFL)
00059
00069 struct ReuseEntry {
00070 uint64_t id;
00071 uint64_t address;
00072 };
00073
00074
00075 class ReuseStats;
00076
00086 class ReuseDistance {
00087 private:
00088
00089 tree234* window;
00090
00091
00092 reuse_map_type<uint64_t, uint64_t> mwindow;
00093
00094 uint64_t current;
00095
00096 protected:
00097
00098
00099 reuse_map_type<uint64_t, ReuseStats*> stats;
00100
00101 uint64_t capacity;
00102 uint64_t sequence;
00103 uint64_t binindividual;
00104 uint64_t maxtracking;
00105
00106 void Init(uint64_t w, uint64_t b);
00107 virtual ReuseStats* GetStats(uint64_t id, bool gen);
00108 virtual const std::string Describe() { return "REUSE"; }
00109
00110 public:
00111
00112 static const uint64_t DefaultBinIndividual = 32;
00113 static const uint64_t Infinity = INFINITY_REUSE;
00114
00126 ReuseDistance(uint64_t w, uint64_t b);
00127
00132 ReuseDistance(uint64_t w);
00133
00137 virtual ~ReuseDistance();
00138
00165 virtual void Print(std::ostream& f, bool annotate=false);
00166
00175 virtual void Print(bool annotate=false);
00176
00184 void PrintFormat(std::ostream& f);
00185
00193 virtual void Process(ReuseEntry& addr);
00194
00203 void Process(ReuseEntry* addrs, uint64_t count);
00204
00212 void Process(std::vector<ReuseEntry> rs);
00213
00221 void Process(std::vector<ReuseEntry*> addrs);
00222
00230 ReuseStats* GetStats(uint64_t id);
00231
00241 void GetIndices(std::vector<uint64_t>& ids);
00242
00252 virtual void GetActiveAddresses(std::vector<uint64_t>& addrs);
00253
00262 virtual void SkipAddresses(uint64_t amount);
00263 };
00264
00270 class ReuseStats {
00271 private:
00272 reuse_map_type<uint64_t, uint64_t> distcounts;
00273 uint64_t accesses;
00274
00275 uint64_t id;
00276 uint64_t binindividual;
00277 uint64_t maxtracking;
00278 uint64_t invalid;
00279
00280 uint64_t GetBin(uint64_t value);
00281
00282 public:
00283
00292 ReuseStats(uint64_t idx, uint64_t bin, uint64_t num, uint64_t inv)
00293 : accesses(0), id(idx), binindividual(bin), maxtracking(num), invalid(inv) {}
00294
00298 ~ReuseStats() {}
00299
00307 void Update(uint64_t dist);
00308
00315 void Miss();
00316
00323 virtual uint64_t GetMissCount();
00324
00333 virtual void Print(std::ostream& f, bool annotate=false);
00334
00342 static void PrintFormat(std::ostream& f);
00343
00352 void GetSortedDistances(std::vector<uint64_t>& dists);
00353
00359 uint64_t GetMaximumDistance();
00360
00368 uint64_t CountDistance(uint64_t dist);
00369
00375 uint64_t GetAccessCount();
00376 };
00377
00388 class SpatialLocality : public ReuseDistance {
00389 private:
00390
00391
00392 std::map<uint64_t, uint64_t> awindow;
00393
00394
00395 std::list<uint64_t> swindow;
00396
00397
00398 void Init(uint64_t size, uint64_t bin, uint64_t max);
00399
00400 virtual ReuseStats* GetStats(uint64_t id, bool gen);
00401 virtual const std::string Describe() { return "SPATIAL"; }
00402
00403 static const uint64_t Invalid = INVALID_SPATIAL;
00404
00405 public:
00406
00407 static const uint64_t DefaultWindowSize = 64;
00408
00420 SpatialLocality(uint64_t w, uint64_t b, uint64_t n) : ReuseDistance(0) { SpatialLocality::Init(w, b, n); }
00421
00426 SpatialLocality(uint64_t w, uint64_t b) : ReuseDistance(0) { SpatialLocality::Init(w, b, INFINITY_REUSE); }
00427
00432 SpatialLocality(uint64_t w) : ReuseDistance(0) { SpatialLocality::Init(w, w, INFINITY_REUSE); }
00433
00438 SpatialLocality() : ReuseDistance(0) { SpatialLocality::Init(DefaultWindowSize, DefaultWindowSize, INFINITY_REUSE); }
00439
00443 virtual ~SpatialLocality() {}
00444
00454 virtual void GetActiveAddresses(std::vector<uint64_t>& addrs);
00455
00463 virtual void Process(ReuseEntry& addr);
00464
00473 virtual void SkipAddresses(uint64_t amount);
00474 };