400-800-5817

当前位置:
数字系统重要指标-吞吐率和时延!
来源:网络 | 作者:tpl-cccf628 | 发布时间: 2021-09-18 | 391 次浏览 | 分享到:
吞吐率被定义为数字电路单位时间内传输数据的量或单位时间完成的工作量。传输的数据越多或做的工作越多,则吞吐率越高。吞吐率有时候和性能、带宽可以互换使用。对于CPU来说,吞吐率定义为单位时间内能够执行的指令数。对于DDR存储器来说,吞吐率定义 为从存储器中写入或读取的数据量。

数字系统重要指标-吞吐率

吞吐率被定义为数字电路单位时间内传输数据的量或单位时间完成的工作量。传输的数据越多或做的工作越多,则吞吐率越高。吞吐率有时候和性能、带宽可以互换使用。对于CPU来说,吞吐率定义为单位时间内能够执行的指令数。对于DDR存储器来说,吞吐率定义 为从存储器中写入或读取的数据量。

经常和吞吐率一起出现的术语是延迟,我们会发现,延迟和吞吐率是两个不同的概念(后面会介绍延迟)。当谈论吞吐率的时候,我们一般谈论的是支持多大的吞吐率。为了获得吞吐率,我们需要测量—段时间内传输的数据量或执行的指令数。这是一个平均数值而不是瞬时数值。

延迟是指从加入激励到得到第一个输出结果需要的最短时间。例如,你种植一棵柠檬树,等待它结出果实,它可能过了一年才结出第一批果实。你对降低延迟(一年)无能为力。但是,你可以通过种植10棵树来增加柠檬的产量,你会得到10倍的果实,但是你还是要等一年才能得到第一批水果对于多数设计来说,有一些方法可以降低延迟,但大多数情况下是无能为力的。下面我们将讨论降低延迟的方法。

在一些应用中,吞吐率至关重要,而在一些情况下,降低延迟是设计的重点。例如,当对DRAM写人大量的数据时,具有高吞吐率就很重要。而另一方面,对类似于在线翻译服务器这类设备来说,用户需要快速获得返回结果,降低延迟就变得更为重要。

增加吞吐率的方法

当我们设计一个系统或一个芯片的架构时,希望尽力获得高吞吐率。提高吞吐率涉及多个关键技术点,假如我们能够理解这些关键技术点是如何工作的,以及它们之间存在怎样的关联,那么我们就能把这些关键技术点以最好的方式组合起来以实现期望的目标。下面将对 影响吞吐率的关键技术点进行逐一分析。

更高的频率

当今的数字系统以同步系统为主,都需要一个或多个时钟。一个增加数据传输速率或指令执行速度的常用方法是使用更高频率的时钟,在时钟频率增加的情况下,系统的处理能力就会得到不断提升,处理器设计中通常采用这种方法。然而,这种方式会有负面效应,原因 记功率消耗和时钟频率成正比例关系。假如设计的是低功耗电路,通过增加频率来满足吞吐率的要求并不是很好的方法,此时可能需要考虑其他的技术手段。当前流行的处理器设计趋势并不是仅仅把处理器时钟频率的提高作为目标。例如,通过设计多核系统和采用多通道存 储器可以在不提高主频的情况下提高处理能力。

更宽的数据通道

设计者可以通过增加数据总线的位宽来提高数据吞吐率。在时钟频率不变的情况下,增加数据总线的位宽可以增加数据吞吐率,就像四车道的公路比两车道的公路单位时间内可以通过更多的车辆一样。例如,PCIe总线可以连接1个通道、2个通道直至32个通道。假设需要 设计一个SA SPCIe控制卡,或一个PCIe SSD卡,那么需要用多少个通道的PCIe总线呢?首先,需要计算HDD或SSD读写需要的带宽,然后选择一个xl,x2x4或甚至x8的PCIe连接器。所选择的PCIe总线连接器的带宽需要与存储器的访问带宽相同或比后者大。另外设计时要考虑到PCIe协议的开销,和任何协议一样,PCIe上并不是所有的时钟周期都可以用来传输用户数据。

