我正在尝试编写一个程序,使用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
答案 0 :(得分:2)
你没有在任何地方初始化not_primes
,它是未定义的。 OpenMP减少的使用是可以的。索引j
应标记为私有,我通常将所有索引标记为私有,但这不是必需的。
not_primes = 0
!$omp parallel do reduction(+:not_primes) private(i,j)