在我的OpenMP项目中,我在线程子例程"tool"上使用do循环,并且限制将单变量函数传递给线程子例程"tool"。然而,在我的数学模型中,该函数必须再接受一个参数,因此我需要将第二个线程相关变量提供给各自的线程。
对于我需要的函数,我只需添加指令"!$OMP THREADPRIVATE(i),"它工作完美。我想知道如何将此代码移植到OpenACC。
在我看来,新的OpenACC 2.0标准可以处理这个问题,但是我在互联网上找不到任何详细的教程和示例代码来说明如何使用新的指令,如"routine"来调用并行区域内的线程相关函数或子例程。
谢谢。
李主要。
法郎program main use toolbox real :: a(5),c(5) integer :: j a = [((j),j=1,9,2)] b = [((j),j=2,10,2)] !$OMP PARALLEL DO SHARED(b) do j=1,5 i=j call tool(fun1,a(j),c(j)) enddo !$OMP END PARALLEL DO write(6,'5(f3,x)') c end program main
模型。
法郎module toolbox integer :: i !$OMP THREADPRIVATE(i) real :: b(5) contains subroutine tool(func,e,f) interface real function func(x) real :: x end function func end interface real :: e,f f=func(e) end subroutine tool function fun1(z) real :: fun1,z fun1=z+b(i) end function fun1 end module toolbox
不,OpenACC没有等价的threadprivate
如果你的函数参数不受类型限制,你应该创建一个派生类型并发送它。