本系列是Prof Kayvon Fatahalian2017年夏季学期在清华开的一门课程,对应的CMU课程是15-418,可以在bilibili找到原始视频。
这门课我是2020年学习的,现在把一部分当时的学习笔记上传博客保存。
不同层次上的并行计算
- 指令级并行(ILP, e.g. superscalar):由CPU硬件设计实现,在一个时钟周期内解码并执行一个指令流中的两个指令,不需要用户干预
- 物理多核处理器(Add more cores):每个核比单核处理器速度慢,但是多个核可以共同完成一项工作,得到速度提升,属于thread-level并行
- SIMD指令(Add more ALUs):对单个指令流中的一条指令广播到多个ALU上,在单个核上并行地执行计算(vector program),例如SSE,AVX,AVX512指令集
例如对于一个一个16核处理器,每个核有8个ALU,可以同时有16个指令流,128个元素在并行执行。
Note: 条件语句的执行(conditional execuation)可能会影响SIMD指令的工作情况,不合适的条件判断会导致多个ALU等待其中一个ALU的条件指令完成,从而引起效率下降。因此instruction coherence很重要。
Kayvon的总结:
内存访问
指标:
- memory latency: 进行一条内存读/写指令操作所需要的时钟周期
- memory bandwidth: 内存系统给处理器提供数据的速度(GB/s)
- stall: 指令流等待不能进行下一条指令,由于指令间存在依赖关系,而被依赖指令所需的内存数据没及时完成读取
如何优化?
- cache缓存: 减少memory latency,因为cache数据物理上离CPU更近,使用了更好的存储介质
- prefetch预读取: 掩盖memory latency,实际读取速度没有变化,但是由于预先读了数据,看起来似乎减少了延迟
- multi-threading多线程:减少stall来掩盖latency,因为多个HW thread工作,如果一个线程在等待读取,可以切到另一个线程,不会让ALU等待,因此提高了吞吐量(throughput-oriented)
HW上的multi-thread不通过OS管理:
一个例子
NV的1080:
Nvidia的GPU上的一个SM里面实现了64个硬件级线程(warp),每个warp可以实现32维SIMD指令。因此每个SM上有32*64=2048个并发数据。
理解CPU与GPU的区别——理解BW
GPU是为了高吞吐量而设计的,More threads → larger working set → less cache space per thread,多线程会对memory bandwidth造成压力(maximal latency hiding ability leads to memory bandwidth burden.)
为了避免内存带宽影响,需要注意:
- 注意程序的逻辑,少从内存读数据,这里有两方面可以作为出发点考虑:
- intra-thread,重用当前线程上一步计算结果
- inter-thread,多个线程共享数据
- 每次尽量做大量数学计算,少做读取/写回频繁的任务,即并行arithmetic intensity大的程序
标签:thread,背景,CMU15418,知识,指令,线程,内存,memory,ALU From: https://www.cnblogs.com/hesun/p/18139537