我正在尝试运行以下代码来了解 OpenMP lastprivate 构造的功能。根据 lastprivate 的定义,如果我声明一个变量 lastprivate,它对每个线程都是私有的,并且按顺序执行并行循环的最后一次迭代的线程的值被复制到区域外的变量中。这是代码:
int main(void)
{
omp_set_num_threads(5);
int i;
int k =3;
#pragma omp parallel private(i)
{
#pragma omp for lastprivate(k)
for(i=0; i< 5; i++ )
{
int iam = omp_get_thread_num();
k = iam;
printf("k=%d, iam=%d\t",k, iam);
}
}
printf("\n k = %d", k);
}
它产生如下输出:
k=0, iam=0 k=4, iam=4 k=3, iam=3 k=2, iam=2 k=1, iam=1
k = 4
当我们有一组线程在“for”中工作时,我们不能真正保证哪个线程最后执行。因此,相应地,最后一个线程的值应该反映在全局“k”中。但是,无论我运行多少次代码,全局“k”的值(即并行部分结束后)仍然是 4。
同样从打印的值中,我们可以看到线程 1 最后执行。即使我们假设打印不能可靠地获得线程的确切运行顺序,线程 4 总是最后运行似乎远非显而易见,从而反映了它在“k”中的值。
我将不胜感激有关此问题的帮助。谢谢。