多线程算法
一、问题提出
单处理器上只能用串行算法,所谓的并行也是时间片轮转,没有真正达到并发的意义。上下文切换还会有时间消耗,但是我们不可能为每一个任务都分配一个cpu,是一种不得已而为之的并发。前面是软件并发,但是多处理器时代,允许多条指令在处理器上并发执行,讨论硬件并发。并发有多进程并发和多线程并发,二者各有优缺点,我们讨论多线程的并发。(多线程)多核处理器,面临分布式存储和共享存储的问题。分布式存储在访问另一个处理器存储时需要发送一条显示消息,效率相比较低一些。分布式存储致力于解决海量数据的可扩展存储问题,自有其无可替代的应用场景。本文主要介绍共享存储。
二、多线程问题
多处理器和共享存储的并行计算机有共同特征:使用静态线程。所谓静态线程就是线程池,免去频繁创建线程的麻烦。但是,让每个线程接受大小一致的负载,即负载均衡比较困难。这种情况促使一些并发平台产生,提供一软件层来协调管理这些并行的资源。
本文介绍“动态多线程”一种并发平台,此并发平台包含一个调度器进行自动进行负载均衡计算。
1、动态多线程都有两个特征:嵌套并行和并行循环。前者可参考斐波那契,允许并发的子过程继续并发子过程。后者参考矩阵相乘,每一步计算,在一个线程里可并发的执行。
2、调度: 自动负载均衡计算采用贪心调度器,采用最长处理时间作业优先的贪心策略:(n个作业,m个机器)
当n≤m时, 只要将机器i的[0, Ti]时间区间分配给作业i即可。
当n>m时, 将n个作业依其所需的处理时间从大到小排序,然后依次将作业分配给空闲的处理机。
贪心调度器:https://blog.csdn.net/liufeng_king/article/details/8740572
https://www.cnblogs.com/cxmhy/p/4477670.html
三、性能度量
加速比:在P个处理器上比在1个处理器上快多少倍(总工作量/工作时间,工作量是指总的计算量,工作时间是最长线程所需要的时间)。加速比最大是处理器的数目,完美线性加速。好的调度算法就是无限接近完美线性加速,贪心调度器可以达到近完美线性加速。
无限增加处理器没有意义,现实场景也不可能。一般计算量10倍于处理器以上,可达到好的加速比。
四、并行中的竞争
虽然可以使用互斥锁,原子操作等线程同步方法,最好是让每个线程独立运行,不存在竞争,但是对于线程共享内存的特性而言是不可能的,以后博客会介绍并发编程。