2012-08-06 59 views
2

我正在使用引腳工具來模擬處理器並出現一個非常奇怪的問題。 在下面的代碼片段中,多次調用Router :: Evaluate()。在被稱爲數百萬次之後,在第一個IF語句中「_cycles!= 0」被評估爲true,並且在緊隨其後的IF語句中爲false,並且落入ELSE塊中時,會間歇性地發生奇怪的行爲。C++和引腳工具 - 非常奇怪IF語句的DOUBLE變量問題

void Router::Evaluate() 
{  
    //---------debug print code--------- 
    if (_cycles != 0) { 
    cout << "not a zero" << endl; 

    if (_cycles != 0) cout << "---not a zero" << endl; 
    else cout << "---zero" << endl; 

    }   
    //---------------------------------- 

    _cycles += _speedup; 
    while (_cycles >= 1.0) { 
    _Step(); 
    _cycles -= 1.0; 
    } 
} 

//class definition 
class Router : public TimedModule { 
    Protected: 
    double _speedup; //initialized to 1.0 
    double _cycles; //initialized to 0.0 
    ... 
} 

下面是其中「不是零」後面的代碼的輸出「---零」是從時間打印出到時間看似隨機。

not a zero 
---zero 
(...some other output...) 
not a zero 
---zero 
(...some other output...) 

這怎麼可能發生?這不是一個多線程程序,所以同步不是問題。該程序使用gcc4.2.4編譯並在32位CentOS上執行。有人有線索嗎? 謝謝。

- 添加---

我應該提到這一點。我曾嘗試每次打印_cycles的值,它始終是0.0,這應該是不可能的... 我還使用了下列g ++選項:「-MM -MG -march = i686 -g -ggdb -g1 - 鰭線,功能-O3 -fPIC」

+1

您是否嘗試在每種情況下打印'_cycles'的值?它可能會給你一個線索 – Useless 2012-08-06 18:11:58

+0

你是否將任何特殊選項傳遞給編譯器? – DanielKO 2012-08-06 18:12:03

+0

'_speedup'的價值是什麼?它是一個整數嗎? – 2012-08-06 18:12:27

回答

1

除非你有一個可怕的編譯器缺陷,我猜是這樣發生的事情:

_cycles有刪減後剩下的一些小部分。只要編譯器不知道其他內容正在改變其內容,它就會將其值保存在更高精度的浮點寄存器中。當它看到I/O操作時,並不確定其他地方是否需要_cycles的值,所以它確保將其內容存回雙精度內存位置,將寄存器中的額外位四捨五入。下一個檢查假設在I/O操作期間值可能已經改變,並且從內存加載它,現在沒有額外的位使得它在前面的測試中不爲零。

正如Daniel Fischer在評論中提到的那樣,使用-ffloat-store禁止使用高精度寄存器。如果使用此選項時問題消失,那麼我描述的場景很可能會出現。檢查組裝輸出Router::Evaluate以確保。

+0

我試過'-ffloat-store'選項,但不幸的是,它沒有'幫助。至於編譯器錯誤,我嘗試了兩個版本 - 4.1.2和4.2.4,發生了同樣的事情,所以可能不是編譯器錯誤,我猜...? – ray 2012-08-06 18:52:29

+0

也許硬件問題? – DanielKO 2012-08-06 18:55:13

+0

我在另一臺機器上試了一下,發現了同樣的問題.. – ray 2012-08-06 18:58:12