C++ openMP lastprivate和FIRSTPIVATE设置为同一变量

C++ openMP lastprivate和FIRSTPIVATE设置为同一变量,c++,c,parallel-processing,openmp,C++,C,Parallel Processing,Openmp,在同一个变量中应用firstprivate和lastprivate是否正确 例如: void main (){ int a= 100, i; #pragma omp for firstprivate(a) lastprivate(a) for(i = 0; i <9; i++){ bla bla bla; } printf("a= %d",a); } void main(){ int a=100,i; #pragma omp for

在同一个变量中应用firstprivate和lastprivate是否正确

例如:

void main (){
    int a= 100, i;
    #pragma omp for firstprivate(a) lastprivate(a)
    for(i = 0; i <9; i++){
        bla bla bla;
    }
    printf("a= %d",a);
}
void main(){
int a=100,i;
#pragma omp for firstprivate(a)lastprivate(a)
对于(i=0;i,如4.0版第2.14.3节所述:

指定给定变量的列表项不能出现在同一指令的多个子句中,除非变量可以同时出现在
firstprivate
lastprivate
子句中


考虑到这一点实际上是很有意义的。
firstprivate
在进入并行区域时影响列表变量的值,而
lastprivate
在退出区域时影响它们。两者都不冲突,它们的组合使用允许某些变量“传播”通过该区域,并通过并行代码以与顺序情况相同的方式修改它们的值。这在并行循环中最有意义。

我不清楚的是何时可以使用
lastprivate
。根据这一点,它只适用于迭代器,因此在OPs示例中,我认为它只适用于
I
和not
a
。这在OPs示例中是无用的,但如果它类似于(i=0;i@Zboson)的
lastprivate
与工作共享结构结合使用,以公开所列变量的值在最后一个逻辑循环迭代/词汇上的最后一节中分配,无论哪个线程执行它。如果OPs示例中的
bla-bla
类似于
a=2*i;
,那么并行区域后的
a
的值将是
16
。您链接到的页面表明我们不可能这样做e
lastprivate
在最后一次迭代之前提取迭代期间分配的值;它并没有说该子句仅适用于迭代器。谢谢,我现在明白了。如果在该链接中它也使用firstprivate,而不是获得完全虚假的值,它将获得初始值(done=4和done=5)但是这也不是我们想要的。我看到私有值必须由执行最后一次迭代的线程定义,否则返回的值要么是未定义的,要么是firstprivate的值。