我最近也在做高性能计算的课题,只是刚刚起步,呵呵,所以说得也很浅,望高手指正。
楼主举出的这些库或者标准,都是用于并行计算的,不过其各自针对的侧重点或者实现的并行方法不同。
MPI即消息传递接口,用于计算机间传递的信息,也就是说,主要是针对计算机群集(cluster)并行或者超级计算机的并行。因为我现在实验条件没有群集,所以了解不多,呵呵。
OpenMP主要通过是一些编译的预处理指令实现并行,在C/C++里面形如“#pragma ...”这样的东东,现在最新的版本是3.0, GCC和Intel C++支持最新的,微软的2005,2008,2010VS都只支持到2.0。OpenMP主要实现的是多线程,也就是在一台多个CPU处理器的计算机上发挥作用。不过也有在群集中使用的OpenMP论文,我没有关注,只是知道。OpenMP由于只是加一些预处理器指令,而且其目的是要让编写的程序在并行和串行时同时都能正常运行,所以其最大的优点是可以将现行的串行C程序经过不大的更改便成为多线程的。有地方说OpenMP主要是针对循环的并行,我只是刚开始学,没有体会到,呵呵。
TBB是Intel公司的产品,基于STL,得过Jolt的大奖,是非常好的线程库,其最大优点是结构良好,抽象程度也比OpenMP要高,许多地方说,如果是写新程序,用TBB比较好,不过其不支持C,只支持C++。做图形学的,如果知道OpenCV库,这个库就用到了TBB。
我本来准备对CPU并行用TBB的,不过看到了TBB的网站上FAQ,其写到,应该在程序中尽可能地用OpenMP,现在还是决定先学OpenMP了,呵呵,OpenMP和TBB可以并存,不过要学起来也不是一朝一夕能够完成,将Intel的TBB官网FAQ节选如下:
Everyone should use OpenMP as much as they can. It is easy to use, it is standard, it is supported by all major compilers, and it exploits parallelism well. But it is very loop oriented, and does not address algorithm or data structure level parallelism. When OpenMP works for your code, you should use it. We’ve seen it used to great advanatage in financial applications, mp3 codecs, scientific programs and high definition video editing software. OpenMP is best geared for Fortran and C code.
CUDA是NVIDIA公司公司针对其生产的GPU做的编程库,有如Intel为CPU开发的TBB一样。GPU其实一直是可以并行的,其特点是数据密集型的并行,但以前编程接口很少,高手们要通过OpenGL才能实现使用GPU进行并行计算。直到NVIDIA开发了CUDA,我们可以利用C/C++来进行GPU的编程。前述的类库或标准都是针对CPU,而CUDA针对的是GPU,所以可以想见的是,以上的库可以和CUDA配合起来用。实际上已经有人完成了许多方案,如用MPI和CUDA实现群集高性能GPU的协作,OpenMP和TBB和NVIDIA实现CPU和GPU的协作。
这里还要指出的是,从编程方面来说,OpenMP和TBB的编译器支持非常广泛,而CUDA较前两者都很新,所以支持的编译器不多,而TBB只是类库,还是基于STL的,所以应该和CUDA更容易配合,当然CUDA和OpenMP的配合已经有人实现了。
我只是从实现的方法上说这么多,至于优劣,我的能力不足以评估,呵呵。我现在主要希望研究CPU和GPU异构的协作,这可能用到OpenMP,TBB和CUDA,如果楼主及其他高手也有同样想法,可一起探讨。