希望深入学习后能回答这个问题—“ 有谁知道用OPENMP,CUDA,MPI,TBB这些方法设计出来的程序的性能和优缺点”

偶然发现这个问题———— 有谁知道用OPENMP,CUDA,MPI,TBB这些方法设计出来的程序的性能和优缺点。请不吝赐教~

    截取下精彩回答,希望在自己学成之后能对此有更深的理解!

 

这个问题太大了, 估计不是三两句话能说清楚的

先抛个砖, 从并行编程的模式看, 有共享内存和分布式之分, 纯数据并行和任务并行之分, 支持的编程语言之分, 实现的方式之分(语言扩展还是类库模板)...

明白了这些, 大概能知道哪个方式适合你的应用或者算法要求. 

没有绝对的好坏之分, 就像大家一直在谈论的编程语言谁更好的问题.  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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MPI(Message Passing Interface)和OpenMP(Open Multi-Processing)是两种常用的并行程序设计方法MPI是一种消息传递程序设计模型,主要用于分布式内存系统中的并行计算。在MPI编程中,程序中的各个进程通过发送和接收消息来进行通信和数据传递。每个进程都有自己的内存空间,并且可以直接访问和修改自己的内存,而不能直接访问其他进程的内存。MPI程序设计可以实现大规模的并行计算,适合于需要在多台计算机上进行并行计算的情况。 OpenMP是一种共享内存的并行程序设计模型,主要用于多核共享内存架构中的并行计算。在OpenMP编程中,程序运行在多个线程中,这些线程之间可以共享一部分或全部的内存。通过使用Pragmas和语句来指定并行区域和任务分配,开发者可以将串行程序转化为并行程序,以实现更高效的计算。OpenMP程序设计适用于多核心处理器上的并行计算,能够充分发挥多核处理器的计算能力。 MPIOpenMP有各自适用的场景和优势。MPI适用于需要在多个计算节点之间进行通信和数据传递的并行计算,可以实现集群或分布式计算;而OpenMP适用于在同一计算节点上的多核共享内存并行计算,可以利用多核处理器的并行特性。 在一些计算任务中,可以结合使用MPIOpenMP来充分利用多节点和多核心的并行能力。通过MPI将多个计算节点连接起来,每个节点上运行多个OpenMP线程,可以实现更大规模和更高效率的并行计算。 总之,MPIOpenMP是两种常用的并行程序设计方法,它们分别适用于分布式内存和共享内存的并行计算。根据具体的应用场景和硬件环境,可以选择合适的并行程序设计方法来实现高效的并行计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值