1% Cache with probabilistic per-item routing through a retrieval system.
2clc; clear solver AvgTable;
4accessProb = [0.6, 0.3, 0.1]; % per-item access probabilities (3 items)
6model = Network(
'DelayedHits');
8n = numel(accessProb); % number of items
9capacity = [2]; % per-level cache capacity
11source = Source(model,
'Source');
12cacheNode = Cache(model,
'Cache', n, capacity, ReplacementStrategy.FIFO);
13isQueue = Queue(model,
'IS Queue', SchedStrategy.INF);
14queue1 = Queue(model,
'Queue 1', SchedStrategy.FCFS);
15queue2 = Queue(model,
'Queue 2', SchedStrategy.FCFS);
16queues = {isQueue, queue1, queue2};
17sink = Sink(model,
'Sink');
19jobClass = OpenClass(model,
'InitClass', 0);
20hitClass = OpenClass(model,
'HitClass', 0);
21missClass = OpenClass(model,
'MissClass', 0);
23source.setArrival(jobClass, Exp(1));
25% Read
class service per queue =
default per-item fetch service (uniform over items).
26isQueue.setService(jobClass, Exp(2.0));
27queue1.setService(jobClass, Exp(3.0));
28queue2.setService(jobClass, Exp(3.0));
30pAccess = DiscreteSampler(accessProb);
31cacheNode.setRead(jobClass, pAccess);
32cacheNode.setHitClass(jobClass, hitClass);
33cacheNode.setMissClass(jobClass, missClass);
35cacheNode.setRetrievalSystem(jobClass, missClass, queues);
37% Per-item routing over [IS(1), Queue1(2), Queue2(3), Cache(4)], applied via
the
38% per-item routing methods. Index nQ+1 (last row/col)
is the cache; row=from, col=to.
39routingMatrices = { ...
40 [0.00, 0.50, 0.00, 0.50; % from IS
41 0.00, 0.00, 0.70, 0.30; % from Queue1
42 0.00, 0.00, 0.00, 1.00; % from Queue2
43 0.70, 0.30, 0.00, 0.00]; % from Cache
44 [0.00, 0.30, 0.00, 0.70;
45 0.00, 0.00, 0.50, 0.50;
46 0.00, 0.00, 0.00, 1.00;
47 0.20, 0.80, 0.00, 0.00];
48 [0.00, 0.60, 0.00, 0.40;
49 0.00, 0.00, 0.40, 0.60;
50 0.00, 0.00, 0.00, 1.00;
51 0.50, 0.50, 0.00, 0.00]};
55 R = routingMatrices{item};
57 cacheNode.setItemRoutingProb(jobClass, item, cacheNode, queues{a}, R(nQ+1, a)); % cache -> queue a
58 cacheNode.setItemRoutingProb(jobClass, item, queues{a}, cacheNode, R(a, nQ+1)); % queue a -> cache
60 cacheNode.setItemRoutingProb(jobClass, item, queues{a}, queues{b}, R(a, b));
65P = model.initRoutingMatrix();
66P{jobClass, jobClass}(source, cacheNode) = 1.0;
67P{hitClass, hitClass}(cacheNode, sink) = 1.0;
68P{missClass, missClass}(cacheNode, sink) = 1.0;
72SSA(model,
'samples', 5000,
'method',
'serial',
'seed', 1).getAvgCacheTable
73LDES(model,
'samples', 1e6,
'seed', 1).getAvgCacheTable
76MVA(model).getAvgCacheTable
77NC(model).getAvgCacheTable
79% Item-level cache occupancy
80MVA(model).getAvgItemTable
81NC(model).getAvgItemTable