FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

サイクル精度シミュレータSniperで動作しているスレッドについて

サイクル精度シミュレータの挙動がわからな過ぎていろいろ調べていたのだけれども、そもそも基本的な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の参照などによって時間が経過していく。これはコンフィグレーションに依存する。