Skip to content

Commit 5fa68ef

Browse files
authored
Merge pull request #17 from zztaki/support-Mithril
add prefetch module && mv Mithril to prefetch
2 parents 0f4d135 + 9747163 commit 5fa68ef

File tree

21 files changed

+1938
-201
lines changed

21 files changed

+1938
-201
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ message(STATUS "========================================================")
244244
# library compilation #
245245
########################################
246246
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
247-
set(ALL_MODULES cachelib admission evictionC evictionCPP traceReader profiler dataStructure ds_hash utils)
247+
set(ALL_MODULES cachelib admission prefetch evictionC evictionCPP traceReader profiler dataStructure ds_hash utils)
248248

249249
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libCacheSim/cache)
250250
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libCacheSim/dataStructure)

libCacheSim/bin/cachesim/cache_init.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11

2+
#include <strings.h>
23
#define _GNU_SOURCE
34
#include <stdio.h>
45
#include <stdlib.h>

libCacheSim/bin/cachesim/cli_parser.c

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "../../include/libCacheSim/const.h"
1010
#include "../../include/libCacheSim/dist.h"
11+
#include "../../include/libCacheSim/prefetchAlgo.h"
1112
#include "../../utils/include/mystr.h"
1213
#include "../../utils/include/mysys.h"
1314
#include "../cli_reader_utils.h"
@@ -43,6 +44,9 @@ enum argp_option_short {
4344
OPTION_NUM_THREAD = 0x106,
4445
OPTION_SAMPLE_RATIO = 's',
4546
OPTION_REPORT_INTERVAL = 0x108,
47+
48+
OPTION_PREFETCH_ALGO = 'p',
49+
OPTION_PREFETCH_PARAMS = 0x109,
4650
};
4751

4852
/*
@@ -61,12 +65,17 @@ static struct argp_option options[] = {
6165
"Sample ratio, 1 means no sampling, 0.01 means sample 1% of objects", 2},
6266

6367
{NULL, 0, NULL, 0, "cache related parameters:", 0},
64-
{"eviction-params", OPTION_EVICTION_PARAMS, "\"n-seg=\"4", 0,
68+
{"eviction-params", OPTION_EVICTION_PARAMS, "\"n-seg=4\"", 0,
6569
"optional params for each eviction algorithm, e.g., n-seg=4", 4},
6670
{"admission", OPTION_ADMISSION_ALGO, "bloom-filter", 0,
6771
"Admission algorithm: size/bloom-filter/prob", 4},
6872
{"admission-params", OPTION_ADMISSION_PARAMS, "\"prob=0.8\"", 0,
6973
"params for admission algorithm", 4},
74+
{"prefetch", OPTION_PREFETCH_ALGO, "Mithril", 0,
75+
"Prefetching algorithm: Mithril", 4},
76+
{"prefetch-params", OPTION_PREFETCH_PARAMS, "\"block-size=65536\"", 0,
77+
"optional params for each prefetching algorithm, e.g., block-size=65536",
78+
4},
7079

7180
{0, 0, 0, 0, "Other options:"},
7281
{"ignore-obj-size", OPTION_IGNORE_OBJ_SIZE, "false", 0,
@@ -85,8 +94,7 @@ static struct argp_option options[] = {
8594
"Whether consider per object metadata size in the simulated cache", 10},
8695
{"verbose", OPTION_VERBOSE, "1", 0, "Produce verbose output", 10},
8796

88-
{0}
89-
};
97+
{0}};
9098

9199
/*
92100
PARSER. Field 2 in ARGP.
@@ -113,11 +121,19 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
113121
case OPTION_ADMISSION_ALGO:
114122
arguments->admission_algo = arg;
115123
break;
124+
case OPTION_PREFETCH_ALGO:
125+
arguments->prefetch_algo = arg;
126+
break;
116127
case OPTION_ADMISSION_PARAMS:
117128
arguments->admission_params = strdup(arg);
118129
replace_char(arguments->admission_params, ';', ',');
119130
replace_char(arguments->admission_params, '_', '-');
120131
break;
132+
case OPTION_PREFETCH_PARAMS:
133+
arguments->prefetch_params = strdup(arg);
134+
replace_char(arguments->prefetch_params, ';', ',');
135+
replace_char(arguments->prefetch_params, '_', '-');
136+
break;
121137
case OPTION_OUTPUT_PATH:
122138
strncpy(arguments->ofilepath, arg, OFILEPATH_LEN);
123139
break;
@@ -195,7 +211,9 @@ static void init_arg(struct arguments *args) {
195211
args->trace_path = NULL;
196212
args->eviction_params = NULL;
197213
args->admission_algo = NULL;
214+
args->prefetch_algo = NULL;
198215
args->admission_params = NULL;
216+
args->prefetch_params = NULL;
199217
args->trace_type_str = NULL;
200218
args->trace_type_params = NULL;
201219
args->verbose = true;
@@ -322,6 +340,11 @@ void parse_cmd(int argc, char *argv[], struct arguments *args) {
322340
args->caches[idx]->admissioner =
323341
create_admissioner(args->admission_algo, args->admission_params);
324342
}
343+
344+
if (args->prefetch_algo != NULL) {
345+
args->caches[idx]->prefetcher = create_prefetcher(
346+
args->prefetch_algo, args->prefetch_params, args->cache_sizes[j]);
347+
}
325348
}
326349
}
327350

@@ -492,6 +515,16 @@ void print_parsed_args(struct arguments *args) {
492515
n += snprintf(output_str + n, OUTPUT_STR_LEN - n - 1,
493516
", admission-params: %s", args->admission_params);
494517

518+
if (args->prefetch_algo != NULL) {
519+
n += snprintf(output_str + n, OUTPUT_STR_LEN - n - 1, ", prefetch: %s",
520+
args->prefetch_algo);
521+
}
522+
523+
if (args->prefetch_params != NULL) {
524+
n += snprintf(output_str + n, OUTPUT_STR_LEN - n - 1,
525+
", prefetch-params: %s", args->prefetch_params);
526+
}
527+
495528
if (args->eviction_params != NULL)
496529
n += snprintf(output_str + n, OUTPUT_STR_LEN - n - 1,
497530
", eviction-params: %s", args->eviction_params);

libCacheSim/bin/cachesim/internal.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ struct arguments {
2525
char *eviction_algo[N_MAX_ALGO];
2626
int n_eviction_algo;
2727
char *admission_algo;
28+
char *prefetch_algo;
2829
uint64_t cache_sizes[N_MAX_CACHE_SIZE];
2930
int n_cache_size;
3031
int warmup_sec;
@@ -35,6 +36,7 @@ struct arguments {
3536
char *trace_type_params;
3637
char *eviction_params;
3738
char *admission_params;
39+
char *prefetch_params;
3840
double sample_ratio;
3941
int n_thread;
4042
int64_t n_req; /* number of requests to process */
@@ -64,4 +66,3 @@ void print_parsed_args(struct arguments *args);
6466
#ifdef __cplusplus
6567
}
6668
#endif
67-

