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