一个简单的 OpenMP 程序:
#include <omp.h>
#include <iostream>
int main() {
int var = 0;
int var2 = 0;
#pragma omp parallel private(var) shared(var2)
{
var = 1;
int tid = omp_get_thread_num();
printf("Inside the parallel region, var gets modified by thread #%d to %d\n",tid,var);
if(tid == 0)
var2 = var;
}
printf("Outside the parallel region, var = %d\n", var);
printf("Outside the parallel region, var2 = %d\n", var2);
}
结果:
Inside the parallel region, var gets modified by thread #3 to 1
Inside the parallel region, var gets modified by thread #0 to 1
Inside the parallel region, var gets modified by thread #6 to 1
Inside the parallel region, var gets modified by thread #1 to 1
Inside the parallel region, var gets modified by thread #5 to 1
Inside the parallel region, var gets modified by thread #7 to 1
Inside the parallel region, var gets modified by thread #2 to 1
Inside the parallel region, var gets modified by thread #4 to 1
Outside the parallel region, var = 0
Outside the parallel region, var2 = 1
我想要做的是将 的值设置为var
并行区域内的最后修改值。
由于它不是#pragma omp for
循环,lastprivate
因此无法使用。
在并行区域之外,var
获取其原始值 0。一个技巧是使用共享变量var2
来存储来自主线程的修改值。
但这增加了开销并且似乎不是一种优雅的方法,如果我想获得由最后一个线程而不是主线程修改的值(例如找出哪个线程最后完成),那么这个技巧将不行。
我对 OpenMP 很陌生,所以我可能会遗漏一些东西。如果我不是,有没有办法克服这个棘手的事情?
非常感谢。
编辑:我的问题是关于如何在并行区域完成后保留私有变量的最后一个值。或者,如果您可以解释为什么lastprivate
在概念上在 a 中使用无效#pragma omp parallel
,我会认为这是一个完美的答案。