libCacheSim/cache/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11

22
include_directories(admission)
33
include_directories(eviction)
4+
include_directories(prefetch)
45

56
add_subdirectory(admission)
67
add_subdirectory(eviction)
8+
add_subdirectory(prefetch)
79

810
add_library(cachelib cache.c cacheObj.c)
911
target_link_libraries(cachelib dataStructure)

libCacheSim/cache/admission/adaptsize.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ void free_adaptsize_admissioner(admissioner_t *admissioner) {
6262
static_cast<adaptsize_admission_params_t *>(admissioner->params);
6363

6464
free(pa);
65+
if (admissioner->init_params) {
66+
free(admissioner->init_params);
67+
}
6568
free(admissioner);
6669
}
6770

libCacheSim/cache/admission/bloomfilter.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ typedef struct bloomfilter_admission {
1818
bool bloomfilter_admit(admissioner_t *admissioner, const request_t *req) {
1919
bf_admission_params_t *bf = admissioner->params;
2020
gpointer key = GINT_TO_POINTER(req->obj_id);
21-
gpointer n_times = g_hash_table_lookup(bf->seen_times, GSIZE_TO_POINTER(req->obj_id));
21+
gpointer n_times =
22+
g_hash_table_lookup(bf->seen_times, GSIZE_TO_POINTER(req->obj_id));
2223
if (n_times == NULL) {
2324
g_hash_table_insert(bf->seen_times, key, GINT_TO_POINTER(1));
2425
return false;
@@ -37,6 +38,9 @@ void free_bloomfilter_admissioner(admissioner_t *admissioner) {
3738
struct bloomfilter_admission *bf = admissioner->params;
3839
g_hash_table_destroy(bf->seen_times);
3940
free(bf);
41+
if (admissioner->init_params) {
42+
free(admissioner->init_params);
43+
}
4044
free(admissioner);
4145
}
4246

libCacheSim/cache/admission/prob.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ void free_prob_admissioner(admissioner_t *admissioner) {
7575
prob_admission_params_t *pa = admissioner->params;
7676

7777
free(pa);
78+
if (admissioner->init_params) {
79+
free(admissioner->init_params);
80+
}
7881
free(admissioner);
7982
}
8083

libCacheSim/cache/admission/size.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ void free_size_admissioner(admissioner_t *admissioner) {
6464
size_admission_params_t *pa = admissioner->params;
6565

6666
free(pa);
67+
if (admissioner->init_params) {
68+
free(admissioner->init_params);
69+
}
6770
free(admissioner);
6871
}
6972

libCacheSim/cache/cache.c

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "../include/libCacheSim/cache.h"
66

77
#include "../dataStructure/hashtable/hashtable.h"
8+
#include "../include/libCacheSim/prefetchAlgo.h"
89

910
/** this file contains both base function, which should be called by all
1011
*eviction algorithms, and the queue related functions, which should be called
@@ -33,6 +34,7 @@ cache_t *cache_struct_init(const char *const cache_name,
3334
cache->cache_size = params.cache_size;
3435
cache->eviction_params = NULL;
3536
cache->admissioner = NULL;
37+
cache->prefetcher = NULL;
3638
cache->future_stack_dist = NULL;
3739
cache->future_stack_dist_array_size = 0;
3840
cache->default_ttl = params.default_ttl;
@@ -71,6 +73,7 @@ cache_t *cache_struct_init(const char *const cache_name,
7173
void cache_struct_free(cache_t *cache) {
7274
free_hashtable(cache->hashtable);
7375
if (cache->admissioner != NULL) cache->admissioner->free(cache->admissioner);
76+
if (cache->prefetcher != NULL) cache->prefetcher->free(cache->prefetcher);
7477
my_free(sizeof(cache_t), cache);
7578
}
7679

@@ -95,6 +98,10 @@ cache_t *create_cache_with_new_size(const cache_t *old_cache,
9598
if (old_cache->admissioner != NULL) {
9699
cache->admissioner = old_cache->admissioner->clone(old_cache->admissioner);
97100
}
101+
if (old_cache->prefetcher != NULL) {
102+
cache->prefetcher =
103+
old_cache->prefetcher->clone(old_cache->prefetcher, new_size);
104+
}
98105
cache->future_stack_dist = old_cache->future_stack_dist;
99106
cache->future_stack_dist_array_size = old_cache->future_stack_dist_array_size;
100107
return cache;
@@ -146,6 +153,13 @@ cache_obj_t *cache_find_base(cache_t *cache, const request_t *req,
146153
const bool update_cache) {
147154
cache_obj_t *cache_obj = hashtable_find(cache->hashtable, req);
148155

156+
// "update_cache = true" means that it is a real user request, use handle_find
157+
// to update prefetcher's state
158+
if (cache->prefetcher && cache->prefetcher->handle_find && update_cache) {
159+
bool hit = (cache_obj != NULL);
160+
cache->prefetcher->handle_find(cache, req, hit);
161+
}
162+
149163
if (cache_obj != NULL) {
150164
#ifdef SUPPORT_TTL
151165
if (cache_obj->exp_time != 0 && cache_obj->exp_time < req->clock_time) {
@@ -193,26 +207,27 @@ bool cache_get_base(cache_t *cache, const request_t *req) {
193207
cache->get_occupied_byte(cache), cache->cache_size);
194208

195209
cache_obj_t *obj = cache->find(cache, req, true);
210+
bool hit = (obj != NULL);
196211

197-
if (obj != NULL) {
212+
if (hit) {
198213
VVERBOSE("req %ld, obj %ld --- cache hit\n", cache->n_req, req->obj_id);
199-
return true;
200-
}
201-
202-
if (cache->can_insert(cache, req) == false) {
214+
} else if (!cache->can_insert(cache, req)) {
203215
VVERBOSE("req %ld, obj %ld --- cache miss cannot insert\n", cache->n_req,
204216
req->obj_id);
205-
return false;
217+
} else {
218+
while (cache->get_occupied_byte(cache) + req->obj_size +
219+
cache->obj_md_size >
220+
cache->cache_size) {
221+
cache->evict(cache, req);
222+
}
223+
cache->insert(cache, req);
206224
}
207225

208-
while (cache->get_occupied_byte(cache) + req->obj_size + cache->obj_md_size >
209-
cache->cache_size) {
210-
cache->evict(cache, req);
226+
if (cache->prefetcher && cache->prefetcher->prefetch) {
227+
cache->prefetcher->prefetch(cache, req);
211228
}
212229

213-
cache->insert(cache, req);
214-
215-
return false;
230+
return hit;
216231
}
217232

218233
/**
@@ -237,8 +252,8 @@ cache_obj_t *cache_insert_base(cache_t *cache, const request_t *req) {
237252
}
238253
#endif
239254

240-
#if defined(TRACK_EVICTION_V_AGE) || \
241-
defined(TRACK_DEMOTION) || defined(TRACK_CREATE_TIME)
255+
#if defined(TRACK_EVICTION_V_AGE) || defined(TRACK_DEMOTION) || \
256+
defined(TRACK_CREATE_TIME)
242257
cache_obj->create_time = CURR_TIME(cache, req);
243258
#endif
244259

@@ -263,6 +278,17 @@ void cache_evict_base(cache_t *cache, cache_obj_t *obj,
263278
record_eviction_age(cache, obj, CURR_TIME(cache, req) - obj->create_time);
264279
}
265280
#endif
281+
if (cache->prefetcher && cache->prefetcher->handle_evict) {
282+
request_t *check_req = new_request();
283+
check_req->obj_id = obj->obj_id;
284+
check_req->obj_size = obj->obj_size;
285+
// check_req->ttl = 0; // re-add objects should be?
286+
cache_remove_obj_base(cache, obj, remove_from_hashtable);
287+
cache->prefetcher->handle_evict(cache, check_req);
288+
my_free(sizeof(request_t), check_req);
289+
return;
290+
}
291+
266292
cache_remove_obj_base(cache, obj, remove_from_hashtable);
267293
}
268294

0 commit comments

Comments
 (0)