理解正确使用!$ omp parallel do reduction(...)

时间:2014-06-14 21:17:48

标签: fortran fortran90 openmp

我正在尝试编写一个程序,使用OpenMP计算Fortran 90中1和某些数字n之间的素数。嵌套循环只计算非素数的数字。我想使用omp parallel do加快速度。据我所知,由于我只计算不是素数的数字,所以只使用像!$omp parallel do reduction(+:not_primes)这样的东西是合适的。当我在没有!$omp lines的情况下以串行方式运行下面的代码时,我得到以下输出

 Primes:        5134
 OpenMP time elapsed  0.49368596076965332  

但是当我包含!$ omp行时,我得到了

 Primes: -1606400834
 OpenMP time elapsed  0.37933206558227539 

我在这里正确使用了parallel do吗? (显然不是,但为什么?)谢谢!

program prime_counter

integer n, not_primes, i, j
real*8 :: ostart,oend, omp_get_wtime

ostart = omp_get_wtime()
n=50000

!$omp parallel do reduction(+:not_primes)
do i=2,n
    do j=2,i-1
        if(mod(i,j)==0) then
            not_primes= not_primes+1
            exit
        end if
    end do
end do
!$omp end parallel do


print*, 'Primes:', n-not_primes
oend = omp_get_wtime()
write(*,*) 'OpenMP time elapsed', oend-ostart

end program

1 个答案:

答案 0 :(得分:2)

你没有在任何地方初始化not_primes,它是未定义的。 OpenMP减少的使用是可以的。索引j应标记为私有,我通常将所有索引标记为私有,但这不是必需的。

not_primes = 0

!$omp parallel do reduction(+:not_primes) private(i,j)