Taylor
Taylor

Reputation: 33

OPENMP running the same job on threads

In my OPENMP code, I want all threads do the same job and at the end take the average ( basically calculate error). ( How I calculate error? Each thread generates different random numbers, so the result from each threads is different.)

Here is simple code

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)

Simply I have to send do loop inside OPENMP to all threads, not blocking this loop. I can do what I want using MPI and MPI_reduce, but I want to write a hybrid code OPENMP + MPI. I haven't figured out the OPENMP part, so suggestions please?

Upvotes: 0

Views: 93

Answers (1)

Hristo Iliev
Hristo Iliev

Reputation: 74395

It is as simple as applying sum reduction over 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

Here num_threads is a shared INTEGER variable that is assigned the actual number of threads used to execute the parallel region. The assignment is put in a SINGLE construct since it suffices one thread - and no matter which one - to execute the assignment.

Upvotes: 1

Related Questions