我正在学习如何将Fortran代码移植到OpenMP。当我阅读在线教程(见here)时,我遇到了一个问题。
首先,我从第28页知道,从第一个线程到达子句到操作完成之前,还原变量的值是未定义的。
据我所知,该陈述暗示在程序到达并行构造之前是否初始化缩减变量并不重要,因为在完成操作之前它不会被定义。但是,同一教程的第27页上的示例代码在并行构造之前初始化reduce参数。
有谁能告诉我哪种治疗方法是正确的?感谢。
利
sum = 0.0
!$omp parallel default(none) shared(n,x) private(i)
do i = 1, n
sum = sum + x(i)
end do
!$omp end do
!$omp end parallel
print*, sum
答案 0 :(得分:4)
首先,OpenMP的一个很好的功能是如果你在没有启用OpenMP的情况下编译程序,程序可以/(应该!)也是一个有效的串行程序。如果没有在循环之前初始化“sum”,那么您的示例的序列版本将是错误定义的。
答案 1 :(得分:4)
修复代码后:
integer,parameter :: n = 10000
real :: x(n)
x = 1
sum = 0
!$omp parallel do default(none) shared(x) private(i) reduction(+:sum)
do i = 1, n
sum = sum + x(i)
end do
!$omp end parallel do
print*, sum
end
请注意,初始化sum
的值很重要!如果你改变它,你会得到不同的结果。很明显你必须正确地初始化它,即使OpenMP版本没有正确的初始化也是不明确的。
是的,在完成循环之前没有定义sum的值,但这并不意味着在循环之前它可以是未定义的。