Skip to main content

cassini

The cassini element implements subcomponents that can be used for cache prefetch as well as generally tracking activity in memHierarchy caches. Cassini's subcomponents implement memHierarchy's CacheListener subcomponent API.

At a Glance

Source Code: sst-elements/.../cassini  
SST Name: cassini  
Maturity Level: Prototype (2)  
Development Path: Active  
Last Released: SST 16.1

Required dependencies​

None

Optional dependencies​

None

Elements​

Use sst-info cassini or sst-info cassini.<element> to see each element's parameters and statistics. Each element is a memHierarchy.Cache subcomponent: prefetchers go in the cache's prefetcher slot, and the trackers, which only observe, go in its listener slot.

LibraryElementTypeDescription
cassiniNextBlockPrefetcherSubComponentPrefetcher that fetches the next cache line after each miss
cassiniStridePrefetcherSubComponentPrefetcher that detects strided access streams and fetches ahead along the stride
cassiniPalaPrefetcherSubComponentStride prefetcher based on Palacharla and Kessler (ISCA 1994) stream buffers; keeps a per-stream table of address and stride
cassiniAddrHistogrammerSubComponentListener that records histograms of reads and writes per page
cassinicacheLineTrackSubComponentListener that records how each cache line was used (reads, writes, age, words touched) before eviction
An L1 cache with a stride prefetcher (based on cassini/tests/streamcpu-sp.py)
import sst

# Test CPU that streams loads and stores through memory
cpu = sst.Component("cpu", "memHierarchy.streamCPU")
cpu.addParams({
"do_write" : "1",
"num_loadstore" : "100000",
"commFreq" : "100",
"memSize" : "524288",
})
iface = cpu.setSubComponent("memory", "memHierarchy.standardInterface")

# L1 cache with a cassini prefetcher in its "prefetcher" slot
l1cache = sst.Component("l1cache", "memHierarchy.Cache")
l1cache.addParams({
"access_latency_cycles" : "2",
"cache_frequency" : "2 Ghz",
"replacement_policy" : "lru",
"coherence_protocol" : "MESI",
"associativity" : "4",
"cache_line_size" : "64",
"L1" : "1",
"cache_size" : "8 KB",
})
prefetcher = l1cache.setSubComponent("prefetcher", "cassini.StridePrefetcher")
prefetcher.addParams({ "reach" : 2 })

# Memory
memctrl = sst.Component("memory", "memHierarchy.MemController")
memctrl.addParams({
"clock" : "1GHz",
"addr_range_start" : 0,
"backing" : "none",
})
memory = memctrl.setSubComponent("backend", "memHierarchy.simpleMem")
memory.addParams({
"access_time" : "1000 ns",
"mem_size" : "512MiB",
})

link_cpu_cache = sst.Link("link_cpu_cache")
link_cpu_cache.connect((iface, "lowlink", "1000ps"), (l1cache, "highlink", "1000ps"))
link_cache_mem = sst.Link("link_cache_mem")
link_cache_mem.connect((l1cache, "lowlink", "50ps"), (memctrl, "highlink", "50ps"))

# Print prefetcher and cache statistics at the end of the run
sst.setStatisticLoadLevel(1)
prefetcher.enableAllStatistics()