2014-03-01 59 views
0

我正在學習如何將我的FORTRAN源代碼移植到Openmp,並遇到了有關如何處理包含在並行區域之前定義的全局變量的線程子例程的基本問題調用子程序駐留。在由線程子例程調用的函數中使用全局變量

以下是我爲這個問題編寫的示例代碼。我乘以1到1000000的一系列值,由全局變量「p1」命名爲「a」。乘法由一個並行子程序執行,子程序調用一個函數「afun」來執行元素乘法a(i)* p1並將相應的結果保存到相應的b(i)中。 「p1」的值被分配到並行區域之外,因此子程序「asub」和它的被調用函數「afun」的全局變量。

請問我需要哪些額外的Openmp配置才能成功運行程序?

program common_test 
    use omp_lib 
    implicit none 
    integer :: a(100000),b(100000) 
    integer :: p1,i 
    common /p_com/ p1 
    !$omp threadprivate(/p_com/) 
    do i=1,100000 
     a(i)=i 
    enddo 
    p1=2 
    !$omp parallel do shared(a,b) private(i) copyin(p1) 
    do i=1,100000 
     call asub(afun,i,b(i)) 
    enddo 
    !$omp end parallel do 
contains 
    subroutine asub(func,x,y) 
     implicit none 
     interface 
      function func(x,p) 
      implicit none 
      integer :: x,p,func 
      end function func  
     end interface 
     integer, intent(in) :: x 
     integer, intent(out) :: y 
     integer :: p1 
     common /p_com/ p1 
     y=func(x,p1)  
    end subroutine asub 

    function afun(x,p) 
     implicit none 
     integer, intent(in) :: x 
     integer :: p,afun 
     afun=x*p 
    end function afun 
end program common_test 

回答

0

我終於得到了示例代碼運行沒有收到來自英特爾編譯器的投訴。我做的更正是在主程序中第二個Openmp指令的行末尾用copyin(/ p_com /)替換copyin(p1)。也就是,

program common_test 
    use omp_lib 
    implicit none 
    integer :: a(100000),b(100000) 
    integer :: p1,i 
    common /p_com/ p1 

    !$omp threadprivate(/p_com/) 
    do i=1,100000 
     a(i)=i 
    enddo 

    p1=2 
    !$omp parallel do shared(a,b) private(i) copyin(/p_com/) 
    do i=1,100000 
     call asub(afun,i,b(i)) 
    enddo 
    !$omp end parallel do 
contains 
    subroutine asub(func,x,y) 
     implicit none 
     interface 
     function func(x,p) 
     implicit none 
     integer :: x,p,func 
     end function func  
     end interface 
     integer, intent(in) :: x 
     integer, intent(out) :: y 
     integer :: p1 
     common /p_com/ p1 
     y=func(x,p1)  
    end subroutine asub 

    function afun(x,p) 
     implicit none 
     integer, intent(in) :: x 
     integer :: p,afun 
     afun=x*p 
    end function afun 
end program common_test 
相關問題