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开发。
其次,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语言可能也是类似的。
二、AM5728 OpenCL/OpenMP测试
未完待续