2015-02-05 3 views
1

이전에 일부 컴파일러는 x86_64 아키텍처의 부동 소수점 연산에 SSE2 확장을 사용한다고 들었으므로이 간단한 코드를 사용하여 성능 차이를 확인했습니다.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 MS. 151.994 ms. 152.244 ms.

32 비트 플로트

149.896 ms. 148.489 ms. 161.086.

64 비트 더블

110.125 ms. 111.612 ms. 113.818 ms.

64 비트 플로트

110.393 ms. 106.778 ms. 107.833 ms.

+0

LOL @ "flouting point orations".... – twalberg

답변

0

당신은 실제로 많이 측정하지 않습니다. 아마도 컴파일러의 정도는 최적화 일 것입니다. 측정 값을 유효하게하려면 실제로는 결과와 함께 수행해야하거나 컴파일러가 전체 또는 테스트의 주요 부분을 최적화 할 수 있습니다. 내가 뭘 woule합니까 1) 벡터를 초기화 2)) (단지 CPU 시간을 차지하기 때문에) clock을 사용하여 시작 시간을 얻을 3) 두 번째 루프를 실행 100 (또는 더 ...4) 최소 종료 시간은 이고 마지막으로 5)는 벡터의 요소 합계를 출력합니다.

차이점에 관해서는 부동 소수점 프로세서와 별개로 64 비트 시스템에는 컴파일러가 재생할 수있는보다 일반적인 레지스터 이 있습니다. 이것은 엄청난 영향을 미칠 수 있습니다. 생성 된 어셈블러를 보지 않으면 알 수 없습니다.

0

유효하지 않습니다. 기본적으로 난수 생성기의 성능을 테스트하고 있습니다.

또한 SSE2 SIMD 작업을 시행하지 않으므로 SSE 관련 모든 것을 비교할 수는 없습니다.

+0

그리고 나는 또한 두 번이나 생각하지 않는 벡터를 통과합니다. 나는 그 일을하는 좋은 방법이 아니라는 것을 알고 있습니다. 이유가 무엇인지 알고 싶습니다. 성능 차이가 –

+1

더 깊게 파고; 비교하고 싶은 개별적인 것들을 캡슐화하십시오. 'perf'와 같은 도구를 사용하십시오; SSE 내장 함수를 읽어보십시오! –

0

어떤 의미로 유효합니까?

실제 코드를 사용하여 실제 사용량을 측정합니다.

일부 인공 테스트 도구는 성능 특성을 평가하는 데 도움이되지 않을 수도 있습니다.

typedef을 사용할 수 있으며 스위치를 쓸어 넘겨 실제 기본 유형을 변경할 수 있습니다.