并行计算的一些背景知识

来源:互联网 发布:和还原精灵类似软件 编辑:程序博客网 时间:2024/04/28 17:42

   

1.冯诺依曼结构

    经典冯诺依曼结构为 : 主存, 中央存贮单元(CPU) , 以及 主存和中央存贮单元之间的传输部分。CPU 又由 ALU(计算单元)和  控制单元组成。 主存和CPU之间的分离称为冯诺依曼瓶颈。



2.进程,多线程及线程

   线程为程序员提供了一种机制,将程序划分为多个大致独立的任务,当某个任务阻塞时能够执行其他任务。线程的切换比进程要快。

    进程和 线程的关系: 线程从进程中fork,当线程结束时 又join回进程。


3. 对冯诺依曼瓶颈的改进:Cache 的引入,虚拟内存,低层次并行。

   1) Cache 是利用内存连续或者数据的局部性一次读取一整块代码和数据,提高速度。

// sampleint 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系统

 多指令多数据流,有两种类型,共享内存系统和分布式内存系统。




   

0 0