2013-10-21 3 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 위에 합 축경만큼 간단

여기 num_threads
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 

병렬 영역을 실행하기 위해 사용되는 실의 실제 번호가 할당되는 공유 INTEGER 변수이다. 할당은 SINGLE 구조로되어 있습니다. 할당을 실행하는 데 하나의 스레드 만 (그리고 어느 것이 든 상관없이) 충분하기 때문에 구성이 SINGLE 구조에 들어갑니다.

관련 문제