关于高性能计算的知识记录汇总

转自:http://blog.sina.com.cn/s/blog_6b99cdb50101inv5.html

MPI和openMPI的区别,或者CUDA和OpenCL的区别,这篇文章就是为了总结下高性能计算的相关知识。目前高性能计算有两大趋势,并行计算集群和CPU处理器GPU显卡的异构混合计算。下面做对这些名词进行一个简单的介绍:

MPI-Message Passing Interface是一个并行计算的API,适合超级电脑,大规模集群。

OpenMPI是一种高性能消息传递库,可以很方便的把串行程序,改为多线程并行程序,适合多核心电脑,可以和MPI搭配使用,对C语言和Fortran高性能计算支持很好。

TBB-Intel Threading Building Blocks 线程构建模块,是Intel公司开发的并行编程开发的工具,能很好的支持C++并行计算编程。

CUDA(Compute Unified Device Architecture),显卡厂商NVidia推出的运算平台,使用显卡和处理器进行异构并行计算,是比较高级的并行开发工具,不需要太多硬件知识。

OpenCL (Open Computing Language) 是一个为异构平台编写程序的框架,属于API,和OpenGL架构类似,此异构平台可由CPU,GPU或其他类型的处理器组成。

最近花了点时间,对OpenMP,OpenCL,MPI(有多种实现,如Open MPI)等,关于高性能计算的技术,做了一下简单的浏览,我把这次简单浏览所学习到的一点东西记录在此。这些总结和记录都比较半吊子,还需要更深入的学习和研究。

首先,时下越来越热的GPU计算,随着中国天津的大型计算机拿到国际头把运算力交椅,不得不让人重视。现有的技术,从阵营上分,有NVidia的CUDA,AMD(ATI)的stream。还有一个开放标准:OpenCL。我是比较看好OpenCL的,因为他可以支持同时对不同品牌,不同核心CPU和GPU的优化和加速,特别适合异构环境。他的基本原理就是系统里边内置一个类似编译器,好像llvm,API的东西,软件写完的代码只有到最后的硬件执行的时候进行最终编译,这个编译过程似乎是通过系统里边的硬件驱动Driver,现在都还需要另外安装,intel,nvidia,amd提供的sdk中都分别包含有自己Driver,得以执行。所以OpenCL的程序主线程,会根据系统中是几个核的多核CPU,那种架构的CPU(arm或者x86),有没有GPU,哪种GPU? 来决定最后生成的工作线程的代码传递给哪个Driver编译执行。系统会自动保存编译后的二进制代码以备后用。这个过程看起来好像是一个动态语言的过程,但是实际上现在OpenCL还主要是底层的,经过扩展的c语言来写。不同硬件的Driver充当了runtime的角色。

intel,nvidia,amd等多家硬件厂商支持OpenCL,但是同时也有自己的小九九,比如nvidia的cuda,就提供了针对自己的更多的功能,而且函数上据说也更为高级。所以说,如果是专门针对特定硬件环境下,比如开发大运算量的科学程序的话,最好使用专门硬件自己的GPU加速sdk开发。只有在要求通用性,比如商业软件上,才使用OpenCL开发。

另外,一贯讨厌开放标准的微软这次又和当年对待OpenGL一样,用他的DirectorX来玩个性了。反正我是能不鸟他,就不鸟他!

其次,OpenMP和MPI,这两个都是已经被广泛使用的并行程序开发库。他们的区别是:OpenMP是针对多核处理器,使用的是共享内存的并行方式,可以说更为线程一些;MPI是针对服务器中,多个对称并行CPU或者集群服务器的情况,内容共享方式是混合的,更为进程一些。

从某种角度上说,OpenCL有代替OpenMP的可能和趋势,里边会包含针对多核心CPU的处理。现在的环境下,还是OpenMP更合适——可以直接发挥多核心处理器的能力,而且不需要图形开发的知识。这里是一篇关于OpenMP和OpenCL性能的测试。

现在的并行开发,主要就是MPI+OpenMP,前者负责将运算通过进程分布到不同服务器的不同CPU上去,后者负责通过多线程,有效利用CPU中每个核心的效能。

再次,有文章显示,为了最好的发挥线程的效能,在同样算法条件下,最好程序使用的线程和cpu提供的最大线程数一致,而且最好能够绑定程序执行线程和CPU核心。GPU对某些计算加速效果特别好,效率也不错,但是由于必须通过PCI用CPU进行调度,所以,实际程序设计的时候,要考虑这个通信过程的延时。

最后,现有的几种并行计算技术:

1、系统层面,使用进程迁移技术,从而让所有支持多进程的程序,实现并行,如openmosix,这需要经过patch过的操作系统;

2、硬件层面,也就是OpenCL等GPU加速技术,需要相应的硬件支持;

3、开发语言方面,现在erlang这种动态语言,就提供了对集群环境的支持,他会自动向加入集群的服务器分布运算进程。google Go语言可能也是类似的。

PS: 开发方面,OpenCL现在用起来门槛还是很高的,不知道以后会不会提供更高层的抽象库。不过,我发现QT,现在可以支持OpenCL了,QTOpenCL虽然还没有放入主枝,需要自己编译开发包,但是文档上说,提供了QT模式的函数。QT在被诺基亚收购之后,改变授权为lgpl,加上技术越来越全面,的确成了一个跨平台开发很好的解决方案了。真眼馋。

你可能感兴趣的:(C/C++)