2011-11-14 44 views
2

我使用Marss週期精確模擬器,它使用QEMU。它是一個完整的系統模擬器,同時提供用戶和內核統計信息。 但是,即使我只採用用戶統計,不同運行之間的統計數據也會有很大差異。我在火星網站上提出這個問題,但無法得到很好的答案。 我想知道它是否與qemu有關。或者任何qemu選項/變體,可以使模擬具有確定性。 我嘗試使用-icount auto,仍然有一些變化。 使用simplescalar eio文件,我從未觀察到任何變化。 我會感謝一些幫助。模擬確定性(基於qemu的模擬器)

回答

3

我還沒有使用過MARSS/QEMU,但是我對模擬器和SimpleScalar都很熟悉。

這是很難做出全面的系統模擬器一般確定性。例如。如果您的程序打印一天中的時間,並且一天中的時間發生變化,則會遵循不同的代碼路徑。更一般地說,如果你正在做一個完整的系統仿真和時間ls,那麼操作系統和用戶代碼的確切交錯將根據磁頭的位置,磁盤高速緩存中的數據等等而有所不同。更不用說什麼系統上正在運行其他進程。

SimpleScalar eio(和工業中的模​​擬器)通過記錄一個外部I/O事件的跟蹤來提供確定性,以與之前的運行完全相同的指令計數來應用於模擬。基本上,只有在記錄時才進行完整的系統仿真

您需要尋找類似的MARSS/QEMU選項。不幸的是,我還沒有找到這樣的。

缺乏這些...

但我能聽到你說「我的程序不讀一天的時間。它不應該在每次運行完全相同的方式?」也許是這樣......但(1)許多Linux libraruies在閱讀時間方面做了道德上的等同。 (2)還有其他進程正在運行用戶代碼。

所以你需要控制運行。不要啓動虛擬機(不是硬件虛擬機,我的意思就是您在模擬器上運行的操作系統)。停在單用戶。編輯/ etc/rc以儘可能多的進程停止運行。全系統仿真與真機上的基準測試不同。而在真機上,我們甚至可能會在每次運行基準測試時重新啓動機器。禁用(虛擬)網絡。等等

如果可以的話,不要在真正的操作系統上運行,而要在最小的顯示器上運行。

但是,真的最好找到I/O跟蹤重放設施。有時這些隱藏在調試器選項下。


這裏是一個參考文獻,它在2008年談論了關於qemu中I/O重放的補丁。

http://wiki.qemu.org/Features/FaultTolerance - I/O重放的可靠性/容錯性。

QEMU用戶空間模擬可能更具可重複性。我不知道它是否與MARSS一起工作


順便說一句:再現性問題不僅僅與模擬器相關。這也與可靠性和調試有關。

您可能能夠找到一種通用的Linux重播工具,您可以使用該工具使您的系統在QEMU/MARSS之上更具可重複性。


裏面MARSS,您可以使用ptlcall檢查站設施採取檢查點只在您的基準(假設你正在運行SPEC等)做了很多最初我後點/ O ,並在下一個IO之前許多基準測試都會執行很多初始I/O,然後在用戶代碼中運行一段時間,然後執行一些最終的I/O。通過使用這些檢查點,您可以避免隨時間變化的系統調用。

同樣Simpoints,http://www.marss86.org/~marss86/index.php/Simpoints


順便說一句,我只是想起另一種方案可能是不確定的(除偶然取決於時間,或多處理器的交互):他們可以明確地和本質取決於時間。

E.g.利弗莫爾循環基準的langer98版本計算循環花費了多少時間,如果花費的時間不夠,則會增加循環計數。您可以在這裏記錄外部交互,例如時間和系統調用,並且程序可能會重現 - 但是您不會準確地測量在新的更快的計算機上它會做什麼。

相反的:假設你有以下形式的編譯器優化開關「將此真的很貴優化不超過2個小時,然後停止......」