我目前正在尝试使用任务构建OpenMP 4.0,包括取决于声明用于我的Fortran代码。因此,我创建了下面的示例,它应该用一个任务填充1到M数字的矩阵的第一行,每当第一行的元素准备就绪时,每个任务填充剩余的元素。这导致了下面的一段代码:OpenMP - Fortran中的任务依赖关系
PROGRAM OMP_TEST
IMPLICIT NONE
INTEGER K,L
INTEGER M
PARAMETER (M = 8)
INTEGER A(M,M)
A(1:M, 1:M) = 0
!$omp parallel
!$omp single
DO L=1, M
!$omp task depend(out:A(1,L)) default(shared)
A(1,L) = L
!$omp end task
DO K = 2, M
!$omp task depend(in:A(1,L)) default(shared)
A(K,L) = A(1,L)
!$omp end task
END DO
END DO
!$omp taskwait
!$omp end single
!$omp end parallel
DO K =1 , M
WRITE(*,*) A(K,1:M)
END DO
END PROGRAM
编译与英特尔Fortran编译器15,这是根据文档意识到的依赖声明。但是,每次执行时,打印到屏幕的结果都不相同。即使矩阵的最初零点仍停留在某些位置。例如:
1 2 3 4 5 6
7 8
0 0 0 0 0 0
0 0
0 0 3 4 0 0
0 8
1 0 3 4 0 6
0 8
1 0 3 4 5 6
0 8
1 2 3 4 5 6
7 8
0 2 3 4 5 6
7 0
1 2 3 4 5 6
0 8
为什么任务之间的依赖关系不正确,因为我希望它使得值1至8每一行中工作?
使用gcc 5.4编译会产生类似的错误结果。 –