gem5を構成するSimObjectを追加するためのチュートリアルをやってみる。
- gem5記事一覧インデックス
キャッシュのコンフィグレーションファイルを作成する
最後に、キャッシュを使用する新しいPython設定スクリプトを作成する。
前章のアウトラインを出発点として使うことができる。
- このキャッシュのパラメータを設定する(例えば、キャッシュのサイズを1kBに設定する)
- 名前付きポート(
data_port
とinst_port
)を使用する代わりに、cpu_side
ポートを2回使用する
cpu_side
はVectorPort
なので、自動的に複数のポート接続が作成される。
import m5 from m5.objects import * ... system.cache = SimpleCache(size='1kB') system.cpu.icache_port = system.cache.cpu_side system.cpu.dcache_port = system.cache.cpu_side system.membus = SystemXBar() system.cache.mem_side = system.membus.slave ...
最終的に、上記のスクリプトを使用してhelloバイナリを実行する。
gem5 Simulator System. http://gem5.org gem5 is copyrighted software; use the --copyright option for details. gem5 compiled Jan 10 2017 17:38:15 gem5 started Jan 10 2017 17:40:03 gem5 executing on chinook, pid 29031 command line: build/X86/gem5.opt configs/learning_gem5/part2/simple_cache.py Global frequency set at 1000000000000 ticks per second warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes) 0: system.remote_gdb.listener: listening for remote gdb #0 on port 7000 warn: CoherentXBar system.membus has no snooping ports attached! warn: ClockedObject: More than one power state change request encountered within the same simulation tick Beginning simulation! info: Entering event queue @ 0. Starting simulation... Hello world! Exiting @ tick 56082000 because target called exit()
gem5 Simulator System. http://gem5.org gem5 is copyrighted software; use the --copyright option for details. gem5 compiled Jan 10 2017 17:38:15 gem5 started Jan 10 2017 17:41:10 gem5 executing on chinook, pid 29037 command line: build/X86/gem5.opt configs/learning_gem5/part2/simple_cache.py Global frequency set at 1000000000000 ticks per second warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes) 0: system.remote_gdb.listener: listening for remote gdb #0 on port 7000 warn: CoherentXBar system.membus has no snooping ports attached! warn: ClockedObject: More than one power state change request encountered within the same simulation tick Beginning simulation! info: Entering event queue @ 0. Starting simulation... Hello world! Exiting @ tick 32685000 because target called exit()
キャッシュの統計情報を使用する
システム全体の実行時間を知ることは重要な指標の一つである。しかし、キャッシュのヒット率やミス率など、他の統計も含めたくなるかもしれない。そのためには SimpleCache
オブジェクトに統計情報を追加する必要がある。
まず、SimpleCache
オブジェクトで統計情報を宣言する。これらは Stats 名前空間の一部である。
- ヒット数とミス数
missLatency
- これはミスを満たすのにかかる時間のヒストグラム
- Formula for the hitRatio
- ヒット数とミス数を組み合わせたという特別な統計量
class SimpleCache : public MemObject { private: ... Tick missTime; // To track the miss latency Stats::Scalar hits; Stats::Scalar misses; Stats::Histogram missLatency; Stats::Formula hitRatio; public: ... void regStats() override; };
次に、regStats
関数をオーバーライドする関数を定義し、統計量をgem5の統計量インフラストラクチャに登録する。
void SimpleCache::regStats() { // If you don't do this you get errors about uninitialized stats. MemObject::regStats(); hits.name(name() + ".hits") .desc("Number of hits") ; misses.name(name() + ".misses") .desc("Number of misses") ; missLatency.name(name() + ".missLatency") .desc("Ticks for misses to the cache") .init(16) // number of buckets ; hitRatio.name(name() + ".hitRatio") .desc("The ratio of hits to the total accesses to the cache") ; hitRatio = hits / (hits + misses); }
アクセスに応じてカウンタをアップデートする実装を追加する。
void SimpleCache::accessTiming(PacketPtr pkt) { bool hit = accessFunctional(pkt); if (hit) { hits++; // update stats pkt->makeResponse(); sendResponse(pkt); } else { misses++; // update stats missTime = curTick(); ...
bool SimpleCache::handleResponse(PacketPtr pkt) { insert(pkt); missLatency.sample(curTick() - missTime); ...
これで、stats.txtに統計情報が表示される。
system.cache.hits 8431 # Number of hits system.cache.misses 877 # Number of misses system.cache.missLatency::samples 877 # Ticks for misses to the cache system.cache.missLatency::mean 53334.093501 # Ticks for misses to the cache system.cache.missLatency::gmean 44506.409356 # Ticks for misses to the cache system.cache.missLatency::stdev 36749.446469 # Ticks for misses to the cache system.cache.missLatency::0-32767 305 34.78% 34.78% # Ticks for misses to the cache system.cache.missLatency::32768-65535 365 41.62% 76.40% # Ticks for misses to the cache system.cache.missLatency::65536-98303 164 18.70% 95.10% # Ticks for misses to the cache system.cache.missLatency::98304-131071 12 1.37% 96.47% # Ticks for misses to the cache system.cache.missLatency::131072-163839 17 1.94% 98.40% # Ticks for misses to the cache system.cache.missLatency::163840-196607 7 0.80% 99.20% # Ticks for misses to the cache system.cache.missLatency::196608-229375 0 0.00% 99.20% # Ticks for misses to the cache system.cache.missLatency::229376-262143 0 0.00% 99.20% # Ticks for misses to the cache system.cache.missLatency::262144-294911 2 0.23% 99.43% # Ticks for misses to the cache system.cache.missLatency::294912-327679 4 0.46% 99.89% # Ticks for misses to the cache system.cache.missLatency::327680-360447 1 0.11% 100.00% # Ticks for misses to the cache system.cache.missLatency::360448-393215 0 0.00% 100.00% # Ticks for misses to the cache system.cache.missLatency::393216-425983 0 0.00% 100.00% # Ticks for misses to the cache system.cache.missLatency::425984-458751 0 0.00% 100.00% # Ticks for misses to the cache system.cache.missLatency::458752-491519 0 0.00% 100.00% # Ticks for misses to the cache system.cache.missLatency::491520-524287 0 0.00% 100.00% # Ticks for misses to the cache system.cache.missLatency::total 877 # Ticks for misses to the cache system.cache.hitRatio 0.905780 # The ratio of hits to the total access