在实际设计中,通常需要对总线的工作时钟频率和总线的位宽进行折中考虑。在给定系统所需传输带宽的情况下,需要选择合适的数据线的宽度和工作频率。例如,64位、800MHz,128位、400MHz和256位、200MHz的总线具有相同的带宽,应如何选择呢?增大总线宽度会使接插件变得更大,芯片引脚更多,从而增加设备的硬件成本;提高总线频率会增加系统设计难度,需要更多地考虑高频信号中常出现的电磁兼容和信号传输质量问题。

我们可以假定一个这样的场景:我们选择64位数据通道进行背靠背的数据包传输,在一个时钟周期里可以并行发送4字节,它们分属于不同的数据包。在这种情况下,使用一个低速时钟进行数据处理是非常烦琐的。此外,低速时钟意味着更大的延迟(进行数据处理需 要的时间更长)。如果一个设计占用的逻辑门资源不多,对延迟也不敏感,那么使用较为早期的低端工艺进行芯片设计就可以满足需求。如果希望降低延迟,同时预算充足,可以采用最为先进的工艺,使用更高的时钟频率和更窄的数据通道。

流水线

所有当前先进的处理器都采用流水线结构来增加吞吐率。假如一条指令需要n个步骤才能完成执行,那么它需要n级流水线。当第一条指令开始执行第二个步骤时,一条新的指令可以开始执行第一个步骤,后续的指令依次不断进人流水线。当第一条指令完成n个步骤之后,每个时钟周期都会有一条指令执行完成。假如不使用流水线,那么需要等一条指令执行完之后才开始另一条指令,效率就只有原来的1/n。流水线的概念不仅适用于处理器,在许多系统中都有应用。一个PCIe IO扩展卡可以向主存储器发起读操作命令,该指令的操作需要一定的时间和操作步骤,扩展卡可以在前一条指令尚未完成时就发出后续的指令,以此来提高总线的吞吐率。设计者还可以利用此概念设计高速流水线结构的加法器和乘法器。当我们设计一个协议时,可以考虑采用流水线来增加吞吐率。

并行处理

并行处理与流水线不同,在并行处理中,会同时用到更多的资源。现代处理器中常常会同时存在多个线程,其中每一个线程以流水线方式工作。每条线程在一个时钟周期内执行一条指令或每秒钟执行m条指令。当有n条线程时,一秒内可以执行m x n条指令。

并行处理过程可以用超级市场出口处的收银-打包台来类比。每个出口处需要两名工作人员,一个收银,一个进行商品装袋打包,两个人构成一条简单的流水线,多个收银-打包出口构成多个并行的线程。商场可以根据客流量调整出口的数量。

无序执行(乱序执行)

一个晴朗的周六早晨,我的妻子给我布置了六件无序的工作(列在一张纸上)。只要在一定时间内把六件事都完成她就会很开心。她并不关心我先做哪件事后做哪件事,除非它们前后有依赖关系。我看了看清单,记下了需要去的几个地方,列出了一个处理顺序,然后完 成它们。我重新将它们排序可以基于总路程最短,或根据我的喜好,把喜欢做的事放在最前面,讨厌的放在后面。此时处理顺序可能不是最有效率的,但我可能更喜欢这样做。

不需要按照严格的顺序执行n项任务为在尽可能短的时间内完成全部任务提供了优化的可能,这也就增加了电路的吞吐率。SATA和SAS协议支持的NCQ(Native Command Queuing)就是这样一种优化技术。操作系统向磁盘发送一组读写操作命令,数据存储在磁盘中,根 读/写磁头和数据的相对位置,单个命令花费的时间是不同的,磁盘驱动电路分析所有的操作命令,根据一些算法(如最少搜寻算法)确定内部的执行顺序,从而提高整体读写效率。

当前的处理器将指令分解成若干微代码,发送到指令池中。然后,微代码以无序的方式执行然而从外部看,这些指令完成的顺序和指令取出的顺序是相同的。例如,指令1和指令2两条指令先后进入指令池进行乱序执行,如果指令2的所有微代码都已执行完毕,但是指 令1中仍然有一条微代码尚未完成。在这种情况下,指令2必须等待指令1完成后才能完成并返冋执行结果。从整体上看,虽然存在内部等待,但以无序方式执行微代码可以提高整体效率,因此具有更高的吞吐率。

