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

时间:2014-03-28 14:31:21

标签: multithreading parallel-processing fortran openacc

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

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

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

感谢。

  1. 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 
    
  2. 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
    

1 个答案:

答案 0 :(得分:0)

不,OpenACC没有与threadprivate等效的内容。

如果您不限制函数参数的类型,则应该创建派生类型并发送它。