我看了官方定义,但我仍然很困惑。在OpenMP中,firstprivate和lastprivate与private子句有何不同?
firstprivate
:指定每个线程都应该有自己的变量的实例,该变量应与变量的值进行初始化,因为它的并行构造之前就存在。
对我来说,这听起来很像私人。我查找了一些例子,但我似乎不明白它的特殊性或如何使用。
lastprivate
:指定封闭上下文的变量的版本设置等于两者的线程执行的最后一次迭代(for循环结构),或最后一节的函数(#pragma段)专用版本。
我觉得我理解这一个好一点,因为下面的例子:
#pragma omp parallel
{
#pragma omp for lastprivate(i)
for (i=0; i<n-1; i++)
a[i] = b[i] + b[i+1];
}
a[i]=b[i];
所以,在这个例子中,我了解到,lastprivate
允许i
的环路以外的地方返回最后的价值。
我刚开始学习OpenMP今天。
这是一个很好的答案!非常感谢你! – SaiyanGirl 2013-03-11 16:29:43
好吧,我会说rater,'firstprivate'和'lastprivate'是'private'的非常特殊情况。您通常甚至不需要使用'private'(只需在并行块中定义变量),可能会影响外部范围。有趣的是将C++对象用作自动'firstprivate'变量 - 它们将通过copy-construction初始化一次,并在块之后被销毁,并且不需要事先知道线程数量 - 根据需要创建。 – 2014-09-18 07:26:17
这样一个很好的例子!最喜欢它。感谢Hristo。 – Fusionmate 2015-03-02 07:55:57