2012-02-24 1 views
2

OpenMP를 사용한 이전 시도의 결과로 실제로 더 빠르게 실행되는 코드 조각의 예가 없음을 깨달았습니다. 내 시스템에서 직렬화에 비해 병렬화 할 때. 아래는 시도가 실패한 짧은 예입니다. 먼저 두 개의 코어가 있음을 보여 주며, openMP가 사용 중이며 두뇌가 죽은 두 가지 작업을 테스트합니다. 하나는 openMP를 사용하고 다른 하나는 그렇지 않습니다. 테스트 할 작업에 뭔가 문제가있을 가능성이 큽니다. 누군가 다른 정성 테스트를 수행 할 수 있다면 감사하게 생각합니다. 내 눈으로 볼 때 멀티 스레딩 CAN을 볼 수 있습니다. 작업 :내 시스템에서 openMP 속도 향상을 보여주는 최소한의 예제를 만드는 데 도움이 필요합니다.

#include <iostream> 
#include <vector> 
#include <ctime> 
#include <cmath> 

using namespace std; 

#include <omp.h> 

int main(int argc, char *argv[]) 
{ 


    //Below code will be run once for each processor (there are two) 
    #pragma omp parallel 
    { 
     cout << omp_get_thread_num() << endl; //this should output 1 and 0, in random order 
    } 


    //The parallel example: 
    vector <double> a(50000,0); 

    clock_t start = clock(); 
#pragma omp parallel for shared(a) 
    for (int i=0; i < 50000; i++)  
    { 
     double StartVal=i; 

     for (int j=0; j<2000; ++j) 
      a[i]=(StartVal + log(exp(exp((double) i)))); 
    } 

    cout<< "Time: " << ((double) (clock() - start)/(double)CLOCKS_PER_SEC) <<endl; 

    //The serial example: 
    start = clock(); 

    for (int i=0; i < 50000; i++)  
    { 
     double StartVal=i; 

     for (int j=0; j<2000; ++j) 
      a[i]=(StartVal + log(exp(exp((double) i)))); 
    } 

    cout<< "Time: " << ((double) (clock() - start)/(double)CLOCKS_PER_SEC) <<endl; 

    return 0; 
} 

출력은 다음과 같습니다

1 
    0 
    Time: 4.07 
    Time: 3.84 

OpenMP를이 밖으로 빠져 forloop 최적화 함께 할 수있는 뭔가 될 수 있을까? 아니면 시간을 측정하는 방법에 문제가 있습니까? 이 경우 다른 시험에 대한 아이디어가 있습니까?

은 사전에 감사합니다 :)

편집 : 그것은 참으로 내가 나쁜 방법으로 시간을 측정 한 것으로 판명했다. omp_get_wtime() 사용하여 출력된다 : 내가 더 나은 돌아가서 다음 내 오래된 질문에서 또 다른 모습을 거라고 생각

1 
0 
Time: 4.40776 
Time: 7.77676 

...

는 두 가지 가능성이 있습니다
+0

J 작게 내부 루프와 코드 3 속도의 요인에 대해 일어나 (I 실제 6가)와 리눅스 버추얼 박스를 사용하십니까? – Mysticial

답변

2

내가 생각할 수 :

  1. Linux에서 실행중인 경우. clock()은 Linux에서 벽 시간을 측정하지 않습니다. CPU 시간을 측정합니다.
    대신 omp_get_wtime()을 사용하는 것이 좋습니다.
  2. 테스트 결과가 충분하지 않습니다. 2000200000과 같은 형식으로 늘려보세요.

는 여기에 내가 내부 루프에 200000 반복을 사용하여 Windows에 무엇을 얻을 :

4 
5 
2 
3 
1 
6 
7 
0 
Time: 1.834 
Time: 6.792 

this question에 대한 나의 대답은 속도 향상을 달성하는 매우 간단한 OpenMP의 예제가 있습니다.

0

신비가 말했듯이, 아마도 당신이 측정하는 방법 일 것입니다. 리눅스에서는 clock_gettime을 사용할 수 있습니다. 는 4 개 코어 심지어 당신이 어떤 OS를 실행중인된다 < (20)

#include <sys/time.h> 

int main(...) ... same as your code ...  
    timespec ts1; 
    timespec ts2; 

    //start measurement: 
    clock_gettime(CLOCK_REALTIME, &ts1); 

    ... code to time here ... 

    //stop measurement: 

    clock_gettime(CLOCK_REALTIME, &ts2); 

    cout<< "clock Time s: " << (ts2.tv_sec-ts1.tv_sec) + 1e-9*(ts2.tv_nsec-ts1.tv_nsec) <<endl; 

    ... } 
관련 문제