1. 概述
并行计算是由运行在多个部件上的小任务合作来求解一个规模很大的计算问题的一种方法。
2. 多核
多核是指一个处理器芯片有多个处理器核心。
多核是处理器发展的必然趋势的原因:
1、集成度越来越高,半导体工艺已经允许在一个芯片上集成多个简单的处理器核;
2、单核高频率处理器的功耗太大发热量太大;
3、研发高频率处理器的成本越来越高;
4、多核技术符合Pollack规则。
(Pollack规则:处理器性能的提升与其复杂性的平方根成正比。)
如果一个处理器的硬件逻辑提高一倍,至多能提高性能40%,而如果采用两个简单的处理器构成一个相同硬件规模的双核处理器,则可以获得70%~80%的性能提升。同时在面积上也同比缩小。
3. CMP处理器
单芯片多处理器(CMP,Chip multiprocessors),它的各CPU核心之间进行数据共享和同步的机制有以下两种:
一种是基于总线共享的cache结构,一种是基于片上的互连结构。前者结构简单,速度快,但可扩展性差;后者可扩展性好,但结构复杂。
4. 加速比
加速比(speedup),是同一个任务在单处理器系统和并行处理器系统中运行消耗的时间的比率,用来衡量并行系统或程序并行化的性能和效果。
加速比 = 串行执行时间 / 并行执行时间
阿姆德尔加速比的前提:任务一定
固定负载的加速比计算公式:
上限为:1 / f (f = 串行工作量 / 总工作量,实验决定的串行比例)
5. 多线程编程模型
(a) 流水线
(b) 工作组
(c) 客户端&服务器
6. 进程和线程
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
线程与进程的区别:
a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
c.调度和切换:线程上下文切换比进程上下文切换要快得多。
d.在多线程OS中,进程不是一个可执行的实体。
7. 并发与并行
并发执行:多个线程是交替执行的,同一时刻只能有一个线程执行。
并行执行:多个线程是同时执行的,同一时刻可以有多个线程执行。
支持内核级线程的操作系统,可以分派属于同一进程的多个线程在多个处理器内核上运行,提高进程执行的并行度。
8. 死锁和饥饿
死锁:当一个线程因为等待另一个线程的资源而阻塞,而同时该资源永远不会被释放时。
饥饿:是指系统不能保证某个进/线程的等待时间上界,从而使该进/线程长时间等待,当等待时间给进/线程推进和响应带来明显影响时,称发生了进/线程饥饿。
9. 读写锁与递归锁
读写锁:读写锁允许多个线程同时进行读访问,但是在某一时刻却最多只能由一个线程执行写操作。
递归锁:指可以被当前持有该锁的线程重复获取,而不会导致该线程产生死锁的锁类型。
(错序死锁:两个线程分别拥有锁,并等待对方的锁。)
10. 线程池
在面向对象编程中,创建和销毁对象很费时间,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。
线程池即为软件运行中所维护的一组线程。
作用:1、限制线程数量
2、减少线程频繁创建和销毁的次数
11. CPU与GPU
GPU(Graphic Processing Unit)是图形处理器。GPU就是显卡上的核心零部件,专门负责计算机的图形计算和处理,它决定了该显卡的档次和大部分性能。
GPU擅长并行运算,CPU擅长串行计算。GPU计算的模式就是将CPU与GPU结合起来加以利用,采用异构协同处理计算模型(其中CPU为主处理器,为Host,GPU为协处理器,为Device)。应用程序的串行部分在CPU上运行,而计算任务繁重的并行部分则由GPU来加速运行。