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可正常编译。
疑问
- 上述Fortran代码是否符合OpenMP 5.2规范?
- 若合规,有没有其他方式可以绕过gfortran的编译报错?
- 该报错是否是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
相关产品推荐
相关产品推荐

