1.冯诺依曼结构
经典冯诺依曼结构为 : 主存, 中央存贮单元(CPU) , 以及 主存和中央存贮单元之间的传输部分。CPU 又由 ALU(计算单元)和 控制单元组成。 主存和CPU之间的分离称为冯诺依曼瓶颈。
2.进程,多线程及线程
线程为程序员提供了一种机制,将程序划分为多个大致独立的任务,当某个任务阻塞时能够执行其他任务。线程的切换比进程要快。
进程和 线程的关系: 线程从进程中fork,当线程结束时 又join回进程。
3. 对冯诺依曼瓶颈的改进:Cache 的引入,虚拟内存,低层次并行。
1) Cache 是利用内存连续或者数据的局部性一次读取一整块代码和数据,提高速度。
// sample
int A[10][10]
int B[10]
// 内存是连续的
for(int i =0;i<10;i++)
for(int j =0;j<10;j++)
sum += A[i][j] * B[j];
/* 在 row-major情况下,下面程序性能不好,每个元素之间差了10 */
for(int i =0;i<10;i++)
for(int j =0;j<10;j++)
sum += A[j][i] * B[j]
根据文献:实际运行时,当矩阵大小为1000*1000时第一个比第二个快三倍左右(也没那么快-_-!)
2) 虚拟存贮器
就是常用的虚拟内存,当运行一个大型程序,程序需要访问大型数据集,那么所有的指令或者数据可能在主存中放不下。
3)指令级并行
略
上面是对冯诺依曼的扩展, 下面是现有的一些并行系统
SIMD系统 (GPU属于这一种)
全称单指令多数据流,顾名思义,SIMD通过对多个数据执行相同的指令从而实现在多个数据流上的操作。为了实现多数据流操作, SIMD中的ALU很多, 具体可以参考GPU架构。
for(int i =0; i<n;i++)
x[i] += y[i];
/* 在SIMD中, 每一个ALU 载入x[i]和y[i],并将计算结果放入x[i] */
所有的ALU要么执行相同的指令,要么同时处于空闲。
90年代唯一广泛生产的是向量处理器,近来是GPU。
MMID系统
多指令多数据流,有两种类型,共享内存系统和分布式内存系统。