另外一个是存储器控制器的例子。一个PCIe卡能够向主存储器发送多个存储器读操作命令。存储器控制器可以重新对存储器读操作命令进行排序(基于被读取数据所在的存储区域)。存储器控制器返回的读出数据的输出顺序和PCIe卡发岀的读操作命令的顺序可能不同,PCIe会确保系统的正常工作。如果PCIe卡在某些情况下需要保证读出顺序,那么它必须等待该数据被读出后才发出后续的操作命令。从整体上说,存储器控制器的这种乱序工作方式可以提高存储访问的吞吐率。

高速缓存(cache)

处理器经常利用cache来提高系统性能。系统启动之后,操作系统和用户程序从硬盘加载到内存(RAM)中。所有的命令都保留在RAM中,当处理器要执行某个指令时,它会从内存中读取该指令。类似地,处理器也会对RAM进行数据读写。理论上,这就是计算机的运行 方式,但是存在一个问题,那就是RAM的读写时间比较长,需要多个时钟周期(或者说指令周期)才能完成。

为了改进性能,处理器使用一个容量较小的存储器,将部分指令和数据存入其中,这个更小的存储器称为cache(高速缓存)。高速缓存离CPU更近,运行速度更快,几乎和CPU内核的速度是一样的。当处理器需要读入指令和数据时,它会首先读取缓存而不是存储器。只 有当需要的指令和数据不在缓存中时,才会去内存中读取。这种方式可以减少内存访问的次数,提高系统性能。目前的高性能处理器中通常采用两级cache(L1 cache和L2 cache)。

高速缓存的概念可以进行推广,当一个系统的两个部分在运行速度方面差别较大时,可以在快速设备和慢速设备之间插入cache,一些硬件设备,如硬盘等,读写速度相对较慢,此时硬盘驱动电路中可以使用一个本地缓存来存储从磁盘读取的数据,当读操作指令到达硬 盘驱动电路时,它能很快地从本地缓存中返回数据,而不是花费更长的时间读取磁盘中的数据。cache也用来提高写入的性能,当CPU向主存储区写数据时,它会花费很长的时间。这时CPU处于空置状态不能执行其他指令。此时可以设置一个写缓存,CPU将需要写入的数据写入cache中即可,此后CPU继续执行其他指令,驱动电路负责将cache中的数据以较低的速度写入存储器中。

固态盘(Solid-State Drive),如Flash存储器的驱动电路中也使用本地缓存提高写和读的性能。固态盘的一个特点是读/擦除的次数是受限的。固态盘的写缓存在数据写入时先将数据缓存下来,向CPU发出ACK确认信息,然后再将数据写入存储器。采用写缓存还有一个优点,假如存在对同一个地址的多次写操作,那么固态盘驱动电路只将最后一个数据真正写入存储器中,这就减少了闪存写入的次数,提高了固态盘的使用寿命。

cache并不只在硬件设i十中使用,在软件设计中也经常用到。搜索引擎在网络中查找并在本地存储所需要的信息,当用户进行网络搜索时.可以直接在搜索引擎所存储的数据中进行查找,而不是到Internet中进行搜索,这样就可以提高搜索速度。

预读取

数据预读取的含义是在缓存区中预先存入比当前需求更多的数据由于实际应用屮许多数据是连续存储和使用的,提前读入一些数据到缓存区中可以减少对存储介质的访问,从而提高读取速度。

多核

现代的处理器经常采用多核(例如,8核或16核)结构。每个核都是一个完整的CPU多个CPU能并行地进行数据处理。’

在一个高性能存储器控制器中,可能存在多个DDR控制器,它们独立地连接不同的DDR存储器。同样,高性能的SSD控制器同时存在多个Flash控制器,它们也能独立地同时进行Flash读写。

时延

