为什么要在并行构造之外初始化一个简化变量呢?

时间:2014-04-10 04:08:15

标签: parallel-processing fortran openmp directive clause

我正在学习如何将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 

2 个答案:

答案 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的值,但这并不意味着在循环之前它可以是未定义的