2013-06-11 5 views
2
void* worker(void*) 
{ 
    int clk = clock(); 
    float val = 0; 
    for(int i = 0; i != 100000000; ++i) 
    { 
     val += sin(i); 
    } 
    printf("val: %f\n", val); 
    printf("worker: %d ms\n", clock() - clk); 
    return 0; 
} 

int main() 
{ 
    pthread_t tid; 
    pthread_create(&tid, NULL, worker, NULL); 
    int clk = clock(); 
    float val = 0; 
    for(int i = 0; i != 100000000; ++i) 
    { 
     val += sin(i); 
    } 
    printf("val: %f\n", val); 
    printf("main: %d ms\n", clock() - clk); 
    pthread_join(tid, 0); 
    return 0; 
} 

메인 스레드와 작업자 스레드가 동일하게 빠르게 실행되어 있지만, 결과가된다 :주 스레드가 pthread-win32에서 작업자 스레드보다 느린 이유는 무엇입니까?

val: 0.782206 
    worker: 5017 ms 
    val: 0.782206 
    main: 8252 ms 

메인 스레드가 훨씬 느린, 난 .... 왜 모르는


문제가 해결되었습니다. 이것은 컴파일러의 문제입니다. GCC (MinGW)는 Windows에서 이상하게 작동합니다. Visual Studio 2012에서 코드를 작성했는데 속도 차이가 없습니다.

+1

더 공정한 테스트를 수행하려면 먼저 printfs를 타이밍 측정에서 제외하십시오. (이것으로 3 초 차이를 알 수 있을지는 의심 스럽지만) –

+0

또한 코드를 복제하는 대신 공통된 기능을 사용하십시오. 그리고 컴파일러 최적화 (-O3)를 설정하는 것을 잊지 마십시오. – syam

+0

멀티 코어 프로세서에서 * 실행되고 있습니까? –

답변

0

일어날 수있는 일은 작업자 스레드 실행이 주 실행과 인터리브되어 작업자 스레드의 실행 시간 중 일부가 주 시간에 대해 계산되는 것입니다. 작업자의 맨 처음에 sleep(10) (작업자와 주의 런타임보다 약간 큰 시간)을두고 다시 실행할 수 있습니다.

+0

'clock()'이 벽시계 시간이나 개별 프로세서 시간을 측정하는지 여부에 관계없이 설명합니다. 하나의 스레드가 ** 다른 스레드보다 ** 3 초 ** 더 많이 보입니다. –

+0

@OliCharlesworth 어떤 방법으로 이것이 설명되지 않습니까? 인터리빙 된 경우 메인에는 작업자에게 보낸 시간이 포함됩니다. – Bogatyr

+1

@Oli Charlesworth 실제로'clock'은 'ms'가 아닌'us'를 측정합니다. 그래서 3 초가 아니라 3 초가 걸립니다. 그리고 테스트 머신에서 문제를 재현 할 수 없었습니다. –

1
Main thread and the worker thread are supposed to run equally fast, but the result is: 

그런 보장을 제공하는 실시간 OS 외부의 스레딩 시스템을 본 적이 없습니다. 윈도우즈 스레드와 다른 모든 스레딩 시스템 (나는 posix 쓰레드를 사용하고 MacOS X의 경량 쓰레딩과 C# 쓰레드의 쓰레드)을 데스크톱 시스템에서 사용하면 성능에 대한 보장이나 빠른 속도가 없다는 것을 이해할 수 있습니다. 하나의 스레드는 다른 스레드와 관련됩니다.

가능한 설명 (추측)은 현대 쿼드 코어를 사용하기 때문에 주 코어의 클럭 속도를 높일 수 있습니다. 대부분의 단일 스레드 작업 부하가있는 경우 현대 i5/i7/AMD-FX 시스템은 한 코어의 클록 속도를 재고 수준의 냉각으로 열을 분산시킬 수있는 사전 수준으로 올립니다. 보다 많은 병렬 작업 부하에서 모든 코어는 클럭 속도에서보다 작은 충돌을 얻었으며, 열 방출 및 유휴 상태에서 모든 코어가 전력 사용을 최소화하기 위해 스로틀 링되는 경우 다시 미리 계산됩니다. 백그라운드 작업량이 대부분 단일 코어에서 수행되고 두 번째 스레드가 두 번째 코어에서 소비하는 시간만으로는 모든 코어 속도가 향상되는 모드로 전환하는 것을 정당화 할만큼 충분하지 않을 수도 있습니다.

4 개의 스레드와 10x 작업 부하로 다시 시도합니다. CPU로드 및 클럭 속도를 모니터링하는 도구가있는 경우이를 확인할 것입니다. 그 정보를 사용하여 당신이 옳거나 틀린지를 추측 할 수 있습니다.

다른 옵션으로 프로파일 링하고 작업의 어느 부분이 시간이 걸리는지 볼 수 있습니다. OS 호출이 작업량보다 많은 시간이 걸릴 수 있습니다.

안정된 클럭 속도 또는 단일 코어와 같은 성능 특성이 다른 다른 컴퓨터에서 소프트웨어를 테스트 할 수도 있습니다. 이것은 더 많은 정보를 제공 할 것입니다.

+0

감사합니다. Linux에서 테스트 해 보겠습니다. –

+1

@ triple10 OS, Windows 및 Linux 간의 클럭 속도 차이가 클럭 속도를 변경하는 다양한 메커니즘을 사용하도록주의하십시오. BIOS/EFI에서이 기능을 비활성화하면 내 대답에서도 내 가설을 테스트 할 수 있습니다. – Sqeaky

관련 문제