1515#include " cxlcounter.h"
1616#include " helper.h"
1717#include < list>
18+ #include < queue>
1819#include < map>
1920#include < string>
2021#include < tuple>
2122#include < unordered_map>
2223#include < vector>
24+ #define ROB_SIZE 512
2325
26+ struct occupation_info {
27+ uint64_t timestamp;
28+ uint64_t address;
29+ uint64_t access_count;
30+ };
31+ struct rob_info {
32+ std::map<int , int64_t > m_bandwidth, m_count;
33+ int64_t llcm_base, llcm_count, ins_count;
34+ };
35+ struct thread_info {
36+ rob_info rob;
37+ std::queue<int > llcm_type;
38+ std::queue<int > llcm_type_rob;
39+ };
2440// Forward declarations
2541class CXLController ;
2642class CXLEndPoint {
@@ -30,22 +46,22 @@ class CXLEndPoint {
3046private:
3147 virtual void set_epoch (int epoch) = 0;
3248 virtual void free_stats (double size) = 0;
33- virtual std::string output () = 0;
3449 virtual void delete_entry (uint64_t addr, uint64_t length) = 0;
35- virtual double calculate_latency (const std::vector<std::tuple<int , int >> &elem,
50+ virtual double calculate_latency (const std::vector<std::tuple<uint64_t , uint64_t >> &elem,
3651 double dramlatency) = 0; // traverse the tree to calculate the latency
37- virtual double calculate_bandwidth (const std::vector<std::tuple<int , int >> &elem) = 0;
52+ virtual double calculate_bandwidth (const std::vector<std::tuple<uint64_t , uint64_t >> &elem) = 0;
3853 virtual int insert (uint64_t timestamp, uint64_t tid, uint64_t phys_addr, uint64_t virt_addr,
3954 int index) = 0; // 0 not this endpoint, 1 store, 2 load, 3 prefetch
40- virtual std::vector<std::tuple<int , int >> get_access (uint64_t timestamp) = 0;
55+ virtual std::vector<std::tuple<uint64_t , uint64_t >> get_access (uint64_t timestamp) = 0;
4156};
4257
4358class CXLMemExpander : public CXLEndPoint {
4459public:
45- EmuCXLBandwidth bandwidth;
46- EmuCXLLatency latency;
60+ EmuCXLBandwidth bandwidth{} ;
61+ EmuCXLLatency latency{} ;
4762 uint64_t capacity;
48- std::map<uint64_t , uint64_t > occupation; // timestamp, pa
63+
64+ std::vector<occupation_info> occupation; // timestamp, pa
4965 CXLMemExpanderEvent counter{};
5066 CXLMemExpanderEvent last_counter{};
5167
@@ -58,15 +74,14 @@ class CXLMemExpander : public CXLEndPoint {
5874 uint64_t last_timestamp = 0 ;
5975 int id = -1 ;
6076 CXLMemExpander (int read_bw, int write_bw, int read_lat, int write_lat, int id, int capacity);
61- std::vector<std::tuple<int , int >> get_access (uint64_t timestamp) override ;
77+ std::vector<std::tuple<uint64_t , uint64_t >> get_access (uint64_t timestamp) override ;
6278 void set_epoch (int epoch) override ;
6379 void free_stats (double size) override ;
6480 int insert (uint64_t timestamp, uint64_t tid, uint64_t phys_addr, uint64_t virt_addr, int index) override ;
65- double calculate_latency (const std::vector<std::tuple<int , int >> &elem,
81+ double calculate_latency (const std::vector<std::tuple<uint64_t , uint64_t >> &elem,
6682 double dramlatency) override ; // traverse the tree to calculate the latency
67- double calculate_bandwidth (const std::vector<std::tuple<int , int >> &elem) override ;
83+ double calculate_bandwidth (const std::vector<std::tuple<uint64_t , uint64_t >> &elem) override ;
6884 void delete_entry (uint64_t addr, uint64_t length) override ;
69- std::string output () override ;
7085};
7186class CXLSwitch : public CXLEndPoint {
7287public:
@@ -76,18 +91,21 @@ class CXLSwitch : public CXLEndPoint {
7691 int id = -1 ;
7792 int epoch = 0 ;
7893 uint64_t last_timestamp = 0 ;
79- // get the approximate congestion and target done time
94+ // TODO get the approximate congestion and target done time
8095 std::unordered_map<uint64_t , uint64_t > timeseries_map;
8196
82- double congestion_latency = 0.02 ; // us
97+ double congestion_latency = 90 ; // 200ns is the latency of the switch
8398 explicit CXLSwitch (int id);
84- std::vector<std::tuple<int , int >> get_access (uint64_t timestamp) override ;
85- double calculate_latency (const std::vector<std::tuple<int , int >> &elem,
99+ std::vector<std::tuple<uint64_t , uint64_t >> get_access (uint64_t timestamp) override ;
100+ double calculate_latency (const std::vector<std::tuple<uint64_t , uint64_t >> &elem,
86101 double dramlatency) override ; // traverse the tree to calculate the latency
87- double calculate_bandwidth (const std::vector<std::tuple<int , int >> &elem) override ;
102+ double calculate_bandwidth (const std::vector<std::tuple<uint64_t , uint64_t >> &elem) override ;
103+ double get_endpoint_rob_latency (CXLMemExpander* endpoint,
104+ const std::vector<std::tuple<uint64_t , uint64_t >>& accesses,
105+ const thread_info& t_info,
106+ double dramlatency);
88107 int insert (uint64_t timestamp, uint64_t tid, uint64_t phys_addr, uint64_t virt_addr, int index) override ;
89108 void delete_entry (uint64_t addr, uint64_t length) override ;
90- std::string output () override ;
91109 virtual std::tuple<double , std::vector<uint64_t >> calculate_congestion ();
92110 void set_epoch (int epoch) override ;
93111 void free_stats (double size) override ;
0 commit comments