近几年来,以深度神经网络(DNN)为表明的深度学习如火如荼,深度学习的研究领域从开始的图像识别(如imagenet比赛)到如今的天然语言处理,几乎有席卷一切机器学习研究领域的趋势。算法
对于深度神经网络的训练来讲,一般网络越深,须要的训练时间越长。对于一些网络结构来讲,若是使用串行的X86 处理器来训练的话,可能须要几个月、甚至几年,所以必需要使用并行甚至是异构并行的方法来优化代码的性能才有可能让训练时间变得能够接受。编程
人类生活的方方面面存在着并行或者并发,边吃饭边看电视,双手同时拔草,甚至吃饭时,嘴巴的动做和手的动做也是并行的。和人类社会普遍存在并行不一样的是:计算机编程几乎一直都是串行的,绝大多数的程序只存在一个进程或线程。对于并行和向量化的研究能够追溯到20世纪60年代,可是直到近年来才获得普遍的关注,主要是自2003年以来,能耗和散热问题限制了 X86 CPU频率的提升,从而致使多核和向量处理器的普遍使用。性能优化
2003年之前,在摩尔定律的做用下,单核标量处理器的性能持续提高,软件开发人员只须要写好软件,而性能就等待下次硬件的更新,在2003年以前的几十年里,这种“免费午饭”的模式一直在持续。2003年后,主要因为功耗的缘由,这种“免费的午饭”已经不复存在。为了生存,各硬件生产商不得不采用各类方式以提升硬件的计算能力,如下是目前最流行的几种方式是。服务器
1)让处理器一个周期处理多条指令,这多条指令可相同可不一样。如Intel Haswell处理器一个周期可执行4条整数加法指令、2条浮点乘加指令,同时访存和运算指令也可同时执行。网络
2)使用向量指令,主要是SIMD和VLIW技术。SIMD技术将处理器一次可以处理的数据位数从字长扩大到128或256位,也就提高了计算能力。架构
3)在同一个芯片中集成多个处理单元,根据集成方式的不一样,分为多核处理器或多路处理器。多核处理器是如此的重要,以致于如今即便是手机上的嵌入式ARM处理器都已是四核或八核。并发
4) 使用异构处理器,不一样的架构设计的处理器具备不一样的特色,如X86 处理器为延迟优化,以减小指令的执行延迟为主要设计考量(固然今天的X86 处理器设计中也有许多为吞吐量设计的影子);如NVIDIA GPU和AMD GPU则为吞吐量设计,以提升整个硬件的吞吐量为主要设计目标。机器学习
标量单核的计算能力没有办法接着大幅度提高,而以深度学习为表明的应用对硬件计算能力的需求依旧在提高,这是个实实在在的矛盾。在可见的未来,要解决这个矛盾,软件开发人员只有代码优化和并行能够选择。编程语言
从2006年开始,可编程的GPU愈来愈获得大众的承认,GPU是图形处理单元(Graphics Processing Unit)的简称,最初主要用于图形渲染。自20世纪90年代开始,NVIDIA、AMD(ATI)等GPU生产商对硬件和软件加以改进,GPU的可编程能力不断提升,GPU通用计算比之前的GPGPU(General-Gurpose Computing on Graphics Processing Units)容易许多,另外因为GPU具备比CPU强大的峰值计算能力,近来引发了许多科研人员和企业的兴趣。工具
在深度学习应用领域,自从cuda-convnet为利用gpu的计算能力设计开始,如今主流的深度学习平台(如caffe, theano)都支持GPU的训练,能够绝不讳言的说:GPU硬件已是深度学习训练平台的标准配置。
要将使用GPU训练得到的深度学习模型部署给用户使用时,一样须要考虑深度学习算法对硬件计算能力的需求。因为不是每一个客户都有GPU硬件,故在目前实际应用中,主要的部署平台是:X86(桌面端)和ARM(移动端),为了提升吞吐量,使用更少的服务器支持更多的访问请求,或提升用户使用体验,为X86 和 ARM处理器优化就变得颇有意义。
因为各类各样的缘由,大多数软件开发人员并无很好的并行和代码优化理论和代码可供参考。最近华章出版公司出版的、由异构并行计算领域专家风辰编写的《并行算法设计与性能优化》、《并行编程方法与优化实践》和《科学计算与企业级应用的并行优化》填补了国内这一领域的空白。其中《并行算法设计与性能优化》和《并行编程方法与优化实践》已经上线,能够在京东和当当上购买。
《并行算法设计与代码优化》关注在并行优化和并行计算相关的理论、算法设计及高层次的实践经验;因为这本书填补了国内代码性能优化和并行计算的空白,获得了吴韧老师的强烈推荐。若是读者想要了解代码优化和并行化背后的理论基础,可购买此书。
《并行编程方法与优化实践》关注于C程序设计语言的向量化和并行化扩展及算法到硬件的映射;此书介绍了常见的SSE/AVX/NEON SIMD指令集编程,以及用于GPU的异构并行编程语言CUDA、OpenCL和OpenACC,以及常见的用于多核编程的OpenMP标准。而且以稠密矩阵运算和图像处理为例,介绍了如何使用这些工具优化程序性能。
《科学计算与企业级应用的并行优化》则关注于如何将线性代数、偏微分方程求解、分子动力学和机器学习领域的常见算法优良的在X86和GPU平台上实现出来。