Lecture 6 Multicore Programming
课程内容
本节课主要讲的就是多线程编程的一些基础知识,重点在各个线程库的使用上。
多核处理器
为什么需要多核处理器?
因为摩尔定律的『失效』,因为时钟频率的客观局限性,单核可容纳的晶体管数已经达到上限。
抽象的多核架构
Chip Multiprocessor (CMP)
图源本课课件
Cache缓存一致性
多核系统中,比较重要的问题就是缓存的一致性问题。
问题发生在当不同的核对同一个变量读取后,放到自己核的Cache中。其中某一个核对这个变量更改后,其他的核再从自己的Cache读取这个变量的时候,Cache中所存储的数据已经过期了,不是最新的。
因此而产生了MSI协议。
MSI协议
每一个Cache Line都被打上了一个状态标签。
M (modified):Cache Block 被修改过了。
S (sharing):其他的 Cache 也共享了这个Block。
I (invalid):Cache Block 失效了。
在每一个Cache修改了一个数据后,硬件系统会先将其他Cache的拷贝置为失效。
几个问题
为什么是按Cache Line粒度的?
理论上可以为每个内存中的位置都设置一个状态标签。但是这样带来的开销是特别大的。选了一个适中的粒度。
这个协议是硬件上实现的,而非软件的。
相似的协议有很多,这只是其中一种。
并发平台
以斐波那契的计算为例,单线程代码:
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
int64_t fib(int64_t n) {
if (n < 2) {
return n;
} else {
int64_t x = fib(n - 1);
int64_t y = fib(n - 2);
return x + y;
}
}