0

我刚开始玩 OpenMp 并对这个问题感到非常困惑。假设我声明一个数组int a[10]并在某个循环中使用它。#pragma omp parallel for private(a)和 和有什么不一样#pragma omp parallel for shared(a)?对我a来说只是一个指向数组第一个元素的指针,根据我读过的内容,该private构造将为每个线程制作一个变量的副本,并且如果我不使用构造,也会非常奇怪地用随机值初始化它。firstprivate所以我的问题是,如果我使用private构造,语义上会发生什么?它会创建一组指针并将它们分配给创建的每个线程,还是会创建整个数组的一组副本并让每个线程单独使用它们?

非常感谢。

4

1 回答 1

2

C 和 C++ 中的数组和指针之间存在细微的语义差异。像这样的数组定义int a[10]为编译器提供了有关数组类型和大小的信息,并且它(编译器)可以使用该信息来正确分配相同大小的私有副本并可能对其进行初始化(在firstprivate)。

int *a只告诉编译器类型而不是大小,因此在 OpenMP 中,此类变量被简单地视为指针,并且指针本身是私有的,而不是它指向的数据。如果将指针放在firstprivate子句中,则每个线程都会获得指针变量的单独副本,但最初所有副本都将指向内存中的同一位置。

于 2013-10-08T22:52:56.737 回答