OpenMP、MPI、POSIX 线程、std::thread、boost::thread 如何关联?

Posted

技术标签:

【中文标题】OpenMP、MPI、POSIX 线程、std::thread、boost::thread 如何关联?【英文标题】:How do OpenMP, MPI, POSIX threads, std::thread, boost::thread correlate? 【发布时间】:2014-04-23 18:43:23 【问题描述】:

有几种方法可以实现多线程。 std::thread 最终由 C++11 标准带来,但可以有效地使用 boost::thread。每种技术都有特定的语法和内容,但 - 粗略地 - 用于 CPU 并行编程。但是它们有不同的效果。我知道,例如,MPI 和 OpenMP 用于不同的内存模型。

我还知道,一种技术的选择实际上并不是排他性的,因此可以使用另一种技术(同样,MPI 和 OpenMP)。为什么它们用于不同的效果,但仍然使用相同的源(CPU)?

如果我基于每种技术编译具有并行性的 C++ 程序,会有什么不同(从操作系统和硬件的角度来看)?例如,OpenMP 或 std::thread 是否使用 POSIX 线程?如果是这样,C++11 的线程如何在 Windows 上工作?还是这些技术中的每一个都通过汇编语言或其他方式直接与 CPU 一起工作?

【问题讨论】:

将 OpenMP 与另一个线程范式混合,例如std::thread,不是指定的行为。规范中没有明确禁止。但它是否有效仍然是非常特定于实现的。将 MPI 与 OpenMP 或其他线程范例相结合是可以的,只要 MPI 正确初始化并支持线程。 【参考方案1】:

操作系统提供线程(用于创建新线程的系统调用;调度服务)。

Unix libc 对操作系统线程进行了封装,并具有许多有用的功能(如互斥锁、条件变量等)。通常此类系统库的外部接口是“POSIX线程”(函数名为pthread_*):http://en.wikipedia.org/wiki/POSIX_Threads

Windows 有自己的难以使用的线程 API(WINAPI 的CreateThread 等)。但是有一些围绕 Windows API 的包装器来获得类似 POSIX 线程 api 的东西(例如,mingw32 和 cygwin 有这样的库;检查wikipedia section)

C++11 std::thread,boost 的 boost::thread 只是围绕系统线程 API 的现代独立于操作系统的包装器。它们用于创建可在任何支持的平台上编译的可移植程序,而无需创建 #ifdef hell 和/或围绕系统线程库编写自己的自定义包装器。如果您正在创建新程序,请考虑使用这种方式。

还有其他几个线程包装器,例如包含在 QT 或 GTK+ 等图形库中。

OpenMP 实现具有使用系统/libc 线程 API 的内部支持库(例如 gcc 具有 libgomp),例如 libgomp 使用 POSIX 线程。一些实现还可能包括通过汇编(M:N 线程模型)进行用户空间线程切换。

MPI 内部没有线程库。 MPI 用于创建多个进程并设置它们之间的通信。但是在多线程程序中使用 MPI 时,它会使用一些线程 API 来做同步。例如,MPICH 将在 unix 上使用 pthread。

【讨论】:

以上是关于OpenMP、MPI、POSIX 线程、std::thread、boost::thread 如何关联?的主要内容,如果未能解决你的问题,请参考以下文章

确保混合 MPI / OpenMP 在不同的内核上运行每个 OpenMP 线程

在 MPICH 中执行混合 OpenMP/MPI 作业

OpenMP的简单使用教程

使用 MPI/OpenMP 的具有派生数据类型(嵌套类对象)容器的 C++ 程序

多进程 MPI 与多线程 std::thread 性能

openMP多线程编程