OpenMP,多线程或多进程(C)?

3

我有些困惑OpenMP是如何工作的。我知道它可以并行执行任务,是一个多处理工具,但这意味着什么?

它使用“线程”,但同时又是一个多处理工具?这两者不是互相排斥吗,你会使用一种方法而不是另一种方法?您能帮忙解释一下它到底是哪种方法吗?

为了澄清,我只使用过POSIX pthreads进行多线程编程,那与使用fork和exec以及共享内存进行多进程编程完全不同。

谢谢。

2个回答

4

OpenMP 是为了提供一个抽象层,以利用 多线程共享内存 的并行架构而开发的,因此您不必从头编写经常使用的并行代码。请注意,一般来说,线程仍然可以访问共享内存(主线程分配的内存)。它利用多个处理器,但使用线程。

MPI 是其在 分布式系统 中的对应物。这可能更像您想象中的传统“多处理”版本,因为所有“等级”都独立运行,没有共享内存,并且必须通过诸如scatter/map/reduce等概念进行通信。


我一直认为我们真正需要的是将两者结合起来。分开使用时,将 OpenMP 线程移动到 MPI 分布式系统中的另一台服务器上需要重新排列代码,这是一件繁琐的工作。如果只有一个分发/并行化工具,这样的操作只需要重新配置即可完成。 - bazza

1

OpenMP是用于多线程的工具。我会深入介绍如何使用OpenMP以及需要注意的问题:

http://austingwalters.com/the-cache-and-multithreading/

它与POSIX pthreads非常相似,但没有繁琐的部分。它的开发是为了将其融入到已经开发好的代码中,并使用适当的编译器重新编译。(g++, clang/llvm目前不可用)。如果你点击上面的链接,你会注意到一个线程可以在任何可用的处理器上执行,因此线程使多进程成为可能。
这意味着,即使你只有单个核心,线程仍然可以更快地执行,因为你的处理器将时间分享给所有程序。如果你有多个处理器和多个线程,线程可以从不同的处理器同时访问,因此执行速度更快。
此外,OpenMP允许共享(和未共享)内存,具体取决于实现方式,我认为你也可以在POSIX线程中使用OpenMP,但如果pthread被正确使用,则不会获得任何优势。
下面是一份关于OpenMP的优秀指南链接:

http://bisqwit.iki.fi/story/howto/openmp/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接