介绍
这门课会学到OpenMP、CUDA、Hadoop的使用,想想真是激动,一门课要学这么多东西。
为什么需要更高效的代码
我们使用高效代码,一般需要两部分进行考虑:平台+技巧。平台就有多核平台、多处理器平台、云平台。技术需要考虑数据结构、算法、软件架构。这些都会在后续章节谈到,这一次主要说的是硬件平台的内容。
是应用驱动了这一需求,而不是平台决定了你需要写更高效的代码。因为目前火热的RMS(Recognition Mining Synthesis)需要大量的计算,那么高效的代码使得这些应用可以更快实现,甚至达到可以与人类进行交互的地步。
对于RMS这里需要介绍一下:识别就是对世界的翻译,比如视觉上的目标检测、声音上的语音识别。就是要知道这是一个什么东西。对目标进行建模。挖掘就是对这个东西隐藏的模式进行挖掘,找到其中的内在联系。就是分析模型的特性。分析就是对世界进行一些预测,使用模型进行预测。比如买股票、买期货。
在有了以上运用之后呢,我们就有了特定的平台做加速。但是呢我们如何评估一个系统的性能呢?系统状态和性能很难评估,所以有个叫做Norman的人提出了Gulf of evaluation 他把计算机的系统评估和人的感知评估模型相结合起来,获取计算机系统的状态、并对这个进行解释。
现在又回到刚才说的RMS,RMS是未来的趋势。那么RMS最重要的是什么呢?
那就是数据,数据非常重要。比如目前火热的深度学习,就是在大数据和高速平台的驱动下,使得很多算法得以真正发挥它的效果。
总结一下这部分RMS的东西就是:RMS驱动着未来的运用。
加速的意义
使得很多应用的交互性增强,效率提高。
平台相关:
技术相关:
硬件平台
当你可以回答以下问题的话,说明你对硬件平台还是知道不少的。
multicore vs manycore
multicore是每个核都可以独当一面,能力十分强。manycore是数量很多,但是每个处理器的能力十分有限。
multicore和manycore有相似点和不同点。它们都在优化同样的东西,但是优化的方向不同。都是发挥着自己的架构的优势。multicore更多的是在核内进行加速,manycore是数量更多的核进行加速。
两者进行对比:
Instruction level parallelism
先是super scalar,然后是out-of-order。
super scalar是获取一个batch的指令,然后尽量减少其中的相关。在执行阶段,多条指令可以一起执行。这是在执行阶段,资源增加,使得一个周期可以执行多条指令。
out-of-order是增加了一个减少指令间的依赖关系的东西。依赖关系越少,在执行并行指令的时候就可以提高资源利用率。
ILP没有改变指令的顺序流,在软件层面不需要什么修改就对代码加速。但是在处理器层面就需要做很多修改。功耗大于一般的顺序处理器。
SIMD
SIMD: single instruction multiple data.
之前的整数是32,64位。那么我们设计更长位的加法,比如128位,那么不就可以对4个32bit的数据进行加法。
从上图可以发现CPU时间很大一部分是在寄存器的读写上,所以使用SIMD就可以对这块进行加速。
x86系列的SIMD的发展:
使用SMID可以跑的指令越多是不是就越有效(功耗、吞吐量的一个均衡)呢?功耗会上升、资源利用率下降。
为了提高资源利用率,那么可以优化编译器发挥它的作用。
SIMD增加了资源利用率,但是在使用的时候需要在软件层面手动做不少优化。
Simultaneous Multithreading
当我们有多个指令流的时候,我们可以使用这种方法做加速。它比superscalar、mutlprocessing更有效地解决问题。
这种多线程的方法可以提高资源利用率,但是没有加快每个线程的延时,需要在多个指令流的时候才可使用、在使用cache的时候会涉及数据同步的问题。
Memory Hierarchy
减少cache miss可以加快速度,这里的原则使用的是局部性原则。空间和时间局部性。
cache miss的类型:
使用memory hierarchy进行优化的时候,只是在多线程情况下,cache同步是一个很大的问题。
System Architecture
这里就是涉及我们应该采用哪一种平台,这里要考虑很多因素了。
整个设计需要综合考虑平台、算法、软件架构、成本。
PS:以上ppt截图来自于JikeChong和Ian Lane的CMU 18-645课程。