error: reduction variable ‘v1’ is private in outer context

error: reduction variable ‘v1’ is private in outer context

我有以下 Fortran 代码

program hello

    use omp_lib
    implicit none
    
    integer :: num_threads = 2
    
    print*, "Display Hello world!"
    print*, "Number of threads used = ", num_threads
    
    call loop()
    
end program hello


subroutine loop()
    integer :: i,j,k,n
    real :: c0
    real, allocatable :: v1(:,:)

    n = 3
    c0 = 0.
    if (.not. allocated (v1)) allocate(v1(n,n))    
    v1 = c0
    
    !$omp do private(i, j, k) schedule(dynamic) reduction(+: v1)    
    do i = 1, n 
      do j = 1, n
        do k = 1, n
          v1(i,j) = v1(i,j) + k
        end do
        write (*,*) i, j, v1(i,j)
      end do
    end do  
    !$omp end do   

end subroutine

gfotran -fopenmp 导致

error: reduction variable ‘v1’ is private in outer context
     !$omp do private(i, j, k) schedule(dynamic) reduction(+: v1)

我查了reduction variable is private in outer context 但仍然不确定我的问题的原因。 v1 仅在循环内部使用。

错误消息的原因是什么 reduction variable ‘v1’ is private in outer context

[已解决,通过添加 !$omp parallel!$omp end parallel]

感谢伊恩布什的评论。通过添加 !$omp parallel!$omp end parallel,即

program hello

    use omp_lib
    implicit none
    
    integer :: num_threads = 2
    
    print*, "Display Hello world!"
    print*, "Number of threads used = ", num_threads
          
    call loop()
    
end program hello


subroutine loop()
    integer :: i,j,k,n
    real :: c0
    real, allocatable :: v1(:,:)

    n = 3
    c0 = 0.
    if (.not. allocated (v1)) allocate(v1(n,n))    
    
    !$omp parallel
    !$omp do private(i, j, k) schedule(dynamic) reduction(+: v1)    
    do i = 1, n 
      do j = 1, n
        v1(i,j) = c0
        do k = 1, n
          v1(i,j) = v1(i,j) + k
        end do
        write (*,*) i, j, v1(i,j)
      end do
    end do  
    !$omp end do  
    !$omp end parallel

end subroutine

代码运行正常