Parallel processing 为什么要在并行构造之外初始化一个简化变量呢?
我正在学习如何将我的Fortran代码移植到OpenMP。当我阅读在线教程(请参阅)时,我遇到了一个问题 首先,我从第28页知道,从第一个线程到达子句的那一刻起,直到操作完成,约简变量的值都是未定义的 据我所知,该语句意味着在程序命中并行构造之前是否初始化reduce变量无关紧要,因为它直到操作完成才定义。但是,同一教程第27页上的示例代码在并行构造之前初始化了reduce变量 谁能告诉我哪种治疗是正确的吗?谢谢 背风Parallel processing 为什么要在并行构造之外初始化一个简化变量呢?,parallel-processing,fortran,openmp,directive,clause,Parallel Processing,Fortran,Openmp,Directive,Clause,我正在学习如何将我的Fortran代码移植到OpenMP。当我阅读在线教程(请参阅)时,我遇到了一个问题 首先,我从第28页知道,从第一个线程到达子句的那一刻起,直到操作完成,约简变量的值都是未定义的 据我所知,该语句意味着在程序命中并行构造之前是否初始化reduce变量无关紧要,因为它直到操作完成才定义。但是,同一教程第27页上的示例代码在并行构造之前初始化了reduce变量 谁能告诉我哪种治疗是正确的吗?谢谢 背风 首先,OpenMP的一个很好的特性是,如果在不启用OpenMP的情况下编译程
首先,OpenMP的一个很好的特性是,如果在不启用OpenMP的情况下编译程序,那么该程序也可以/(应该!)成为有效的串行程序。如果不在循环之前初始化“sum”,则示例的串行版本将定义错误。首先,OpenMP的一个好功能是,如果您在不启用OpenMP的情况下编译程序,该程序也可以/(应该!)成为有效的串行程序。如果不在循环之前初始化“sum”,示例的串行版本将定义错误。修复代码后:
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的值在完成循环之前没有定义,但这并不意味着它可以在循环之前取消定义。修复代码后:
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的值在完成循环之前没有定义,但这并不意味着它可以在循环之前未定义。请注意,虽然您可以合法地调用代码中的缩减变量
sum
,但它不是OpenMP缩减变量。parallel
指令中没有reduce
子句。请注意,虽然您可以合法地调用代码中的缩减变量sum
,但它不是OpenMP缩减变量。在parallel
指令中没有reduce
条款。感谢您的回复。还有一个问题。在OpenMP手册中,它表示与运算符“+”一起进行的初始化为零。如果是这种情况,为什么我们需要在到达并行区域之前担心分配给sum的初始值?根据“op”(例如,0表示“+”)创建并初始化每个列表变量的本地副本编译器查找包含“op”的标准编校表达式,并使用它们更新本地副本本地副本被缩减为单个值,并与原始全局值组合。因此,是的,原始初始值很重要。感谢您的回复。还有一个问题。在OpenMP手册中,它表示与运算符“+”一起进行的初始化为零。如果是这种情况,为什么我们需要在到达并行区域之前担心分配给sum的初始值?根据“op”(例如,0表示“+”)创建并初始化每个列表变量的本地副本编译器查找包含“op”的标准编校表达式,并使用它们更新本地副本本地副本被缩减为单个值,并与原始全局值合并。因此,是的,原始初始值很重要。谢谢您的回复。在检查从串行程序到并行程序的转换过程中是否出现任何错误时,您确实提醒了我一些基本概念。还有一个问题。在OpenMP maunal中,表示运算符“+”的初始化为零。如果它适用于我的原始问题,那么为什么还要麻烦初始化变量呢?手册错了吗?@isyegatech:为了重申我的答案,如果你在编译时没有启用openmp,不管openmp手册上说了什么,你应该检查你的fortran手册……而且,正如Vladimir F所说,每个线程的全局变量和局部变量之间存在差异。谢谢你的回答。在检查从串行程序到并行程序的转换过程中是否出现任何错误时,您确实提醒了我一些基本概念。还有一个问题。在OpenMP maunal中,表示运算符“+”的初始化为零。如果它适用于我的原始问题,那么为什么还要麻烦初始化变量呢?手册错了吗?@isyegatech:为了重申我的答案,如果你在编译时没有启用openmp,不管openmp手册上说了什么,你应该检查你的fortran手册……正如Vladimir F所说,每个线程的全局变量和局部变量之间存在差异。