0

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

对于我需要的函数,我只需添加指令“!$OMP THREADPRIVATE(i)”,它就可以完美运行。我想知道如何将此代码移植到 OpenACC。

在我看来,新的 OpenACC 2.0 标准可以处理这个问题,但是我在 Internet 上找不到任何详细的示例代码教程来说明如何使用新指令(例如“例程”)来调用线程相关的函数或子例程平行区内。

谢谢。

  1. 主.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. 型号.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
    
4

1 回答 1

0

不,OpenACC 没有 threadprivate 的等价物。

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

于 2014-07-07T17:21:44.153 回答