这里就是记录一下我在听课过程中感觉比较重要或者比较难懂的知识点,较为零散
Lecture 1
摩尔定律还在生效,但是提高能效的方式正在变化
这个是具体解释,在未来,我们可能不会同时用到所有的晶体管
同时,指令级并行不能一直加速,因为一个程序中不太可能出现若干条不相关的指令
功耗墙
提高主频也会提高功耗,同时散热也是主要的问题
Lecture 2
这里的指令流一致性,指的是多个数据执行的指令流是相同的
比如一个SIMD指令中的若干个数据都有相同的指令流(相同的分支),那么我们就可以跳过不必要的分支来加速执行
反过来,如果指令流分布的不好,我们就要把分支都执行一遍,再用位掩码来处理分支的结果,从而导致并行性较差
延迟和带宽的区别
利用多线程隐藏高延迟操作的延迟
Interleaved multi-threading,这里根据我之前看量化研究方法的猜测,应该指的是相对粗粒度一些的多线程操作
每个核仍然是在执行一个指令流,出现延迟操作的时候就可以切换线程
更加粗粒度一些的是磁盘IO,等待锁等,这时候就是用操作系统来进行调度
这里的提到的调度是硬件级别的,是CPU自己进行调度
SMT就是多线程和超标量的结合版
一个核在一个周期中不只是执行一个指令流中的命令,而是可以执行若干个线程中的指令,相当于是指令级别的粒度
一个线程的ILP不够时就可以用SMT来达到更高的ILP
需要更高的带宽,因为多线程导致每个线程的空间减少了
这就是为什么GPU需要自己的Memory,而不是去访问主存
最后一点,GPU的主要目的应该是隐藏延迟,所以需要大带宽
CPU中利用了很多Cache机制,以及预测机制来减少Latency
但是都是在利用多线程来提高性能
Matlab这个例子中也看出来,不能一味的去尝试多线程,因为切换上下文的延迟也会有一定的开销。但是这里有点奇怪的是,如果设置的线程数和core的数量相同的话,应该不会出现切换线程。也可能是因为运算或访存的代价太低了?
个人感觉是Matlab的原因,或则是他的代码的原因
因为context switch应该已经很快了
第三节课中有对这个地方的补充
HyperThreading,超线程就是超标量处理器跨越多个可用的线程寻找独立的指令
不仅利用多线程隐藏了内存延迟,同时还增加了独立指令的个数,以满足超标量处理器的工作负载
Lecture 3
第一种方案有更好的局部性,因为只有第一次访问会出现cache miss,其他的访存都会出现缓存命中
这里有个问答解决了我的一个疑惑
所以具体那个表现更好其实也取决于Cache的大小
第一种方案下对cache的要求更低
但是这只是考虑到了缓存了,在其他方便,比如平衡工作负载等,还是要根据情况去选择实现方式的
这里有一个评论总结的挺好的
the difference between SPMD and SIMD is simply abstraction vs. implementation, respectively? That is to say, SPMD is the ISPC model that we're using, with gangs and program instances, whereas SIMD is the implementation with multiple ALUs
我们使用的是SPMD的model,我们写代码的时候认为我们会生成若干个program instances,然后为这些instance分配数据。对于ISPC实际的实现,他使用了SIMD指令,而不是生成若干个线程来计算。
这里也有相关的描述,foreach表示这段代码是独立的,我们认为他会在执行的过程中映射到若干个program instance中,但具体实现上,他是SIMD parallelism的
一个很有意思的comment, burger analogy
In my opinion, abstraction is what you do not need to do whereas implementation is what you have to do. For example, when you order a BigMac at McDonalds, you don't need to know how the BigMac is made. You only need to tell the employee, "I want a BigMac and here is 8 bucks". Then after a while you get one. Here, the employee is an interface where you can get burgers from. But if you are a cook at McDonalds you have to know how to make different burgers. Here, as a cook, you "implement" a burger according to the customer's need. And you also use some abstraction others provide. For example, you don't need to know how to grow vegetables, how to keep cattle, ... You only use those materials as you need, which means you are using abstraction provided by farmers.
共享地址,通过读写共享的变量来进行通信
我们常用的线程间通信
但是拓展比较难,因为拓展的代价是在硬件上
消息传递模型
用在进程间通信,RPC
共享地址和消息传递可以相互实现
whenever you look at a system. First ask yourself what is the code actually mean, what is the semantics of the program. And then ask yourself how are these actually going to be implemented
文章评论