簡體   English   中英

浮點數學執行時間

[英]Floating Point Math Execution Time

是什么原因導致第一個數據集的執行時間增加了? 裝配說明是相同的。

如果DN_FLUSH標志未打開,則第一個數據集需要63毫秒,第二個數據集需要15毫秒。
在DN_FLUSH標志打開的情況下,第一個數據集需要15毫秒,第二個數據集需要約0毫秒。

因此,在這兩種情況下,第一數據集的執行時間都要大得多。

有沒有辦法減少執行時間與第二個數據集更接近?

我正在使用C ++ Visual Studio 2005,/ arch:SSE2 / fp:在Intel Core 2 Duo T7700 @ 2.4Ghz Windows XP Pro上快速運行。

#define NUMLOOPS 1000000

// Denormal values flushed to zero by hardware on ALPHA and x86
// processors with SSE2 support. Ignored on other x86 platforms
// Setting this decreases execution time from 63 milliseconds to 16 millisecond
// _controlfp(_DN_FLUSH, _MCW_DN);

float denormal = 1.0e-38;
float denormalTwo = 1.0e-39;
float denormalThree = 1;

tickStart = GetTickCount();

// Run First Calculation Loop 
for (loops=0; loops < NUMLOOPS; loops++)
{
    denormalThree = denormal - denormalTwo;
}

// Get execution time
duration = GetTickCount()-tickStart;
printf("Duration = %dms\n", duration);

float normal = 1.0e-10;
float normalTwo = 1.0e-2;
float normalThree = 1;

tickStart = GetTickCount();

// Run Second Calculation Loop 
for (loops=0; loops < NUMLOOPS; loops++)
{
    normalThree = normal - normalTwo;
}

// Get execution time
duration = GetTickCount()-tickStart;
printf("Duration = %dms\n", duration);

引自英特爾優化手冊:

當SIMD浮點指令的輸入操作數[這里包括使用SSE完成的標量算法]包含的值小於數據類型的可表示范圍時,會發生非正規異常。 這會導致嚴重的性能損失。 SIMD浮點運算具有清零模式,其中結果不會下溢。 因此,后續計算將不會面臨處理非正規輸入操作數的性能損失。

至於如何避免這種情況,如果你不能刷新非規范:盡你所能確保你的數據適當縮放,你首先不會遇到非正規數。 通常這意味着延遲應用一些比例因子,直到你完成所有其他計算。

或者,你的計算是double ,具有更大的指數范圍,因此使得你首先遇到非正規數的可能性要小得多。

英特爾手冊第1卷第10.2.3.3章的另一個引用:

清零到零模式與IEEE標准754不兼容.IEEE規定的對下溢的屏蔽響應是提供非規范化結果(參見第4.8.3.2節“歸一化和非規范化有限數”)。 提供清零模式主要是出於性能原因 以微小的精度損失為代價,對於下溢很常見並且可以容忍將下溢結果舍入為零的應用,可以實現更快的執行。

暫無
暫無

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

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