我完全是多核编程的新手,但我确实知道如何编程 C++。
现在,我正在寻找多核编程库。我只是想尝试一下,只是为了好玩,现在,我找到了 3 个 API,但我不确定我应该坚持哪一个。现在,我看到了 Boost 的 MPI、OpenMP 和 TBB。
对于任何使用过这 3 个 API(或任何其他 API)的人,您能告诉我它们之间的区别吗?是否有任何因素需要考虑,例如 AMD 或 Intel 架构?
我完全是多核编程的新手,但我确实知道如何编程 C++。
现在,我正在寻找多核编程库。我只是想尝试一下,只是为了好玩,现在,我找到了 3 个 API,但我不确定我应该坚持哪一个。现在,我看到了 Boost 的 MPI、OpenMP 和 TBB。
对于任何使用过这 3 个 API(或任何其他 API)的人,您能告诉我它们之间的区别吗?是否有任何因素需要考虑,例如 AMD 或 Intel 架构?
作为起点,我建议使用 OpenMP。有了这个,您可以非常简单地执行三种基本类型的并行:循环、部分和任务。
这些允许您在多个线程上拆分循环迭代。例如:
#pragma omp parallel for
for (int i=0; i<N; i++) {...}
如果您使用两个线程,那么第一个线程将执行迭代的前半部分。第二个线程将执行后半部分。
这些允许您在多个线程上静态划分工作。当有明显的工作可以并行执行时,这很有用。但是,这不是一种非常灵活的方法。
#pragma omp parallel sections
{
#pragma omp section
{...}
#pragma omp section
{...}
}
任务是最灵活的方法。它们是动态创建的,它们的执行是由创建它们的线程或由另一个线程异步执行的。
#pragma omp task
{...}
OpenMP 有几件事情要做。
基于指令:编译器执行创建和同步线程的工作。
增量并行:您可以只关注需要并行化的代码区域。
串行和并行代码的一个源代码库:OpenMP 指令只有在您使用标志(-fopenmp
用于 gcc)运行时才能被编译器识别。因此,您可以使用相同的源代码库来生成串行和并行代码。这意味着您可以关闭该标志以查看是否从代码的串行版本中获得相同的结果。这样,您可以将并行性错误与算法中的错误隔离开来。
您可以在http://www.openmp.org/找到整个 OpenMP 规范
在底层,OpenMP 是多线程编程,但比 TBB 及其同类具有更高的抽象级别。对于多核计算机上的并行编程,两者之间的选择与同一域内任何高级和低级软件之间的选择大致相同:在表达性和可控性之间进行权衡。
我认为英特尔与 AMD 无关紧要。
你的选择应该取决于你想要达到的目标;例如,如果您想学习 TBB,那么 TBB 绝对是您的最佳选择。但是,如果您想以简单的步骤并行化现有的 C++ 程序,那么 OpenMP 可能是更好的首选;TBB 稍后仍会出现,供您处理。一开始我可能会避开 MPI,除非我确定我将从共享内存编程(这主要是你在多核上所做的)转移到分布式内存编程(在集群或网络上)。与以往一样,您选择的技术应该取决于您的要求。
我建议你玩 MapReduce 一段时间。您可以在同一台机器上安装多个虚拟机实例,每个实例都运行一个Hadoop实例(Hadoop 是 Yahoo! MapReduce 的开源实现)。网上有很多关于设置 Hadoop 的教程。
顺便说一句,MPI 和 OpenMP 不是一回事。OpenMP 用于共享内存编程,这通常意味着多核编程,而不是多台机器上的并行编程。
取决于你的专注力。如果您主要对多线程编程感兴趣,请选择 TBB。如果您对进程级并发更感兴趣,那么 MPI 是您的最佳选择。
另一个有趣的库是OpenCL。它基本上允许您以最佳方式使用所有硬件(CPU、GPU、DSP...)。
它有一些有趣的特性,比如可以创建数百个线程而不会降低性能。