我正在使用OpenMP和Fortran。我將我的用例簡化爲一個簡單的例子。我有一個具有自定義派生類型的對象數組,每個對象都包含一個具有不同大小的數組。我想,以確保在循環無論發生什麼事,我申請減少到矢量對象的所有values
陣列組件:使用OpenMP減少數組數組的最佳方式是什麼?
program main
implicit none
integer :: i
type vector
real,allocatable :: values(:)
end type vector
type(vector) :: vectors(3)
allocate(vectors(1)%values(3))
vectors(1)%values = 0
allocate(vectors(2)%values(6))
vectors(2)%values = 0
allocate(vectors(3)%values(9))
vectors(3)%values = 0
!$OMP PARALLEL REDUCTION(+:vectors%values)
!$OMP DO
do i=1,1000
vectors(1)%values = vectors(1)%values + 1
vectors(2)%values = vectors(2)%values + 2
vectors(3)%values = vectors(3)%values + 3
end do
!$OMP END DO
!$OMP END PARALLEL
print*,sum(vectors(1)%values)
print*,sum(vectors(2)%values)
print*,sum(vectors(3)%values)
end program main
在這種情況下,REDUCTION(+:vectors%values)
不起作用,因爲我得到了以下錯誤:
test2.f90(22): error #6159: A component cannot be an array if the encompassing structure is an array. [VALUES]
!$OMP PARALLEL REDUCTION(+:vectors%values)
-------------------------------------^
test2.f90(22): error #7656: Subobjects are not allowed in this OpenMP* clause; a named variable must be specified. [VECTORS]
!$OMP PARALLEL REDUCTION(+:vectors%values)
-----------------------------^
compilation aborted for test2.f90 (code 1)
我試圖超載+
意義的載體類型,然後指定REDUCTION(+:vectors)
,但我仍然得到:
test.f90(43): error #7621: The data type of the variable is not defined for the operator or intrinsic specified on the OpenMP* REDUCTION clause. [VECTORS]
!$OMP PARALLEL REDUCTION(+:vectors)
-----------------------------^
推薦的處理方式是什麼衍生出這些類型並使其減少工作?
僅供參考,不OpenMP的編譯時正確的輸出是
3000.000
12000.00
27000.00
''vectors(1)%values''似乎不被認爲是有效的語法。如果我嘗試用gfortran 4.9.3進行編譯,我會在OpenMP變量列表中出現''語法錯誤''。這是否適合你,如果是這樣,你使用什麼編譯器? – astrofrog
@astrofrog'gfortran' 5.1接受這個... –
這是因爲語法檢查器需要一個變量名稱而不是表達式。你可以在gfortran-4.8中使用associate作爲解決方法,但後來的版本不喜歡它。 –