Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 为什么要在并行构造之外初始化一个简化变量呢?_Parallel Processing_Fortran_Openmp_Directive_Clause - Fatal编程技术网

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

Parallel processing 为什么要在并行构造之外初始化一个简化变量呢?,parallel-processing,fortran,openmp,directive,clause,Parallel Processing,Fortran,Openmp,Directive,Clause,我正在学习如何将我的Fortran代码移植到OpenMP。当我阅读在线教程(请参阅)时,我遇到了一个问题 首先,我从第28页知道,从第一个线程到达子句的那一刻起,直到操作完成,约简变量的值都是未定义的 据我所知,该语句意味着在程序命中并行构造之前是否初始化reduce变量无关紧要,因为它直到操作完成才定义。但是,同一教程第27页上的示例代码在并行构造之前初始化了reduce变量 谁能告诉我哪种治疗是正确的吗?谢谢 背风 首先,OpenMP的一个很好的特性是,如果在不启用OpenMP的情况下编译程

我正在学习如何将我的Fortran代码移植到OpenMP。当我阅读在线教程(请参阅)时,我遇到了一个问题

首先,我从第28页知道,从第一个线程到达子句的那一刻起,直到操作完成,约简变量的值都是未定义的

据我所知,该语句意味着在程序命中并行构造之前是否初始化reduce变量无关紧要,因为它直到操作完成才定义。但是,同一教程第27页上的示例代码在并行构造之前初始化了reduce变量

谁能告诉我哪种治疗是正确的吗?谢谢

背风


首先,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所说,每个线程的全局变量和局部变量之间存在差异。