2017-01-14 82 views
3

我測試了三個C++程序代碼,其中將數據從內存加載到CPU,執行簡單的+或x操作(在此計算時間),然後報告結果。這三個代碼具有相同的結構,但具有不同的數據類型(int,double,float)。編譯器優化如何影響數據加載速度?

測試結果是:當兩個代碼的數據大小都是2倍時,時間是2倍。

但是,我有以下意見。

觀察1:當不使用優化時,時間減慢2倍。但是,由於加載時間(瓶頸)不應該受編譯器影響,這很奇怪。觀察2:當不添加編譯器優化並且數據大小固定(256MB,512MB,1024MB,2048MB,512MB)時,雙類型程序代碼的時間比整型和浮點類型程序代碼快兩倍。 4096MB)。這也很奇怪,因爲double應該是最慢的一個。

備註觀察2:當我添加編譯器優化(O,O2,O3)時,這三個代碼的時間是相似的。

的attched代碼是在這裏:

int main() 
{ 
    float value; 
    double totalTimeDifference; 

    const int numberOFElements=178956970; //4GB for 6 arrays in total 
    float*FLOAT_Array_one=new float[numberOFElements]; 
    float*FLOAT_Array_two=new float[numberOFElements]; 
    float*FLOAT_Array_three=new float[numberOFElements]; 
    float*FLOAT_Array_four=new float[numberOFElements]; 
    float*FLOAT_Array_five=new float[numberOFElements]; 
    float*FLOAT_Array=new float[numberOFElements]; 

    srand(time(NULL)); 
    for(int i=0;i<numberOFElements;i++) 
    { 
     FLOAT_Array_one[i]=rand()% 400; 
     FLOAT_Array_two[i]=rand()% 400; 
     FLOAT_Array_four[i]=rand()% 400; 
     FLOAT_Array_five[i]=rand()% 400; 
    } 

    timeval tim1; 
    timeval tim2; 
    gettimeofday(&tim1,NULL); 

    //****************************// 
    for(int i=0;i<numberOFElements;i++) 
    { 
     FLOAT_Array[i]=FLOAT_Array_one[i]+FLOAT_Array_two[i]; 
    } 
    //****************************// 

    //****************************// 
    for(int i=0;i<numberOFElements;i++) 
    { 
     FLOAT_Array_three[i]=FLOAT_Array_four[i]*FLOAT_Array_five[i]; 
    } 
    //****************************// 
    gettimeofday(&tim2,NULL); 

    double t1=tim1.tv_sec+(tim1.tv_usec/1000000.0); 
    double t2=tim2.tv_sec+(tim2.tv_usec/1000000.0); 

    for(int i=0;i<numberOFElements;i++) 
    { 
     if(i%2==0) 
      value=value+FLOAT_Array[i]+FLOAT_Array_three[i]; 
     else 
      value=value-FLOAT_Array[i]-FLOAT_Array_three[i]; 
    } 

    totalTimeDifference=t2-t1; 
    cout<<value<<endl; 
    cout<<totalTimeDifference<<endl; 
} 
+1

惡魔的細節。如果沒有看到代碼(並且猜測生成的程序集),我們只能猜測實際發生的事情。 – Mat

+2

非優化代碼的時序並不令人感興趣,因爲您告訴編譯器「不要急於使其更快」。所以它不會,程序可能包含大量不必要的代碼。 –

+0

我在這裏添加了代碼。這是浮動版本。 – user295106

回答

1

一些猜測:

  1. 因爲你是在這兩個時間檢查之間的「加載」做算術運算,可以使用SSE僅在優化時纔會流式傳輸浮點數學指令。這應該會導致顯着的加速。
  2. 如果您使用的是64位操作系統,則對於兩個半字的內存訪問需要的時間比完整的一個要多。在一個64位程序中,一個浮點只佔用32位,隨後對半字的訪問花費的時間比單個訪問整個單詞的時間多。然而,我不瞭解的部分是如何優化能夠解決這個問題。