c - OpenMP 如何处理 C 中的数组?

标签 c arrays multithreading openmp

我刚刚开始使用 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/

相关文章:

c - 为什么 gets() 可以正常工作,而 fgets() 却不能?

c++ - 将文件中的每个单词读入 C++ 中的 char 数组

c++ - 两个 std::arrays 的交叉部分

java - 无法在 Libgdx 中创建带有间隔的对象

java - 有没有更理想的发送绘图命令的方式?

c - 套接字编程 - 具有客户端和服务器代码的进程

c - 如何默认设置close-on-exec

objective-c - 带break的for语句中的C逻辑错误

arrays - 用于查找和替换文本的 Lua 字符串库选择

c# - Interlocked.CompareExchange 真的比简单的锁更快吗?