在我的OpenMP项目中,我在一个线程子程序"工具"上使用了一个do循环。并限制将单变量函数传递给线程子程序"工具。"但是,在我的数学模型中,函数必须再接受一个参数,因此我需要将第二个与线程相关的变量提供给各自的线程。
对于我需要的功能,我只需添加指令"!$ OMP THREADPRIVATE(i),"它完美无缺。我想知道如何将此代码移植到OpenACC。
在我看来,新的OpenACC 2.0标准可以解决这个问题,但是我找不到任何有关Internet上示例代码的详细教程来说明新指令的使用,例如" routine"在并行区域内调用与线程相关的函数或子例程。
感谢。
利
MAIN.F90
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
MODEL.F90
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
答案 0 :(得分:0)
不,OpenACC没有与threadprivate等效的内容。
如果您不限制函数参数的类型,则应该创建派生类型并发送它。