2012-02-04 3 views
1

OpenMP에서 직렬 및 병렬 프로그램 간의 차이점을 지적하고자합니다. 나는 과학 리눅스에서 일한다. 이것은 합계와 곱셈을 수행 한 다음 결과를 합하는 간단한 프로그램입니다.프로그램의 병렬 처리로 최적화 할 수 없습니다.

실행 시간을 확인하기 위해 omp_get_wtime() 함수를 사용했는데 병렬 처리 된 부분이 직렬 부분보다 느리게 실행됩니다. 두 스레드가 스위치에 들어가기 때문에 문제가 발생한 것 같아 실행 시간이 길어집니다. 최종 결과의 속도를 높이기 위해 첫 번째 스레드가 합계를 만들고 두 번째 스레드가 곱셈을 수행하기를 바랍니다. 너 나 좀 도와 줄 수있어? 내가 사용하는 프로그램의 시작 부분에서

:

double a,b,c,d,g,timer,timer2; 

printf("Insert 2 numbers \n"); cin >> a; cin >> b; 

timer = omp_get_wtime(); 

c = a+b; 
d = a*b; 
g = c+d; 


printf("the result is: %f\n\n",g); 
printf("time: %f seconds\n\n",omp_get_wtime()-timer); 




timer2 = omp_get_wtime(); 
#pragma omp parallel 
{ 
    switch (omp_get_thread_num()) 
    { 
     case 1: c=a+b; 
     case 2: d=a*b; 
    }    
} 
g = c+d; 

printf("parallel time: %f seconds\n\n",g,omp_get_wtime()-timer2); 
+1

참고 : 여기에서 측정 한 대부분의 경과 시간은 첫 번째 printf 문에서 보냅니다. – enobayram

+0

참고 : switch 문조차도 (적어도 최적화되지 않은 경우) 계산이 더 비쌀 확률이 높습니다. 말하자면 측정 (및 스레드에 작업 배포). 그래서 실제로 계산에 필요한 시간을 측정합니다. (마지막으로'printf'가 깨졌습니다). 수천 클럭 사이클을 사용하지 않는 시간 계산을 시도하는 것은 일반적으로 무의미합니다 (그리고 openmp가 유용 할 수 있으려면 최소한 수만 개의 작업이 필요할 것입니다) – Grizzly

답변

4

스레드를 회전하고 작업을 배포하는 어떤 일정한 오버 헤드가있다 :

#define NUM_THREADS 2 
... 
omp_set_num_threads(NUM_THREADS); 

이는 프로그램이다. 곱셈과 같은 간단한 작업의 경우이 오버 헤드는 작업을 병렬로 수행하여 절약 한 시간보다 훨씬 큽니다.

스레드에게 실제 작업을 제공하면 이점을 볼 가능성이 더 큽니다.

+0

감사합니다! 이제 나는 무언가를하려고 노력합니다 ... 당신이나 다른 누군가가 그것을 환영 할 생각이 있습니다. –

관련 문제