簡體   English   中英

計算 FLops

[英]Calculating FLops

我正在編寫一個程序來計算我的 CPU 執行一次“FLops”所需的持續時間。 為此我寫了下面的代碼

before = clock();
y= 4.8;
x= 2.3;
z= 0;
for (i = 0; i < MAX; ++i){
 z=x*y+z;
}
printf("%1.20f\n", ( (clock()-before )/CLOCKS_PER_SEC )/MAX);

我重復相同操作的問題。 編譯器不會優化這種“東西”嗎? 如果是這樣,我必須做什么才能獲得正確的結果?

我沒有使用“rand”函數,所以它不會與我的結果沖突。

這具有循環攜帶的依賴性,並且沒有足夠的東西可以並行執行,因此如果根本執行任何操作,則不會是您正在測量的 FLOP,因此您可能會測量浮點加法的延遲。 循環攜帶的依賴鏈序列化了所有這些添加。 該鏈有一些帶有乘法的小側鏈,但它們不依賴任何東西,因此只有它們的吞吐量很重要。 但該吞吐量將比任何合理處理器上添加的延遲要好。

要實際測量 FLOP,沒有單一的方法。 最佳條件在很大程度上取決於微體系結構。 你需要的獨立依賴鏈的數量,最佳的加/乘比,你是否應該使用 FMA,這一切都取決於。 通常你必須做一些比你寫的更復雜的事情,如果你准備使用高級語言,你必須以某種方式欺騙它實際做任何事情。

尋找靈感,看看我如何達到每個周期 4 FLOPs 的理論最大值?

即使您沒有進行編譯器優化(可能性已經很好地列出),您的變量和結果將在第一次循環迭代后緩存,從那時起,您將以比您更高的速度和性能進入賽道,如果程序必須為每次迭代獲取新值。

因此,如果您想為該程序的單次迭代計算一次觸發器的時間,您實際上必須為每次迭代提供新的輸入。 真正考慮使用 rand() 並且只使用已知值srand(1)左右的種子。

你的計算也應該不同; flops 是您的程序在您的情況下進行的計算次數 2*n(其中 n = MAX)。 計算每個觸發器的時間除以觸發器的數量所用的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM