OpenMP、MPI、POSIX 线程、std::thread 和 boost::thread 之间有何关联?

6
有几种实现多线程的方法。C++11标准引入了std::thread,但是可以有效地使用boost::thread。每种技术都有特定的语法和用途,但大致上用于CPU并行编程。但它们具有不同的效果。我知道,例如,MPI和OpenMP用于不同的内存模型。
我也知道选择一种技术并不是互斥的,因此可以使用另一种技术(再次使用MPI和OpenMP)。它们如何用于不同的效果,但仍然与相同的源代码(CPU)一起工作呢?
如果我使用基于这些技术之一的并行编译C ++程序,从操作系统和硬件角度来看,差异会是什么?例如,OpenMP或std::thread是否使用POSIX线程?如果是这样,C ++11的线程在Windows上如何工作?还是每种技术直接通过汇编语言或其他方式与CPU一起工作?

2
将OpenMP与其他线程范式(例如std::thread)混合使用不是指定行为。规范中没有明确禁止这样做。但它是否有效仍然非常依赖于具体实现。将MPI与OpenMP或其他线程范式结合使用是可以的,只要MPI以支持线程的方式正确初始化即可。 - Hristo Iliev
1个回答

10

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

Unix libc 包含了围绕操作系统线程的包装器,带有许多有用的函数(例如互斥量、条件变量等)。通常此类系统库的外部接口为“POSIX线程”(函数名称为 pthread_*):http://en.wikipedia.org/wiki/POSIX_Threads

Windows 有自己难以使用的线程 API (WINAPI的 CreateThread 等)。但是 Windows API 周围有包装器,可以获得类似于 POSIX 线程 API 的东西(例如 mingw32 和 cygwin 就有这样的库; 查看 维基百科章节

C++11 的 std::thread,boost 的 boost::thread 只是现代的操作系统无关的包装器,用于创建可在任何支持的平台上编译的便携式程序,而不会创建 #ifdef 地狱和 / 或编写自定义的包装器来围绕系统线程库。如果您正在创建新程序,请考虑使用此方法。

还有一些其他的线程包装器,例如包含在图形库中,如 QT 或 GTK+。

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

MPI 内部没有线程库。MPI 用于创建多个进程并设置它们之间的通信。但是,当 MPI 用于多线程程序时,它将使用某些线程 API 来进行同步。例如,在 Unix 上,MPICH 将使用 pthreads。


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