是否存在OpenMP指令的OpenACC对应的THREADPRIVATE



在我的OpenMP项目中,我在线程子例程"tool"上使用do循环,并且限制将单变量函数传递给线程子例程"tool"。然而,在我的数学模型中,该函数必须再接受一个参数,因此我需要将第二个线程相关变量提供给各自的线程。

对于我需要的函数,我只需添加指令"!$OMP THREADPRIVATE(i),"它工作完美。我想知道如何将此代码移植到OpenACC。

在我看来,新的OpenACC 2.0标准可以处理这个问题,但是我在互联网上找不到任何详细的教程和示例代码来说明如何使用新的指令,如"routine"来调用并行区域内的线程相关函数或子例程。

谢谢。

  1. 主要。

    法郎
    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 
    
  2. 模型。

    法郎
    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

如果你的函数参数不受类型限制,你应该创建一个派生类型并发送它。

最新更新