У меня есть следующий код 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)
Я проверил переменная сокращения является частной во внешнем контексте
но все еще не уверен в причине моей проблемы. v1
используется только внутри цикла.
В чем причина сообщения об ошибке reduction variable ‘v1’ is private in outer context
?
[Решено добавлением !$omp parallel
и !$omp end parallel
]
Также обратите внимание, что это не будет распараллеливать ваш цикл — у вас нет параллельной области в приведенном выше коде, и без этого все будет однопоточным.
Большое спасибо! Добавление ``` !$omp parallel``` и !$omp end parallel
работает!!
@ AlphaF20 Привет, учитывая, что у решения есть ответ :)
Спасибо за комментарий Яна Буша. Добавляя !$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
код работает нормально.
Это похоже, но не совсем то же самое, что и stackoverflow.com/questions/35347944/… Информация там ответит на ваш вопрос.