2013-10-21 32 views
0

在我的OPENMP代碼中,我希望所有線程都做同樣的工作,最後取平均值(基本上計算錯誤)。 (我怎麼計算錯誤?每個線程產生不同的隨機數,所以從每個線程的結果是不同的。)OPENMP在線程上運行相同的作業

下面是簡單的代碼

program ... 

.. 
!$OMP PARALLEL 
do i=1,Nstep 
!.... some code goes here 
result=... 


end do 
!$END PARALLEL 
sum = result(from thread 0)+result(from thread 1)+... 
sum = sum/(number of threads) 

只要我要送做循環內OPENMP所有線程,而不是阻止這個循環。 我可以用MPI和MPI_reduce做我想做的,但我想寫一個混合代碼OPENMP + MPI。我還沒有想出OPENMP部分,請提供建議?

回答

1

這是因爲在施加result總和減少簡單:

USE omp_lib ! for omp_get_num_threads() 
INTEGER :: num_threads 

result = 0.0 
num_threads = 1 

!$OMP PARALLEL REDUCTION(+:result) 
!$OMP SINGLE 
num_threads = omp_get_num_threads() 
!$OMP END SINGLE 
do i = 1, Nstep 
... 
result = ... 
... 
end do 
!$END PARALLEL 
result = result/num_threads 

這裏num_threads是分配用於執行並行區域的線程的實際數目的共享INTEGER變量。該作業放在SINGLE構造中,因爲它只需一個線程 - 無論哪一個 - 執行分配。

相關問題