サイクル精度シミュレータの挙動がわからな過ぎていろいろ調べていたのだけれども、そもそも基本的なSniperの仕組みで理解の足りていないところがあって、そういうところをひたすらまとめていくメモ。 誰かの役には立たないけれども、自分の役には立つかもしれない。
そもそもSniperは実行時にコア毎に2つのスレッドが立ち上がっている。User ThreadとSim Threadだ。 スレッドというのは別にハードウェアで並列に動作するものではなくて、仮想的にスレッドという仕組みになっている。 実体は交互に動作している。 User Threadは命令の動作を制御するためのスレッドで、命令のリクエストなどを発行する。 一方でSim ThreadはL2などの動作を制御するためのスレッドで、あまり見えることはない。
ログ中では非常にややこしいのだが、_
がついているのがSim Threadで、^
がついているのがユーザスレッドとなる。
[500000] 0^ [ 0( 0)-L2 ] processShmemReqFromPrevCache@1056: returning miss [500000] 0^ [ 0( 0)-L1D ] processMemOpFromCore @496: processMemOpFromCore l3 next hit = 0 [500000] 0^ [ 0( 0)-L1D ] processMemOpFromCore @503: processMemOpFromCore l3 waiting for sent message [500000] 0^ [ 0( 0)-L1D ] releaseStackLock @2275: stack lock release 3 # 0 @ 1000 [500000] 0^ [ 0( 0)-L1D ] processMemOpFromCore @510: processMemOpFromCore l3 start waitForNetworkThread [0] 0_mm handleMsgFromNetwork @450: begin [5500000] 0_mm sendMsg @545: send msg 14 0l21 > 0l24 [5500000] 0_mm handleMsgFromNetwork @539: end [5500000] 0_mm handleMsgFromNetwork @450: begin [12912500] 0_mm sendMsg @545: send msg 16 0l24 > 0l21 [12912500] 0_mm handleMsgFromNetwork @539: end [12912500] 0_mm handleMsgFromNetwork @450: begin [12912500] 0_mm sendMsg @545: send msg 7 0l21 > 0l4 [12912500] 0_mm handleMsgFromNetwork @539: end [12912500] 0_mm handleMsgFromNetwork @450: begin [12912500] 0_ [ 0( 0)-L2 ] acquireStackLock @2262: stack lock acquire 4 # 0 @ 1000 [12912500] 0_ [ 0( 0)-L2 ] handleMsgFromDramDirectory@1807: begin [12912500] 0_ [ 0( 0)-L2 ] handleMsgFromDramDirectory@1812: EX REP<0 @ 1000 [12912500] 0_ [ 0( 0)-L2 ] processExRepFromDramDirectory@1911: processExRepFromDramDirectory l4 [12912500] 0_ [ 0( 0)-L2 ] insertCacheBlock @1405: insertCacheBlock l4 @ 1000 as E (now I) [12912500] 0_ [ 0( 0)-L2 ] insertCacheBlock @1426: insertCacheBlock l4 local done [12912500] 0_ [ 0( 0)-L2 ] insertCacheBlock @1568: insertCacheBlock l4 end [12912500] 0_ [ 0( 0)-L2 ] processExRepFromDramDirectory@1917: processExRepFromDramDirectory l4 end [12912500] 0_ [ 0( 0)-L2 ] handleMsgFromDramDirectory@1870: adjusting time in #0 from 0 to 12 [12912500] 0_ [ 0( 0)-L2 ] handleMsgFromDramDirectory@1877: wakeup user #0 [12912500] 0^ [ 0( 0)-L1D ] processMemOpFromCore @513: processMemOpFromCore l3 postwakeup [12912500] 0^ [ 0( 0)-L1D ] processMemOpFromCore @519: processMemOpFromCore l3 got message reply
Sim Threadが出てくるのは主にL2にリクエストが入った時で、L2からDRAMへのメッセージの送信が行われ、DRAMやLLCがそれを処理するのはSim Threadが行っている。 しれっと時間が経過するので見逃してしまうが、基本的にDRAMなどはDirectory Tagの参照などによって時間が経過していく。これはコンフィグレーションに依存する。