Skip to content

Commit 04f24e0

Browse files
committed
Refactor cache_init.h for better extensibility
1 parent 7596556 commit 04f24e0

1 file changed

Lines changed: 63 additions & 82 deletions

File tree

libCacheSim/bin/cachesim/cache_init.h

Lines changed: 63 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -24,48 +24,73 @@ static inline cache_t *create_cache(const char *trace_path, const char *eviction
2424

2525
/* the trace provided is small */
2626
if (trace_path != NULL && strstr(trace_path, "data/trace.") != NULL) cc_params.hashpower -= 8;
27+
typedef struct {
28+
const char *name;
29+
cache_t *(*init_func)(common_cache_params_t, const char *);
30+
} eviction_algo_entry_t;
2731

28-
if (strcasecmp(eviction_algo, "lru") == 0) {
29-
cache = LRU_init(cc_params, eviction_params);
30-
} else if (strcasecmp(eviction_algo, "fifo") == 0) {
31-
cache = FIFO_init(cc_params, eviction_params);
32-
} else if (strcasecmp(eviction_algo, "arc") == 0) {
33-
cache = ARC_init(cc_params, eviction_params);
34-
} else if (strcasecmp(eviction_algo, "arcv0") == 0) {
35-
cache = ARCv0_init(cc_params, eviction_params);
36-
} else if (strcasecmp(eviction_algo, "lhd") == 0) {
37-
cache = LHD_init(cc_params, eviction_params);
38-
} else if (strcasecmp(eviction_algo, "random") == 0) {
39-
cache = Random_init(cc_params, eviction_params);
40-
} else if (strcasecmp(eviction_algo, "randomTwo") == 0) {
41-
cache = RandomTwo_init(cc_params, eviction_params);
42-
} else if (strcasecmp(eviction_algo, "lfu") == 0) {
43-
cache = LFU_init(cc_params, eviction_params);
44-
} else if (strcasecmp(eviction_algo, "gdsf") == 0) {
45-
cache = GDSF_init(cc_params, eviction_params);
46-
} else if (strcasecmp(eviction_algo, "lfuda") == 0) {
47-
cache = LFUDA_init(cc_params, eviction_params);
48-
} else if (strcasecmp(eviction_algo, "twoq") == 0 || strcasecmp(eviction_algo, "2q") == 0) {
49-
cache = TwoQ_init(cc_params, eviction_params);
50-
} else if (strcasecmp(eviction_algo, "slru") == 0) {
51-
cache = SLRU_init(cc_params, eviction_params);
52-
} else if (strcasecmp(eviction_algo, "slruv0") == 0) {
53-
cache = SLRUv0_init(cc_params, eviction_params);
32+
static const eviction_algo_entry_t simple_algos[] = {
33+
{"lru", LRU_init},
34+
{"fifo", FIFO_init},
35+
{"arc", ARC_init},
36+
{"arcv0", ARCv0_init},
37+
{"lhd", LHD_init},
38+
{"random", Random_init},
39+
{"randomTwo", RandomTwo_init},
40+
{"lfu", LFU_init},
41+
{"gdsf", GDSF_init},
42+
{"lfuda", LFUDA_init},
43+
{"twoq", TwoQ_init},
44+
{"2q", TwoQ_init},
45+
{"slru", SLRU_init},
46+
{"slruv0", SLRUv0_init},
47+
{"lecar", LeCaR_init},
48+
{"lecarv0", LeCaRv0_init},
49+
{"RandomLRU", RandomLRU_init},
50+
{"cacheus", Cacheus_init},
51+
{"size", Size_init},
52+
{"lfucpp", LFUCpp_init},
53+
{"wtinyLFU", WTinyLFU_init},
54+
{"nop", nop_init},
55+
{"fifo-reinsertion", Clock_init},
56+
{"clock", Clock_init},
57+
{"second-chance", Clock_init},
58+
{"clockpro", ClockPro_init},
59+
{"lirs", LIRS_init},
60+
{"fifomerge", FIFO_Merge_init},
61+
{"fifo-merge", FIFO_Merge_init},
62+
{"flashProb", flashProb_init},
63+
{"sfifo", SFIFO_init},
64+
{"sfifov0", SFIFOv0_init},
65+
{"lru-prob", LRU_Prob_init},
66+
{"fifo-belady", FIFO_Belady_init},
67+
{"lru-belady", LRU_Belady_init},
68+
{"sieve-belady", Sieve_Belady_init},
69+
{"s3lru", S3LRU_init},
70+
{"s3fifo", S3FIFO_init},
71+
{"s3-fifo", S3FIFO_init},
72+
{"s3fifov0", S3FIFOv0_init},
73+
{"s3-fifov0", S3FIFOv0_init},
74+
{"s3fifod", S3FIFOd_init},
75+
{"qdlp", QDLP_init},
76+
{"CAR", CAR_init},
77+
{"sieve", Sieve_init},
78+
};
79+
80+
cache_t *(*init_func)(common_cache_params_t, const char *) = NULL;
81+
for (size_t i = 0; i < sizeof(simple_algos) / sizeof(simple_algos[0]); ++i) {
82+
if (strcasecmp(eviction_algo, simple_algos[i].name) == 0) {
83+
init_func = simple_algos[i].init_func;
84+
break;
85+
}
86+
}
87+
88+
// Initializing for algorithms which require special handling (not in simple_algos)
89+
if (init_func) {
90+
cache = init_func(cc_params, eviction_params);
5491
} else if (strcasecmp(eviction_algo, "hyperbolic") == 0) {
5592
cc_params.hashpower = MAX(cc_params.hashpower - 8, 16);
5693
cache = Hyperbolic_init(cc_params, eviction_params);
57-
} else if (strcasecmp(eviction_algo, "lecar") == 0) {
58-
cache = LeCaR_init(cc_params, eviction_params);
59-
} else if (strcasecmp(eviction_algo, "lecarv0") == 0) {
60-
cache = LeCaRv0_init(cc_params, eviction_params);
61-
} else if (strcasecmp(eviction_algo, "RandomLRU") == 0) {
62-
cache = RandomLRU_init(cc_params, eviction_params);
63-
} else if (strcasecmp(eviction_algo, "cacheus") == 0) {
64-
cache = Cacheus_init(cc_params, eviction_params);
65-
} else if (strcasecmp(eviction_algo, "size") == 0) {
66-
cache = Size_init(cc_params, eviction_params);
67-
} else if (strcasecmp(eviction_algo, "lfucpp") == 0) {
68-
cache = LFUCpp_init(cc_params, eviction_params);
6994
} else if (strcasecmp(eviction_algo, "tinyLFU") == 0) {
7095
if (eviction_params == NULL) {
7196
cache = WTinyLFU_init(cc_params, eviction_params);
@@ -79,8 +104,6 @@ static inline cache_t *create_cache(const char *trace_path, const char *eviction
79104
cache = WTinyLFU_init(cc_params, eviction_params);
80105
}
81106
}
82-
} else if (strcasecmp(eviction_algo, "wtinyLFU") == 0) {
83-
cache = WTinyLFU_init(cc_params, eviction_params);
84107
} else if (strcasecmp(eviction_algo, "belady") == 0 && strcasestr(trace_path, "lcs") == NULL) {
85108
if (strcasestr(trace_path, "oracleGeneral") == NULL) {
86109
WARN("belady is only supported for oracleGeneral and lcs trace\n");
@@ -90,8 +113,6 @@ static inline cache_t *create_cache(const char *trace_path, const char *eviction
90113
exit(1);
91114
}
92115
cache = Belady_init(cc_params, eviction_params);
93-
} else if (strcasecmp(eviction_algo, "nop") == 0) {
94-
cache = nop_init(cc_params, eviction_params);
95116
} else if (strcasecmp(eviction_algo, "beladySize") == 0) {
96117
if (strcasestr(trace_path, "oracleGeneral") == NULL && strcasestr(trace_path, "lcs") == NULL) {
97118
WARN("beladySize is only supported for oracleGeneral and lcs trace\n");
@@ -102,46 +123,6 @@ static inline cache_t *create_cache(const char *trace_path, const char *eviction
102123
}
103124
cc_params.hashpower = MAX(cc_params.hashpower - 8, 16);
104125
cache = BeladySize_init(cc_params, eviction_params);
105-
} else if (strcasecmp(eviction_algo, "fifo-reinsertion") == 0 || strcasecmp(eviction_algo, "clock") == 0 ||
106-
strcasecmp(eviction_algo, "second-chance") == 0) {
107-
cache = Clock_init(cc_params, eviction_params);
108-
} else if (strcasecmp(eviction_algo, "clockpro") == 0) {
109-
cache = ClockPro_init(cc_params, eviction_params);
110-
} else if (strcasecmp(eviction_algo, "lirs") == 0) {
111-
cache = LIRS_init(cc_params, eviction_params);
112-
} else if (strcasecmp(eviction_algo, "fifomerge") == 0 || strcasecmp(eviction_algo, "fifo-merge") == 0) {
113-
cache = FIFO_Merge_init(cc_params, eviction_params);
114-
// } else if (strcasecmp(eviction_algo, "fifo-reinsertion") == 0) {
115-
// cache = FIFO_Reinsertion_init(cc_params, eviction_params);
116-
} else if (strcasecmp(eviction_algo, "flashProb") == 0) {
117-
// used to measure application level write amp
118-
cache = flashProb_init(cc_params, eviction_params);
119-
} else if (strcasecmp(eviction_algo, "sfifo") == 0) {
120-
cache = SFIFO_init(cc_params, eviction_params);
121-
} else if (strcasecmp(eviction_algo, "sfifov0") == 0) {
122-
cache = SFIFOv0_init(cc_params, eviction_params);
123-
} else if (strcasecmp(eviction_algo, "lru-prob") == 0) {
124-
cache = LRU_Prob_init(cc_params, eviction_params);
125-
} else if (strcasecmp(eviction_algo, "fifo-belady") == 0) {
126-
cache = FIFO_Belady_init(cc_params, eviction_params);
127-
} else if (strcasecmp(eviction_algo, "lru-belady") == 0) {
128-
cache = LRU_Belady_init(cc_params, eviction_params);
129-
} else if (strcasecmp(eviction_algo, "sieve-belady") == 0) {
130-
cache = Sieve_Belady_init(cc_params, eviction_params);
131-
} else if (strcasecmp(eviction_algo, "s3lru") == 0) {
132-
cache = S3LRU_init(cc_params, eviction_params);
133-
} else if (strcasecmp(eviction_algo, "s3fifo") == 0 || strcasecmp(eviction_algo, "s3-fifo") == 0) {
134-
cache = S3FIFO_init(cc_params, eviction_params);
135-
} else if (strcasecmp(eviction_algo, "s3fifov0") == 0 || strcasecmp(eviction_algo, "s3-fifov0") == 0) {
136-
cache = S3FIFOv0_init(cc_params, eviction_params);
137-
} else if (strcasecmp(eviction_algo, "s3fifod") == 0) {
138-
cache = S3FIFOd_init(cc_params, eviction_params);
139-
} else if (strcasecmp(eviction_algo, "qdlp") == 0) {
140-
cache = QDLP_init(cc_params, eviction_params);
141-
} else if(strcasecmp(eviction_algo, "CAR") == 0) {
142-
cache = CAR_init(cc_params, eviction_params);
143-
} else if (strcasecmp(eviction_algo, "sieve") == 0) {
144-
cache = Sieve_init(cc_params, eviction_params);
145126
#ifdef ENABLE_3L_CACHE
146127
} else if (strcasecmp(eviction_algo, "3LCache") == 0) {
147128
cache = ThreeLCache_init(cc_params, eviction_params);

0 commit comments

Comments
 (0)