1% Retrieval system whose per-item miss routing AND service are taken, by
2%
default, from
the read
class: routing from
the read
class's edges among the
3% retrieval queues in the top-level P matrix, and service from the read class's
4% service distribution at each queue. Per-item overrides
5% (setItemRoutingProb with
the cache as source/dest / queue.setItemServiceRate)
6% then reconfigure one item at finer granularity.
7clc; clear solver AvgTable;
9accessProb = [0.6, 0.3, 0.1]; % per-item access probabilities (3 items)
11model = Network(
'DelayedHits');
13n = numel(accessProb); % number of items
14capacity = [1]; % per-level cache capacity
16source = Source(model,
'Source');
17cacheNode = Cache(model,
'Cache', n, capacity, ReplacementStrategy.FIFO);
18% PS retrieval stations: per-item (
class-dependent) service rates are admissible
19% in
the analytical retrieval algorithm (FCFS/SIRO would require identical rates).
20queue1 = Queue(model,
'Queue_1', SchedStrategy.PS);
21queue2 = Queue(model,
'Queue_2', SchedStrategy.PS);
22sink = Sink(model,
'Sink');
24jobClass = OpenClass(model,
'InitClass', 0);
25hitClass = OpenClass(model,
'HitClass', 0);
26missClass = OpenClass(model,
'MissClass', 0);
28source.setArrival(jobClass, Exp(1));
30% Read
class service at each retrieval queue =
default per-item fetch service.
31queue1.setService(jobClass, Exp(2.0));
32queue2.setService(jobClass, Exp(3.0));
34pAccess = DiscreteSampler(accessProb);
35cacheNode.setRead(jobClass, pAccess);
36cacheNode.setHitClass(jobClass, hitClass);
37cacheNode.setMissClass(jobClass, missClass);
39% No serviceRates and no routingMatrices: both inherited from
the read
class.
40cacheNode.setRetrievalSystem(jobClass, missClass, {queue1, queue2});
42% Item-level overrides
for item 1: skip Queue_2 and fetch faster at Queue_1.
43cacheNode.setItemRoutingProb(jobClass, 1, queue1, queue2, 0.0); %
delete default edge
44cacheNode.setItemRoutingProb(jobClass, 1, queue1, cacheNode, 1.0); % exit after Queue_1
45queue1.setItemServiceRate(cacheNode, jobClass, 1, 5.0); % faster item-1 fetch
47P = model.initRoutingMatrix();
48P{jobClass, jobClass}(source, cacheNode) = 1.0;
49% Default retrieval topology, drawn once
for the read
class: cache -> Q1 -> Q2 -> cache
50P{jobClass, jobClass}(cacheNode, queue1) = 1.0; % entry into retrieval
51P{jobClass, jobClass}(queue1, queue2) = 1.0; % Queue_1 -> Queue_2
52P{jobClass, jobClass}(queue2, cacheNode) = 1.0; % exit back to cache
53P{hitClass, hitClass}(cacheNode, sink) = 1.0;
54P{missClass, missClass}(cacheNode, sink) = 1.0;
58SSA(model,
'samples', 5000,
'method',
'serial',
'seed', 1).getAvgCacheTable
59LDES(model,
'samples', 1e6,
'seed', 1).getAvgCacheTable
62MVA(model).getAvgCacheTable
63NC(model).getAvgCacheTable
65% Item-level cache occupancy
66MVA(model).getAvgItemTable
67NC(model).getAvgItemTable