偶然发现这个问题———— 有谁知道用OPENMP,CUDA,MPI,TBB这些方法设计出来的程序的性能和优缺点。请不吝赐教~
截取下精彩回答,希望在自己学成之后能对此有更深的理解!
这个问题太大了, 估计不是三两句话能说清楚的
先抛个砖, 从并行编程的模式看, 有共享内存和分布式之分, 纯数据并行和任务并行之分, 支持的编程语言之分, 实现的方式之分(语言扩展还是类库模板)...
明白了这些, 大概能知道哪个方式适合你的应用或者算法要求.
没有绝对的好坏之分, 就像大家一直在谈论的编程语言谁更好的问题. intel_iclifort
先抛个砖, 从并行编程的模式看, 有共享内存和分布式之分, 纯数据并行和任务并行之分, 支持的编程语言之分, 实现的方式之分(语言扩展还是类库模板)...
明白了这些, 大概能知道哪个方式适合你的应用或者算法要求.
没有绝对的好坏之分, 就像大家一直在谈论的编程语言谁更好的问题. intel_iclifort
我的一点看法是:
优缺点:使用OpenMP设计起来会稍微简单点,只需用一条语句就能优化程序性能(关键代码1),就单独对矩阵相乘来说性能是很不错的。 而使用MPI会稍微复杂点,但也能达到好的效果。
关键代码1:
void ParallelMxM( float c[N][N], float a[N][N], float b[N][N] ) {
#pragma omp parallel for schedule(dynamic)
for ( int i = 0; i < N; ++i ) {
for ( int j=0; j<N; ++j ) {
float sum = 0;
for ( int k=0; k<N; ++k ) {
sum += a[i][k]*b[k][j];
}
c[i][j] = sum;
} } } dxmgood
如果编写的程序各线程之间有复杂的交互的话,用raw threading比较好,其他就用openMP和TBB等
从程序风格上来说,C的程序用OpenMP好点,C++用TBB horreaper
最后一个是最深刻的解答了!
期待最后的解答!
如果编写的程序各线程之间有复杂的交互的话,用raw threading比较好,其他就用openMP和TBB等
从程序风格上来说,C的程序用OpenMP好点,C++用TBB horreaper
我最近也在做高性能计算的课题,只是刚刚起步,呵呵,所以说得也很浅,望高手指正。
楼主举出的这些库或者标准,都是用于并行计算的,不过其各自针对的侧重点或者实现的并行方法不同。
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,如果楼主及其他高手也有同样想法,可一起探讨。 snow_bird
楼主举出的这些库或者标准,都是用于并行计算的,不过其各自针对的侧重点或者实现的并行方法不同。
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,如果楼主及其他高手也有同样想法,可一起探讨。 snow_bird