2016-12-29 18 views
-3

我必須編寫應該在Intel x86處理器上運行的x86彙編代碼。如何編寫x86彙編代碼來檢查溫度對處理器性能的影響

其實不得不寫如加法或移動指令來看看這些指令對處理器溫度性能的影響。這意味着我的代碼應該能夠控制處理器產生的熱量。

如果您的人有這樣的代碼或任何有經驗的人寫這種類型的代碼請分享。

+0

編輯您的標題,以便人們不會被「惡意」誤導。如果您需要「受控生熱」,請使用一些反饋方法。你可能根本不需要asm。 – Jester

+1

等一下「檢查溫度對性能的影響?」你爲什麼要爲此編寫自己的代碼?爲什麼不使用prime95來像普通人一樣觸發熱調節?在回答時,我沒有注意到「檢查效果對錶現的影響」部分,因爲你甚至沒有在問題主體中提到這一點。 –

+0

謝謝@PeterCordes。對於我的項目,我必須這樣做。而且,因爲我想測量最小的溫度增加量,所以我想使用代碼。 –

回答

3

對於最大發熱量,您希望儘可能多的晶體管在每個時鐘週期內改變狀態。浮點FMA單元有很多晶體管;保持忙碌狀態會產生大量熱量,特別是對於256b AVX載體。

例如請參閱this Skylake overclocking guide的「壓力測試」部分,您可以在其中看到Prime95 version 28和Linpack是運行最熱的工作負載。還有一個全系統功耗表。

另請參閱http://agner.org/optimize/以瞭解有關CPU內部部件的更多信息,尤其是Agner的微型指南。您應該能夠通過適合環回緩衝區的循環來減少或減少熱量。 x86解碼器比重複使用已解碼的uops更加耗電。請參閱this Q&A about uop throughput for various loop sizes,對於指令之間沒有顯着依賴關係的情況,只有前端限制吞吐量。 (另請參閱標記wiki)。


我懷疑你會看到很多不同的熱量整數add reg, regmov reg, reg什麼的。也許飽和整數的吞吐量mul單元會產生可測量的熱/功率差異,但是加法器與mov或者簡單布爾操作的不同成本可能被無序執行的功率成本add通過管道。

加載或存儲的是保持高速緩存和存儲緩衝器硬件活躍可能是一個不同的故事,但add可以有一個存儲源或DEST過。只要確保您不會對單個內存目標添加的存儲轉發延遲產生瓶頸。


對於最小熱而不實際睡眠,在循環使用pause instruction。在Skylake上,它比以前的英特爾微架構(〜5個週期),IIRC睡眠更長(約100個週期)。

根據powertop on Linux,內核使用具有不同提示的mwait在Intel CPU(例如我的Skylake桌面)上輸入不同級別的睡眠。如果需要,您可以從用戶空間執行此操作,或者使用nanosleep來交替休眠/喚醒並以特定佔空比運行產生熱量的工作負載。

頻繁睡眠可能會阻止操作系統將CPU提升至全速時鐘,具體取決於您的設置。 Why does this delay-loop start to run faster after several iterations with no sleep?

有關降低迴路吞吐量的其他想法,請參閱Deoptimizing a program for the pipeline in Intel Sandybridge-family CPUs。如果沒有翻轉很多晶體管來恢復,那麼緩慢的調整可能是製作不會產生太多熱量的環路的好方法。


沒有pause,你會看到從像.repeat: jmp .repeat只是一個簡單的無限循環顯著加熱,尤其是在CPU,可以「渦輪」最多隻要熱限制允許高電壓/頻率。

+0

我認爲使用浮點FMA會大大增加溫度。用我想測量的整數作爲低溫變化。我可以通過循環做到這一點嗎?如果有什麼方法?你有任何示例代碼?非常感謝。 –

+0

帶有'add','mov'的緊密循環,無論如何足以使處理器免於睡眠,從而產生熱量。當然,這不是一個多餘的數量,但聽起來這是OP所尋找的小型影響。如果你試圖精確地「控制」產生的熱量,這個技巧將與操作系統的調度程序相抗衡。 –

+0

@ Peter Cordes @CodyGray我從Prime95開始運行壓力代碼,逐漸將溫度提高到20度。在我的情況下,它也從40到80。現在我想插入一些代碼,讓我們說4種不同的代碼行數,與原始代碼相比,溫度變化很小,20次得到20種不同的溫度偏差。如何和在哪裏可以插入這些線20次,以獲得20種不同的溫度偏差?謝謝 –