You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenMP 5.2中Fortran嵌套结构元素在depend子句的合法性问询

OpenMP 5.2中Fortran嵌套结构数组在depend子句中的合规性问题

问题背景

在理解OpenMP 5.2规范中Fortran类型在depend子句的允许规则时遇到困惑,核心代码片段如下:

!$omp task private(jj, i) firstprivate(j, jj_end) shared(e12c) depend(out: e12c%e12f%e12t)

其中e12c%e12f%e12t是嵌套派生类型中的二维数组。

规范依据

OpenMP 5.2规范第62页明确指出:

除非另有规定,作为另一变量一部分的变量(如数组元素或结构元素)不能是变量列表项、扩展列表项或定位符列表项。

已知非嵌套结构成员(如e12c%e12t)和数组元素可以正常在depend子句中使用,gfortran 12与Intel Fortran均能编译通过,但嵌套多层的结构成员(如e12c%e12f%e12t)的合规性存疑。

编译表现

  • gfortran 12:编译报错,错误信息如下:
gfortran -fopenmp test.f90
test.f90:26:82:

   26 |   !$omp task private(jj, i) firstprivate(j, jj_end) shared(e12c) depend(out: e12c%e12f%e12t)
      |                                                                                  1
Error: Syntax error in OpenMP variable list at (1)
  • Intel Fortran 2023.0.0:可正常编译运行。
  • 对应C语言版本:depend(out: e12c.e12f.e12t[j:j+32])使用gcc 12可正常编译。

疑问

  1. 上述Fortran代码是否符合OpenMP 5.2规范?
  2. 若合规,有没有其他方式可以绕过gfortran的编译报错?
  3. 该报错是否是gfortran对OpenMP 5.2规范的支持滞后导致?

完整测试代码

module ax
    implicit none
type array_container
    real, dimension(500, 500) ::e12t
end type

type array_container2
    type(array_container) :: e12f
end type

end module ax

Program test
use ax
type(array_container2) :: e12c
integer, dimension(500,500):: dum
integer :: i, ii, j, jj, jj_end

e12c%e12f%e12t(:,:) = 1.0

!$omp parallel default(shared) private(j, jj_end)
!$omp single
DO j = 1, 500, 32
  jj_end =  MIN(j_out_var + (32 - 1), 500)  ! 注:原代码中j_out_var未定义,推测为笔误

  !$omp task private(jj, i) firstprivate(j, jj_end) shared(e12c) depend(out: e12c%e12f%e12t)
  Do jj = j, jj_end, 1
    Do i = 1, 500, 1
      e12c%e12f%e12t(i,j) = 1.0
    End Do
  End Do
  !$omp end task
End Do
!$omp end single
!$omp end parallel

End Program

内容的提问来源于stack exchange,提问作者LonelyCat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:15:30