2011-05-02 22 views
7

我有興趣在我的2GHz +處理器上以特定頻率(如25MHz)運行程序。我能想到的唯一方法就是使用微秒精度睡眠函數,但我不確定如何計算線程應該睡多久以匹配特定頻率。任何提示或其他想法?我在X86 Linux操作系統上用C語言來完成這個任務。如何編程模擬較低的處理器頻率?

+0

你這樣做的目標/「用例」是什麼?你是否試圖以較低的速度衡量性能? – jwmacdon 2011-05-02 18:13:53

+0

我做了一個虛擬處理器,我想以特定的頻率運行它。 – ytrp 2011-05-02 18:19:43

回答

2

這裏有幾個問題。首先你要模擬的是什麼。現代處理器的時鐘頻率爲2Ghz,但流水線指令使得單個指令可能需要10-30個時鐘才能完成。通過在線程中進入睡眠狀態,可以中斷管道。第二個是你希望如何細化你的模擬。你是否需要通過在功能之間放置一些空間來讓我們假裝它的指令級定時。

我最後的想法是,你可能不想模擬一個運行在25Mhz的現代處理器,而是嵌入式設備上某種類型的ARM芯片。如果是這種情況,那麼市面上已有的大多數芯片都有非常好的模擬器。將您的代碼編譯爲目標芯片的本地指令,如果有可用的模擬器,則使用已有的模擬器。


編輯

所以我現在明白了它,你要在一個虛擬處理器25M次第二執行的指令。我可能會嘗試的是一種適應性方法。你有很多時間在指令之間「亂七八糟」。在每條指令之間加入一些空格,睡眠可能會起作用。請注意,在每個虛擬時鐘開始時,儘可能精確地保持數組的最後25,100或1000個循環的滾動平均值。如果平均值超過25Mhz,則開始增加更多空間。如果太慢,減少空間。

正如我剛纔說的,計算一個指令在現代處理器上所花費的時間是非常困難的。第一組指令可能運行速度太快或太慢,但像這樣的技術應該使其保持接近正常速度的速度,這與典型的類似硬件實現的振盪器相同。

+1

這種答案沒有幫助。作者問如何,而不是在哪裏購買預先存在的軟件。 – subwar 2011-05-03 22:46:13

+1

Subwar,當我寫這個答案時,評論「我做了一個虛擬處理器......」還沒有發佈。我回答了我以爲被問及如何模擬在25Mhz下運行2Ghz X86處理器的問題。第二段是猜測,這不是他想要做的。事實證明我是對的。他確實想要模擬不同的處理器,而不是預先存在的處理器。 – 2011-05-03 23:30:04

+0

我跳了槍。道歉朋友:) – subwar 2011-05-06 21:35:10

1

我會建議一個事件驅動的體系結構:在每個STEP(1/hz)上,啓動1個指令操作。

2

我只是簡單地運行模擬爆發。例如,您可以運行25萬個週期,然後在10毫秒間隔的剩餘時間內休眠。您可以調整仿真所看到的時鐘視圖,使其完全透明,除非它與某種需要以特定速率接口的外部硬件相連接(在這種情況下,這會變得更加困難)。

0

請參閱Fracas CPU模擬器以獲取此方法。作者在Heteropar研討會上提出了這個問題,EUROPAR 2010的一部分。他們基本上修改OS調度程序,以允許用戶程序只使用真實CPU頻率的幾分之一。

1

總結以上答案的內容,如果您處於用戶模式,試圖以特定頻率模擬虛擬處理器,則應該對處理CPU指令的線程執行某種手動「調度」通過睡眠呼叫或更高級的功能和功能,如Windows中的光纖。需要注意的一點是,某些OS睡眠呼叫在指定的確切時間內不會睡眠,因此您可能需要添加額外的代碼來校準計算機與計算機之間的偏差,以便更接近目標頻率。通常情況下,您將無法準確安排虛擬處理器以穩定的25 MHz運行(更可能是22-28 MHz)。無論如何,我同意納森和爆發的想法。祝你好運!

+0

要計算秒數,你應該使用一些程序集來定時執行一些虛擬代碼(可能會被執行的代碼)。然後導出某種算法(通過實驗),將執行代碼佔用的時間與執行的虛擬代碼的大小相關聯。您可以使用此算法進一步計算運行虛擬處理器代碼所需的時間,或者更好的是,在您的仿真循環中動態重新使用算法以確定睡眠時間(校準因子)。 – subwar 2011-05-03 22:55:38

1

對於虛擬機,一切都是虛擬的,包括時間。例如,在123秒內,您可以模擬5432個虛擬秒處理。測量虛擬時間的常用方法是每次模擬虛擬指令時增加(或增加一些)「計數週期」計數器。

每隔一段時間您都會試着將虛擬時間與實時同步。如果虛擬時間遠遠超過實時時間,則插入一個延遲以實時追趕。如果虛擬時間落後於實時,那麼您需要爲減速找到一些藉口。根據模擬架構,您可能無法做任何事情;但對於某些體系結構,還有諸如熱節流等電源管理功能(例如,也許您可​​以假裝虛擬CPU變熱並且運行速度變慢)。

您也可能想要有一個事件隊列,其中不同的仿真設備可以說「在某個特定時間會發生某些事件」;所以如果模擬CPU處於空閒狀態(等待事件發生),則可以跳到下一個事件發生的時間。如果虛擬機運行緩慢,這爲虛擬機提供了一種自然的方式。

下一步是確定哪些地方的時間很重要,並且只在這些特定地點與實時虛擬時間同步。如果仿真機正在進行繁重的處理並且沒有做任何外部觀察者可以看到的事情,那麼外部觀察者就無法判斷虛擬時間是否接近實時。當虛擬機確實做了對外部觀察者可見的事情(例如發送網絡數據包,更新視頻/屏幕,發出聲音等)時,您首先會將虛擬時間與實時同步。

超出這一步的是使用緩衝來解耦當模擬器內部發生的事情從外部觀察者可見時發生。對於一個(誇張的)例子,假設仿真機器認爲早上8點23分,它想發送一個網絡包,但實際上早上只有8點。簡單的解決方案是將仿真延遲23分鐘,然後發送數據包。這聽起來不錯,但如果(在虛擬機發送數據包之後)模擬器努力跟上實時(由於其他進程在真實計算機上運行或其他原因),仿真器可能會落後,並且您可能會遇到問題虛擬時間與實時相同的錯覺。或者,您可以假裝數據包已發送並將數據包放入緩衝區並繼續模擬其他事情,然後稍後發送數據包(當時實際上是早上8:23)。在這種情況下,如果(在虛擬機發送數據包之後)模擬器努力跟上實時,您仍然有23分鐘的餘地。

相關問題