18-645:how to write fast code快要期中考试了,所以这里对过去所学的三个Module进行一个总结,分别是background、multicore programming、manycore programming。接下来对每个Module都进行总结一下。
转载请注明出处:http://blog.youkuaiyun.com/c602273091/article/details/63279988
Background
首先,我们要知道怎么才能实现fast code,使代码执行的速度非常快。需要实现高效快速的代码,需要快速的平台和好的技巧。快速的代码执行平台包括了多核处理器平台、多处理器平台、云平台。好的技巧包括了数据结构、算法、软件架构(后面会谈到算法模式和架构模式)。
为了实现这个目标,我们需要进行做到以下几点:
- 求解的过程我们应该感觉开心,而不是痛苦;
- 在现存的软件中找到需要的模块
- 找到能实现目标的最好的平台,平台的选择不是越快越好,其实还要考虑功耗、成本等等因素
- 为什么某些部分的代码执行很慢
- 找到整个架构中存在的瓶颈
在目前,我们需要进行代码加速的用途主要是RMS,recognition、mining、synthesis。
识别让我们知道世界是什么样的,数据挖掘可以让我们看到世界的内在,分析估计可以对这个世界进行预测,我们将可以参与到其中。
在这里需要注意的一个东西就是Norman’s Gulf,就是计算机系统的内在性能进行感知的时候,需要和人的感知系统进行一个相互沟通,促进,这样才更够对计算机的内在状态进行了解。
目前举几个我们需要加速的应用:语音识别、图片识别、医学图像、金融工程。
接下来我们对代码加速的硬件平台做一个初步的了解。硬件平台有指令集(RISC、CISC)、设计哲学(multicore、manycore)、功耗等等比较容易区分得指标。
Multicore VS Many core
multicore就是多核处理器,代表的就是intel那一套东西,然后manycore的就是多处理器,是显卡,nVdia那一套东西。
它们的区别在于multicore像几头牛一样,数量不多,但是每个都很生猛,所以multicore的优化就是让每头牛更壮更强,就是对每个线程进行优化。然后manycore就像一群鸡一样,数量很多,但是每一只单独拎出来还是比较弱的。所以multicore对很复杂的任务有进行专门的优化,而manycore的话指令更简单,数据路径没有multicore复杂。manycore更多的是通过aggregate throughput在增强性能。
但是两者都有相同点,就是它们目前优化的方向都是都是增加vector unit的宽度、增加每个die上面的核数、增加off-chip的带宽。就是从存储、指令、调度上面进行增强。
ILP
在指令集并行方面,multicore做了很多工作。比如ILP,指令集并行,就是让一系列指令可以同时计算。
一般指令执行的顺序有in-order和out-of-order。但是一般来说,使用out-of-order的话,使得指令可以使用更多的ILP。在muilticore那里,有register renaming和reorder。ILP的缺点就是在处理器方面需要进行大量的改进,而且而且功耗更多了,设计处理器的时候需要更多的时间。优点就是没有改变代码的线性结构。
SIMD:就死single instruction multi data。 就是比如执行加法,之前只能是32位+32位,现在如果一次性可执行加法可以实行256位+256位,那么就可以使得8条加法指令浓缩成了一条指令。优点就是area和功耗节约了,提高了吞吐量。缺点就是更难操作了,需要程序员进行优化。编译器需要重新编译。
SMT
SMT也就四simutaneous multithreading。就是多个线程同时执行。
优点就是功耗利用率提高,提高了处理器的使用率。缺点就是如果发生数据冲突,需要进行同步。
memory hierarchy
主要是对cache进行操作的时候,需要考虑数据的局部性(locality)时间和空间的局部性。
考虑了这些问题,就可以减少cache miss。cache miss有compulsory miss(初次索引)、conflict miss(冲突缺失)、capacity miss(容量缺失)
如果考虑cache miss的问题,减少了miss,那么就可以更快获取数据进行计算、cache就是管理好的存储、终端用户对此感觉透明,更好地进行函数接口封装。
缺点就是可能会对cache区域进行数据竞争,需要进行同步处理。
当然除了快速代码的硬件平台,还有操作系统、应用框架(API)、应用的组成模块。
接下来介绍一下并发(concurrency)与并行(parallelism)。
并发更多指的是应用里面,有可以进行同时进行的部分;然后并行指的是平台的功能,平台支持同时执行多个任务。
在进行解决这一类问题的时候,我们要记住:
- 理解问题的当前状态(平台、资源、问题的状态)
- 对问题进行内在的观察(找到可以并