2014-02-25 51 views
1

我是一個openmp的初學者。我正在試圖簡化一個簡單的循環。但它顯然是錯誤的。 任何人都可以提供幫助嗎?openmp給出了順序不同的結果

use omp_lib 
implicit none 
integer ::n=20,it,j 
real(8) :: a=0,b=5,s,func,del,sum1,tnm,x 
it=2**(n-2) 
tnm=it 
del=(b-a)/tnm 
x=a+.5*del 
sum1=0.0 

!$omp parallel do reduction(+:sum1) 
do j=1,it 
    sum1=sum1+func(x) 
! write(*,*)func(x) 
    x=x+del 
end do 
!$omp end parallel do 
s=.5*(s+(b-a)*sum1/tnm) 
write(*,*)s,sum1,it,del 
end 

function func(x) 
    real(8)::x 
    func=x 
end function 

編輯 結果:

並行運行::

$ ifort -openmp trapzd.f90 
$ ./a.out 
    0.976562500000000  102400.000000000   262144 
    1.907348632812500E-005 

連續運行

$ ifort trapzd.f90 
$ ./a.out 
    6.25000000000000  655360.000000000   262144 
    1.907348632812500E-005 

s,sum1在這兩個運行不同

+0

@HighPerformanceMark:結果追加。 – BaRud

回答

3

我在這裏看到的三個問題:

  • 一種功能缺失的類型聲明func
  • s用於初始化
  • 可變x
競爭條件

這適用於我:

program test 
    use omp_lib 
    implicit none 

    integer  :: n=20,it,j 
    real(8)  :: a=0,b=5,s,func,del,sum1,tnm,x,x0 
    it=2**(n-2) 
    tnm=it 
    del=(b-a)/tnm 
    x=a+.5*del 
    sum1=0.0 

    x0 = x 
    !$omp parallel do reduction(+:sum1) 
    do j=1,it 
    sum1=sum1+func(x0+j*del) 
    ! write(*,*)func(x) 
    end do 
    !$omp end parallel do 

    ! s is uninitialized here - set it to 0 
    ! ...probably not what you had in mind 
    s = 0. 
    s=.5*(s+(b-a)*sum1/tnm) 
    write(*,*)s,sum1,it,del 

end program 

real(8) function func(x) 
    real(8)::x 
    func=x 
end function 

編譯時gfortran

編譯時 ifort
OMP_NUM_THREADS=1 ./a.out 
    6.2500000000000000  655360.00000000000   262144 1.9073486328125000E-005 
OMP_NUM_THREADS=6 ./a.out 
    6.2500000000000000  655360.00000000000   262144 1.9073486328125000E-005 

OMP_NUM_THREADS=1 ./a.out 
    6.25000000000000  655360.000000000   262144 1.907348632812500E-005 
OMP_NUM_THREADS=6 ./a.out 
    6.25000000000000  655360.000000000   262144 1.907348632812500E-005 
+0

謝謝。 可能是'sum1 = sum1 + func(x0 + j * del)'這一行就是這樣做的。 – BaRud

相關問題