一、相关概念
1.1 指令级并行
指令级并行是指在一个处理器内部,利用流水线、超标量、乱序执行等技术,使得多条指令可以同时或部分重叠地执行,从而提高指令的执行速度。比如,一个四级流水线可以同时执行四条指令的不同阶段,如取指、译码、执行和写回。
流水线(pipeline)是一种将每条指令分解为多个步骤,并让各个步骤重叠执行,从而实现多条指令并行处理的技术。比如,一个四级流水线可以同时执行四条指令的不同步骤,如取指、译码、执行和写回。
超标量(superscalar)是一种在CPU中有多条流水线,并且每个时钟周期内可以完成多条指令的技术。这种设计可以提高指令的并行度和处理器的性能。比如,一个双发射超标量处理器可以每个时钟周期发出两条指令到两条流水线中执行。
乱序执行(out-of-order execution)是一种指令在流水线中不遵循程序中指定的顺序来执行,而是根据操作数的准备情况和功能单元的可用性来动态调度的技术。这种设计可以避免一些相关性和冲突导致的流水线停顿,提高流水线的利用率和效率。比如,如果一条指令需要等待一个内存加载操作完成,而后面的指令不依赖于这个操作,那么后面的指令可以先于前面的指令执行。
流水线的详细介绍(源自其他资料)
流水线技术的原理是将一个指令的执行过程划分为若干个子过程,每个子过程称为一个流水段或流水级。一般来说,一个指令的执行过程可以分为以下五个流水段:
取指(IF):从存储器中读取指令,并将指令送入指令寄存器IR;同时更新程序计数器PC,指向下一条指令的地址。
译码(ID):对IR中的指令进行译码,确定操作码、操作数和功能;同时从寄存器文件中读取源操作数,并放入临时寄存器A和B中;如果有立即数,还要进行符号扩展,并放入临时寄存器Imm中。
执行(EX):根据操作码和功能,对A、B或Imm中的操作数进行算术或逻辑运算,并将结果放入临时寄存器ALUOutput中;或者根据操作码和功能,对A和Imm中的操作数进行有效地址计算,并将结果放入临时寄存器ALUOutput中。
访存(MEM):如果是加载指令,从存储器中读取数据,并放入临时寄存器LMD中;如果是存储指令,从B中读取数据,并写入存储器中;如果是分支指令,根据条件判断是否跳转,并更新PC。
写回(WB):如果是运算指令或加载指令,将ALUOutput或LMD中的结果写回目标寄存器;如果是其他类型的指令,则不进行写回操作。
流水线技术的特点是在每个时钟周期内,可以同时执行多条指令的不同流水段。这样可以提高处理器的吞吐率和加速比,即单位时间内完成的任务数和任务完成时间的比值。但是,流水线技术也有一些限制和问题,主要有以下几种:
流水线技术要求每个流水段的执行时间尽量相等,否则会造成流水线的停顿或断流。为了解决这个问题,可以采用平衡流水段、设置重复流水段、插入空泡等方法。
流水线技术要求输入端能够连续地提供任务,否则会造成流水线的空转或饱和。为了解决这个问题,可以采用预取缓冲、分支预测、动态调度等方法。
流水线技术要求各个任务之间没有依赖关系,否则会造成流水线的冒险或冲突。为了解决这个问题,可以采用数据前递、暂停流水线、重排指令等方法。
2.1 数据级并行
数据级并行是指在一个处理器或多个处理器之间,利用单指令多数据(SIMD)或多指令多数据(MIMD)等技术,使得一条或多条指令可以同时对多个数据进行相同或不同的操作,从而提高数据的处理能力。比如,一个SIMD指令可以同时对两个数组的对应元素进行乘法运算,而不需要循环遍历每个元素。
单指令多数据(SIMD)意味着所有并行单元共享相同的指令,但它们计算不同的数据。比如,执行数组 [1,2,3,4]加上 [5,6,7,8],得到一个数组 [6,8,10,12]。此时共有4个算术单元在工作,但它们都可以共享相同的指令(此处为“加法”),并且所有相同的操作都是同步执行的。
多指令多数据(MIMD)意味着每个并行单元具有独立的指令,因此每个单元都可以在任何时间执行不同或相同的任务。比如,一个执行加法,另一个可能执行乘法,另一个可能执行分支等等。这时可以让程序将函数调用分发给不同的处理器上执行,这些核心都是独立的,无论它们是在同一芯片上(多核)、不同的芯片上(多处理器),还是两者的混合
3.1 线程级并行
线程级并行是指在一个处理器或多个处理器之间,利用多线程、多核、多处理器等技术,使得多个线程或进程可以并发或并行地执行,从而提高程序的吞吐量。比如,快速排序可以使用分而治之的方法,用两个线程分别对左右两部分进行排序。
4.1 请求级并行
请求级并行是指在一个系统或多个系统之间,利用程序员或操作系统指定的大量解耦任务之间的并行性。也就是说,可以同时处理多个独立的请求,而不需要等待一个请求完成后再处理下一个请求。这样可以提高系统的吞吐量和响应时间。比如,在线服务器可以同时为多个客户端提供服务,而不需要按顺序处理每个客户端的请求。
解耦任务是指将一个复杂的任务分解为多个相对独立的子任务,从而降低任务的复杂度和耦合度,提高任务的可维护性和可扩展性。
二 、 优缺点
指令级并行的优点是可以提高指令的执行效率,缩短程序的运行时间,提高处理器的性能;缺点是需要处理器的硬件支持,增加了设计和实现的复杂度,可能会引起一些冲突和依赖问题;应用场景是一些对性能要求高的计算密集型程序,比如科学计算、图像处理、加密解密等。
数据级并行的优点是可以提高数据的处理能力,利用多个处理器或多个功能单元同时处理大量数据,提高程序的吞吐量;缺点是需要编程人员或编译器显式地指定并行操作,增加了编程和调试的难度,可能会引起一些同步和通信问题;应用场景是一些对数据要求高的数据密集型程序,比如矩阵运算、向量运算、图形渲染、机器学习等。
线程级并行的优点是可以提高程序的吞吐量,利用多个线程或多个进程同时执行不同或相同的任务,提高程序的并发性;缺点是需要操作系统或编程人员支持多线程或多进程的创建和管理,增加了系统和程序的开销,可能会引起一些竞争和死锁问题;应用场景是一些对任务要求高的任务密集型程序,比如网络服务器、数据库服务器、操作系统内核等。
请求级并行的优点是可以提高系统的吞吐量和响应时间,利用多个系统或多个节点同时处理大量独立的请求,提高系统的可扩展性;缺点是需要系统或网络支持分布式或集群式的架构,增加了系统和网络的复杂度,可能会引起一些负载均衡和容错问题;应用场景是一些对服务要求高的服务密集型程序,比如搜索引擎、电子商务、社交网络等。