我刚刚开始使用 OpenMp,对这个问题感到非常困惑。假设我声明一个数组 int a[10]
并在某个循环中使用它。 #pragma omp parallel for private(a)
和#pragma omp parallel for shared(a)
有什么区别?对我来说 a
只是一个指向数组第一个元素的指针,根据我所读的内容,private
构造将为每个线程制作一个变量副本,并且如果我不使用 firstprivate
构造,也很奇怪 用随机值初始化它。所以我的问题是,如果我使用 private
构造,语义上会发生什么?它会生成一组指针并将它们分配给创建的每个线程,还是生成整个数组的一组副本并让每个线程单独使用它们?
非常感谢。
最佳答案
在 C 和 C++ 中,数组和指针之间存在细微的语义差异。像 int a[10]
这样的数组定义为编译器提供了有关数组类型和大小的信息,它(编译器)可以使用该信息来正确分配相同的大小并可能对其进行初始化(在 firstprivate
的情况下)。
int *a
只告诉编译器类型而不是大小,因此在 OpenMP 中,此类变量被简单地视为指针,指针本身是私有(private)的,而不是它指向的数据.如果将指针放在 firstprivate
子句中,则每个线程都会获得指针变量的单独副本,但最初所有副本都指向内存中的同一位置。
关于c - OpenMP 如何处理 C 中的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19257674/