深入理解计算机系统 第 25 课 Thread-Level Parallelism
约 2 分钟· 本文阅读 次
这节课我们从硬件讲起,然后介绍线程级并行,最后说一下一致性模型。这部分内容在我当助教的 18645 How to Write Fast Code 也有涉及。
回想一下,我们之前是如何处理 I/O 的延迟的呢?一个办法是每个客户端都由一个线程来处理,这样就不需要互相等待。现在的多核/超线程处理器提供了另外一种可能。我们不但可以并行执行多个线程,更好的是这些都是自动进行的,当然,我们也可以通过把大任务分成小任务来加速运算。

上图是典型的多核处理器架构,这里需要注意的是 L3 缓存和主内存都是共享的。而具体的执行计算的架构,基本的乱序执行处理器的架构为:

指令控制器会动态把程序转换成操作流,操作会被映射到 Functional Unit 上进行并行处理。这种情况下,一个核心处理一个线程。而在超线程的设计中,一个核心可以处理若干个线程,秘诀在于多出来了若干套指令控制流,如下图:

如果我们想要了解机器的相关信息,可以访问 /proc/cpuinfo

随后老师提及了两个例子,一个是并行求和,一个是并行快排,这里不赘述,如果感兴趣的话,可以自己思考一下。
另外一些关键字是
- Amdahl's Law
- Parallel Program Performance: Speedup & Efficiency
总结来看,并行编程需要注意的是:
- 要有并行策略,可以把一个大任务分成若干个独立的子任务,或者用分而治之的方式来解决
- 内循环最好不要有任何同步机制
- 注意 Amdahl's Law
最后说一下内存一致性的问题,下面的程序会输出什么呢?

具体输出的内容,取决于内存的一致性模型

如果使用 Write-back 的话,不同的缓存间不沟通,那么结果如下:

而更多的会用 tag 来标记不同的状态,由内存和缓存完成具体的协调工作:



相关文章
- 深入理解计算机系统 第 22 课 Concurrent Programming2016-04-06
- 深入理解计算机系统 第 26 课 Future of Computing2016-04-08
- 深入理解计算机系统 第 27 课 总结2016-04-08
- 深入理解计算机系统 第 23 课 Synchronization - Basics2016-04-07
已恢复到上次阅读位置