2015-02-05 115 views
1

前一段時間我聽說有些編譯器使用SSE2擴展來實現x86_64架構的浮點運算,所以我使用這個簡單的代碼來確定它們之間的性能差異。x86和x86_64中的float和double之間的性能差異

我通過BIOS禁用了Intel SpeedStep技術,系統負載大致相當於我的測試。我在OpenSuSE 64位上使用GCC 4.8。

我正在寫一個程序有很多FPU操作,我想知道這個測試是否有效?

並瞭解每個架構下關於floatdouble之間性能差異的任何信息。

代碼:

#include <iostream> 
#include <sys/time.h>     
#include <vector> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    timeval t1, t2; 
    double elapsedTime; 

    double TotalTime = 0; 


    for(int j=0 ; j < 100 ; j++) 
    { 
     // start timer 
     gettimeofday(&t1, NULL); 

     vector<float> RealVec; 
     float temp; 

     for (int i = 0; i < 1000000; i++) 
     { 
      temp = static_cast <float> (rand())/(static_cast <float> (RAND_MAX)); 
      RealVec.push_back(temp); 
     } 

     for (int i = 0; i < 1000000; i++) 
      { 
       RealVec[i] = (RealVec[i]*2-435.345345)/15.75; 
      } 

     // stop timer 
     gettimeofday(&t2, NULL); 
     elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;  // sec to ms 
     elapsedTime += (t2.tv_usec - t1.tv_usec)/1000.0; // us to ms 

     TotalTime = TotalTime + elapsedTime; 
    } 


    cout << TotalTime/100 << " ms.\n"; 

    return 0; 
} 

和結果:

32位雙

157.781毫秒。 151.994 ms。 152.244 ms。

32 Bit Float

149.896 ms。 148.489 ms。 161.086 ms。

64位雙倍

110.125毫秒。 111.612 ms。 113.818毫秒。

64位浮點數

110.393 ms。 106.778 ms。 107.833 ms。

+0

LOL @「flouting point orations」.... – twalberg 2015-02-05 18:32:56

回答

0

你真的沒有太多的測量;也許只是編譯器 的優化程度。爲了使測量有效,您確實需要對結果進行一些操作,或者編譯器可以優化所有或測試的主要部分,例如 。我想要做的是1)初始化 的向量,2)獲得開始時間(可能使用clock,因爲 只考慮CPU時間),3)執行第二個循環a 100(或 更多...足以持續幾秒鐘,至少)時間,4)獲得結束時間,最後,5)輸出向量中元素的總和。

關於您可能會發現的差異:獨立於浮點處理器的 ,64位機器具有更多通用寄存器 供編譯器使用。這可能會產生巨大的影響。 除非您查看生成的彙編程序,否則您無法知道。

0

不是真的有效。你基本上正在測試隨機數發生器的性能。另外,你並沒有試圖強制執行SSE2 SIMD操作,所以你不能真正聲稱這與任何與SSE相關的東西相比。

+0

我也經歷過兩次向量,我認爲這是不正確的,我知道這不是一種做任何事情的好方法,但我想知道是什麼原因性能差異 – 2015-02-05 18:33:46

+1

然後深入挖掘;封裝你想比較的個人事物;使用'perf'等工具;閱讀SSE內部函數! – 2015-02-05 18:48:23

0

有效的是什麼意思?

使用您的實際代碼來衡量實際使用情況。

一些人工測試套件可能不會幫助您評估性能特徵。

您可以使用typedef,然後通過輕觸開關來更改實際的基礎類型。

相關問題