2014-03-28 43 views
0

在我的OpenMP項目中,我在一個線程子程序「工具」上使用了一個do循環,並且僅限於將一個單變量函數傳遞給線程子程序「工具」。但是,在我的數學模型中,函數必須再多一個參數,所以我需要將第二個線程相關變量提供給相應的線程。是否存在OpenMP指令THREADPRIVATE的OpenACC對應部分?

對於我需要的功能,我只需添加指令「!$ OMP THREADPRIVATE(i)」,它的功能非常完美。我想知道如何將此代碼移植到OpenACC。

在我看來,新的OpenACC 2.0標準可以處理這個問題,但我找不到任何有關Internet示例代碼的詳細教程,以說明使用諸如「例程」之類的新指令來調用線程 - 並行區域內的相關函數或子例程。

謝謝。

  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 
    

回答

0

不,OpenACC的不具有相當於THREADPRIVATE。

如果你不限制你的函數參數的類型,你應該創建一個派生類型併發送它。