更新时间:2022-08-25 18:58
任务并行(英语:Task parallelism),也称为功能平行(function parallelism)或控制平行(control parallelism),是平行计算程序设计模型的一种。在这个模型中,每一个线程执行一个分配到的任务,而这些线程则被分配(通常是操作系统内核)到该并行计算体系的各个计算节点中去。
任务并行(也称为功能并行和控制并行)是一种形式的并行化的计算机代码在多个处理器中并行计算环境。任务并行性侧重于分配不同处理器上的进程或线程同时执行的任务。与涉及在不同数据组件上运行相同任务的数据并行性相反,通过在同一数据上同时运行许多不同任务来区分任务并行。一种常见类型的任务并行是流水线操作,它包括通过一系列单独的任务移动单个数据集,其中每个任务可以独立于其他任务执行。
在多处理器系统中,当每个处理器对相同或不同的数据执行不同的线程(或进程)时,可以实现任务并行。线程可以执行相同或不同的代码。在一般情况下,不同的执行线程在工作时相互通信,但不是必需的。作为工作流程的一部分,通常通过将数据从一个线程传递到下一个线程进行通信。
举一个简单的例子,如果系统在并行环境中的双处理器系统(CPU“a”和“b”)上运行代码,并且我们希望执行“A”和“B”任务,则有可能告诉CPU“a”执行任务“A”和CPU“b”同时执行任务“B”,从而减少执行的运行时间。这些任务可以使用条件语句进行分配,如下所述。
任务并行强调处理(即线程)的分布式(并行)本质,而不是数据(数据并行)。大多数真正的程序都位于任务并行和数据并行之间的连续体上。
线程级并行(TLP)是一次运行多个线程的应用程序固有的并行性。这种类型的并行性主要出现在为商业服务器(如数据库)编写的应用程序中。通过一次运行多个线程,这些应用程序能够承受其工作负载可能产生的大量I / O和内存系统延迟 - 当一个线程延迟等待内存或磁盘访问时,其他线程可以执行有用的工作。
随着多核微处理器的出现,线程级并行的开发也开始进入桌面市场。出现这种情况的原因是,出于各种原因,增加单个内核的时钟速度或每个时钟的指令越来越不切实际。如果这种趋势继续下去,那么新的应用程序将不得不被设计为利用多线程来从潜在计算能力的增加中受益。这与以前的微处理器创新形成对比,现有代码通过在更新/更快的计算机上运行而自动加速。
一般任务在处理器上的调度是通过用户线程(User Thread,相对于内核线程 - Kernel Thread 而言)实现的。操作系统内核通过操纵调度器(Scheduler)对线程进行调度从而将任务映射到各个处理器上。这种调度方式一般不能满足用户自由安排分配任务的要求:通常需要操作系统提供一个用户模式下的调度器来完成这个任务。调度器的任务就是尽可能合理的将任务分配和均衡到个处理器上。
同步是任务并行里涉及到最重要的任务之间通信的方法,分为进程同步(或者线程同步)和 数据同步。进程同步主要研究如何确定数个进程之间的执行顺序和避免数据竞争(Data race condition)的问题。避免数据竞争的主要方法是在程序中设立临界区,即一次只允许一个线程执行的一段代码,通常用于保护重要的公共变量。然而也有理论研究一次允许数个线程执行临界区代码的一般情况,称为l-exclusion问题。
就编程方法来说,保持进程间同步的主要方法有内存屏障(Memory barrier),互斥锁(Mutex),信号量(Semaphore)和锁(Lock),管程(Monitor),消息(Message),管道(Pipe)。
数据同步则是研究如何保证在一个变量的多个副本之间保持一致性的问题。数据同步通常涉及到的话题有Cache一致性(Cache Coherence),数据复制(Data replication)等等。
数据同步和进程同步的目的是为了使程序在多处理器执行的条件下保持一定的内存模型。