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