openMP lastprivate和firstprivate为同一变量

openMP lastprivate and firstprivate to the same variable

本文关键字:变量 firstprivate lastprivate openMP      更新时间:2023-10-16

是否正确应用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);
}

谢谢!

在OpenMP规范版本4.0,Section 2.14.3中写:

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

允许这样做实际上很有意义。firstprivate在进入并行区域时影响列表变量的值,而lastprivate在退出并行区域时影响列表变量的值。两者都是不冲突的,并且它们的组合使用允许某些变量通过区域"传播",并通过并行代码以与顺序情况相同的方式修改它们的值。这对于并行循环来说是有意义的。

在firstprivate(x)和parallel region子句中,变量x可以被识别为具有某个值的初始变量,该值定义在所有团队线程的某个地方。每个团队线程都有自己的私有x。在并行区子句中的lastprivate(x)中,表示循环的最后一次迭代。X将在最后一次迭代中获得最终值。