前言
多线程在实际的编程中的重要性不言而喻。对于C++而言,当我们需要使用多线程时,可以使用boost::thread库或者自从C++ 11开始支持的std::thread,也可以使用操作系统相关的线程API,如在Linux上,可以使用pthread库。除此之外,还可以使用omp来使用多线程。它的好处是跨平台,使用简单。
配置
在Linux平台上,如果需要使用omp,只需在编译时使用"-fopenmp"指令。在Windows的visual studio开发环境中,开启omp支持的步骤为“项目属性 -> C/C++ -> 所有选项 -> openmp支持 -> 是(/openmp)”。
QT中,在.pro文件中加入 QMAKE_CXXFLAGS += -fopenmp LIBS += -fopenmp
使用
#include <iostream>
#include <omp.h>
using namespace std;
int main()
{
#pragma omp parallel for
for (char i = 'a'; i <= 'z'; i++)
cout << "Hello World! " << i << endl;
return 0;
}
对比
- OpenMP:线程级(并行粒度);共享存储;隐式(数据分配方式);可扩展性差;
- MPI:进程级;分布式存储;显式;可扩展性好。
-
Openmp
简单。不用大改源程序,直接加#pragma就行了。
只适用于共享式内存。比如一台电脑,4核cpu共享16G内存,可以用Openmp启动4核同时计算。
MPI
稍复杂。需要重新设计程序,学习成本稍高。
扩展性好,适用于共享式或者分布式内存(楼上所说有误)。比如二台电脑,各有4核cpu和16G内存,可以用MPI同时在二台电脑上计算,并且每台电脑都同时使用各自的4核,和16G内存(相当于8核同时计算)。因此你在一台电脑上写出的程序,也可以方便的使用在计算机集群中
-
MPI适用于分布式内存系统中的并行计算,可以在大型集群中实现高性能。MPI的通信方式可以有效地利用网络带宽,从而实现高效的并行计算。
OpenMP适用于共享内存系统中的并行计算,可以在单个计算机上实现高性能。OpenMP的线程之间共享内存,因此要注意线程之间的同步和数据一致性。
总的来说,MPI适用于大规模并行计算,而OpenMP适用于小规模并行计算
-
这两者在并行编程领域都比较常见,都是为了将更多资源利用起来;openmp是线程并行(通过共享内存通信,只能用在节点内),mpi是进程级(通过消息传递通信,节点内,节点间均可)