时延,如前所述,是从操作或命令开始执行到获得数据或结果的最短时间。时延和吞吐量是两个常用概念,是一个系统的两个不同方面。通常两者相互独立,但也存在着一些相互关联和影响。在同步通信中,时延决定着一个独立工作流的吞吐量。

以CPU访问存储器为例,假如CPU希望从主存储器中读取数据,那么它会发出存储器读指令以读取64字节数据(64字行通常被称为一个cache line)。假如读取数据的前8字节耗时0.5us,那么时延就为0.5us。我们再举一个PCIe网卡从主存储器中以DMA方式读取数据的例子,该读操作大概需要2us时间,此时时延即为2us.如果PCIe网卡支持背靠背的存储器读操作,那么就能够增加吞吐量。此时,获得读取的第一个数据包需要2us,但是后来的数据包会连续到达。如果我们在一个相对较长的时间内连续进行数据读写,那么时延就不会对吞吐量产生明显的影响。

在一些情况下,时延会影响到吞吐量。在使用一些具有互控机制的通信协议时(如处理器之间的通信),一些指令只有在收到完整的数据之后才能执行,此时吞吐率就会直接受到时延的影响。在这种情况下,我们需要尽量减小时延。另外,对于在线业务或计算机处理的 股票交易中,时延也是非常重要的。假如根据用户的查询要求,设备需从存储器中读取4K字节节的数据,那么系统设计者需要考虑尽可能快地返冋需要的数据,使得时延越小越好。

降低时延的方法

有没有降低时延的有效方法呢?毫无疑问是有的。在很多应用中需要使用FIFO(First In First Out,先入先出存储器),FIFO会引入时延。在FIFO中,先到达的数据会先被读出,如果写入端的速度高于读出端,FIFO的可用存储空间就会减小到零。如果一个对时延敏感的包到了一个FIFO队列中,由于其排列在FIFO队列中的后面,因此必须等前面的数据被读出后才能读出该数据,这就会带来时延。在进行芯片架构设计时,会常常用到异步FIFO进行跨时钟域数据传递,而有时采用简单的握手机制就可以进行跨时钟域的数据传递,这有利于减少延迟。

芯片的时钟频率也会直接影响时延,对于同一个电路来说,时钟频率高时,可以更迅速地进行数据处理和操作。以PCIe交换电路为例,其目标是使输入的数据包快速地被交换到输出端。此时,使用高频内部时钟可以提高数据包转发速度并能够降低时延。

在以太网交换电路或PCIe交换电路中,可以使用直接透明分组转发模式替代存储转发模式来降低时延。目前,在大多数应用中,数据以包的形式进行转发。在以太网交换电路中,当数倨包到达输入端后,先存储在缓冲区中。由于以太网帧中的CRC校验域在帧的末尾,在 接收数据的过程中,本地CRC校验电路一边接收数据,一边进行CRC校验计算,当完整的帧接收完毕后,将本地的CRC计算结果和接收的校验结果进行比较,如果二者相同,则接收此帧;如果不同,则丢弃此帧。

根据CRC校验的工作机制,只有一个帧被完整地接收后才可以判断该帧是否存在错误,因此接收延迟与帧长有直接关系。采取存储转发机制时,对整个交换机而言,数据帧从输入到输出的时延与帧长冇关,对于整个系统而言,端到端的延迟还与数据帧所经过的交换机数量有关。

采用直接透明分组转发模式时,交换电路可以在包到达输入端的时候就开始进行转发,这样可以大大降低时延。采用这种方式时,如果发生了CRC校验错误应该怎样处理呢?此时,可以将CRC检错功能放到终端中进行,当链路误码率非常低时,这种工作方式可以有效地降 低延迟。

降低时延还有许多其他的方法,下面介绍其中的一种。例如,CPU需要读取存储器中从地址8到地址15的8字节数据。考虑到读取的效率,存储器控制器从存储器中连续取64字节(1个cache line),而不是8字节。此时,存储器控制器从地址0到地址63连续读出了64字节的数据。此后,存储器控制器可以将地址0到地址63的64字节交给CPU如果CPU希望快速读取字节8~15,存储器控制器可以从地址8开始读取数据,当地址到达63后,再读出地址0到地址7所存储的数据。