2012-02-06 15 views
2

我正在運行一個Fortran代碼(使用英特爾Fortran編譯),該代碼具有一個OpenMp並行區域,我希望在該區域中可以訪問存儲在派生類型向量(whis具有不同類型的可分配字段)中的數據。是否可以在OpenMP並行區域內使用具有共享屬性的派生類型變量?

每個線程只能在這個向量中的一個位置工作,所以我想讓這個向量具有「共享」屬性。

當運行代碼時,我得到一些奇怪的錯誤,因此我想知道是否有可能使用這種派生類型向量?

回答

5

當然,沒有任何問題,使用派生類型:

program derivedtype 
    use omp_lib 
    implicit none 

    integer, parameter :: sz=20 

    type mytype1 
     integer, dimension(sz) :: a 
     real , dimension(sz) :: b 
    end type mytype1 

    type mytype2 
     integer :: a 
     real :: b 
    end type mytype2 

    type(mytype1) :: var1 
    type(mytype2), dimension(sz) :: var2 
    integer:: i 
    integer:: isum 
    real :: rsum 

    var1%a = 2 
    var1%b = 1. 
    forall (i=1:sz) 
     var2(i)%a = 3 
     var2(i)%b = 4. 
    endforall 

    isum = 0 
    rsum = 0. 
    print *, var1%a 
    print *, var1%b 
    print *, [(var2(i)%a, i=1,sz)] 
    print *, [(var2(i)%b, i=1,sz)] 

!$omp parallel do default(none) shared(var1,var2), reduction(+:rsum), reduction(+:isum) 
    do i=1,sz 
     isum = isum + var1%a(i) + var2(i)%a 
     rsum = rsum + var1%b(i) + var2(i)%b 
    enddo 

    print *,'isum = ', isum 
    print *,'rsum = ', rsum 
end program derivedtype 

的問題可能有事情做與分配的部分,而這一點更微妙的; OpenMP3.0並沒有真正處理帶有可分配組件的派生類型,而且我不清楚3.1(如果有的話)有關此事的說法。但即使除此之外,在OpenMP中可分配的方法也存在問題 - C和指針會出現同樣的問題。你能否給我們一個例子,說明究竟是什麼失敗了?

相關問題