当前位置: 代码迷 >> 高性能计算 >> 关于高性能计算的知识记录汇总-初学者级别
  详细解决方案

关于高性能计算的知识记录汇总-初学者级别

热度:1008   发布时间:2013-02-26 00:00:00.0
关于高性能计算的知识记录汇总-菜鸟级别?

关于高性能计算的知识记录汇总-菜鸟级别

菜鸟级别

 

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) 是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成

 

 

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

首先,时下越来越热的gpu计算,随着中国天津的大型计算机拿到国际头把运算力交椅,不得不让人重视。现有的技术,从阵营上分,有nvidia的cuda,AMD(ATI)的stream。还有一个开放标准:opencl

我是比较看好opencl的,因为他可以支持同时对不同品牌,不同核心cpu和gpu的优化和加速,特别适合异构环境。他的基本原理就是系统里边内置一个类似编译器,好像llvm的东西,软件写完的代码只有到最后的硬件执行的时候进行最终编译,这个编译过程似乎是通过系统里边的硬件驱动driver(现在都还需要另外安装,intelnvidiaamd提供的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,加上技术越来越全面,的确成了一个跨平台开发很好的解决方案了。真眼馋。

这个网站里边有opencl的新闻。

  相关解决方案