Чтобы суммировать комментарии @Vadimir F, @PetrH и @Ian Bu sh:
РЕДАКТИРОВАТЬ:
Если у меня была вторая переменная lnet=lnet-nue+nut
, которая должна использоваться всеми потоками, такими как lambdaeff
, как мне изменить оператор сокращения?
program main
use, intrinsic :: omp_lib
implicit none
integer :: i, tid, nthreads
integer :: nue, nut, lambdaeff = 0, lnet = 0
real :: r(2)
! Set number of threads
nthreads = OMP_get_max_threads()
write (*,*) "Using ", nthreads, "thread(s)"
!$OMP PARALLEL NUM_THREADS(nthreads) PRIVATE(tid)
! Who am I?
tid = OMP_get_thread_num()
! Reduction do loop
!$OMP DO REDUCTION(+:lambdaeff,lnet) PRIVATE(nue,nut,r)
do i = 1, 100
call random_number(r)
nue = int(100*r(1))
nut = int(50*r(2))
lambdaeff = lambdaeff + (nue-nut)**2
lnet = lnet+(nue-nut)
end do
!$OMP END DO
! lambdaeff is same for all threads
write (*,*) tid, lambdaeff, lnet
!$OMP END PARALLEL
end program main