2012-02-04 79 views
1

我想指出使用OpenMP的串行和並行程序之間的區別。我從事科學Linux工作。 這是一個簡單的程序,執行和和乘法,然後求和結果。我無法優化並行化程序

我使用函數omp_get_wtime()來檢查執行時間,結果是並行化的部分運行速度比串行部分慢。 我認爲問題在於這種情況,因爲兩個線程都進入了交換機,這增加了執行時間。 我希望第一個線程產生總和,第二個線程進行乘法運算,以加速最終結果。你可以幫我嗎?

在我使用該程序的開頭:

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

這是程序:

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 2012-02-04 12:31:40

+0

還要注意:即使switch語句可能會比計算更昂貴(除非它至少被優化),而不是提及測量(以及在線程上的工作分配)。所以,你真的只是測量任何東西,但計算所需的時間(順便說一句,你最後的'printf'被打破)。試圖計算不需要數千個時鐘週期的計算通常是非常沒有意義的(並且對於openmp是有益的,您可能需要至少數以萬計的操作) – Grizzly 2012-02-06 01:51:38

回答

4

有一些固定開銷起轉線程和分配工作。對於像乘法這樣的簡單操作,這種開銷遠遠超過了通過並行執行操作節省的時間。

如果你給線程一些實際的工作,你更有可能看到好處。

+0

謝謝!現在我試着做點什麼...... 如果你或者其他人有任何想法,我會歡迎的。 – 2012-02-04 12:32:21