多处理器系统上的分散-收集智能存储器体系结构的制作方法

文档序号:6609293阅读:282来源:国知局
专利名称:多处理器系统上的分散-收集智能存储器体系结构的制作方法
技术领域
本公开涉及微处理器系统,具体来说,涉及微处理器系统中的存储器体系结构。
背景技术
对主存储器(外部存储器)的存取等待时间滞后于处理器速度的提高,从而产生性能瓶颈。为了减少存取等待时间,许多处理器包括根据空间和时间局部性保存从主存储器取出的大毗邻数据块(高速缓存行)的集成于芯片上的高速缓存。空间局部性是引用数据的可能性在其附近的数据刚被引用过时较高的概念。时间局部性是在一个时间点被引用的数据可能在不久以后的某个时间再次被引用的可能性。
虽然许多应用具有呈现时间和空间局部性的数据存取模式,但是也存在具有不呈现时间和空间局部性的数据存取模式的应用类。例如,一些多媒体应用、数据库和信号处理应用不呈现高度的时间和空间局部性。另外,许多数据密集应用中使用的某些步幅存取模式和间接存取模式不呈现高度的时间和空间局部性。
传统高速缓存体系结构中的芯片外通信是低效的,因为数据管理由高速缓存行来确定大小。如果数据存取模式不呈现空间局部性,则实际上仅使用高速缓存行的一小部分,并且浪费了用于存取高速缓存行的其它部分的存储器带宽。另外,由于数据缓冲还基于整个高速缓存行,所以高速缓存的效率低,从而引起更多高速缓存未命中以及更多芯片外通信。
另外,传统处理器体系结构没有利用存储器存取的并行性。为了预备计算的操作数,即,指令所操作的值,处理器可能引起大开销,例如,除实际存储器存取之外还有地址计算和数据格式转换。虽然纯粹的存储器等待时间是性能瓶颈的一个原因,但是存储器存取开销也增加了存取等待时间。

发明内容
根据本发明的一个方面,提供一种装置,包括处理器;高速缓存,耦合到所述处理器,采用高速缓存行大小的传送在所述高速缓存与芯片外存储器之间传送数据;以及所述处理器可访问的分散/收集引擎,所述分散/收集引擎能够生成对所述芯片外存储器的子高速缓存行大小的数据存取,以便直接从/向所述芯片外存储器读取/写入子高速缓存行大小的数据,供所述处理器使用。
在本发明的装置的一个实施例中,所述分散/收集引擎还包括访问处理器,能够为所述存储器存取计算存储地址并执行数据格式转换。
在本发明的装置的一个实施例中,所述分散/收集引擎还包括流端口,耦合到所述处理器,所述流端口包括能够存储所述访问处理器和所述处理器可访问的有序数据的缓冲器。
在本发明的装置的一个实施例中,所述分散/收集引擎还包括高速缓存接口,耦合到所述高速缓存,当通过所述高速缓存以及所述分散/收集引擎存取相同数据时,所述高速缓存接口结合所述高速缓存来提供数据相干性。
在本发明的装置的一个实施例中,还包括存储控制器,耦合到所述分散/收集引擎和所述芯片外存储器,所述存储控制器支持对所述芯片外存储器的高速缓存行以及子高速缓存行大小的存取。
在本发明的装置的一个实施例中,所述访问处理器还包括存取模式生成器,用于根据编程定义模式来生成存储器存取。
在本发明的装置的一个实施例中,所述访问处理器还包括存取模式生成器,用于根据基于步幅的存取模式来生成存储器存取。
在本发明的装置的一个实施例中,所述访问处理器还包括存取模式生成器,用于根据间接存取模式来生成存储器存取。
根据本发明的另一方面,提供一种方法,包括在高速缓存与芯片外存储器之间传送高速缓存行大小的数据;以及由分散/收集引擎生成对所述芯片外存储器的子高速缓存行大小的数据存取,以便直接从/向所述芯片外存储器读取/写入子高速缓存行大小的数据,供处理器使用。
在本发明的方法的一个实施例中,在通过所述高速缓存以及所述分散/收集引擎来存取相同数据时,数据相干性得到增强。
在本发明的方法的一个实施例中,数据相干性经由所述分散/收集引擎中的缓冲器中的或所述高速缓存中的数据的互斥来增强。
在本发明的方法的一个实施例中,所述数据相干性经由目录中的地址范围检查来增强。
在本发明的方法的一个实施例中,生成还包括为所述存储器存取计算存储地址;以及执行数据格式转换。
在本发明的方法的一个实施例中,还包括在所述分散/收集引擎中分配流端口;以及通过所分配的流端口存取数据。
在本发明的方法的一个实施例中,还包括把所述分散/收集引擎中的流端口分配给所述处理器中的线程;响应线程上下文切换,在所述流端口中存储的写数据已经写入所述存储器之后,释放所述流端口。
在本发明的方法的一个实施例中,生成还包括根据程序定义模式为所述存储器存取计算存储地址。
根据本发明的又一方面,提供一种包括具有关联信息的机器可访问媒体的产品,其中,所述信息在被存取时,使机器执行在高速缓存与芯片外存储器之间传送高速缓存行大小的数据;以及由分散/收集引擎生成对所述芯片外存储器的子高速缓存行大小的数据存取,以便直接从/向所述芯片外存储器读取/写入子高速缓存行大小的数据,供处理器使用。
在本发明的产品的一个实施例中,生成还包括为所述存储器存取计算存储地址;以及执行数据格式转换。
在本发明的产品的一个实施例中,还包括在所述分散/收集引擎中分配流端口,以便处理子高速缓存行大小的数据;以及通过所分配的流端口来引导对存储器的存取。
在本发明的产品的一个实施例中,还包括把所述分散/收集引擎中的流端口分配给所述处理器中的线程;以及响应线程上下文切换,在所述流端口中存储的写数据已经写入所述存储器之后,释放所述流端口。
在本发明的产品的一个实施例中,计算还包括根据基于步幅的模式来生成存储器存取地址。
在本发明的产品的一个实施例中,计算还包括根据间接模式来生成存储器存取地址。
根据本发明的再一方面,提供一种系统,包括动态随机存取存储器(DRAM);处理器;高速缓存,耦合到所述处理器,采用高速缓存行大小的传送在所述高速缓存与DRAM之间传送数据;以及所述处理器可访问的分散/收集引擎,所述分散/收集引擎能够生成对所述DRAM的子高速缓存行大小的数据存取,以便直接从/向所述DRAM读取/写入子高速缓存行大小的数据,供所述处理器使用。
在本发明的系统的一个实施例中,在通过所述高速缓存以及所述分散/收集引擎来存取相同数据时,数据相干性得到增强。
在本发明的系统的一个实施例中,还包括存储控制器,耦合到所述高速缓存接口和所述DRAM,所述存储控制器支持对所述DRAM的高速缓存行以及子高速缓存行大小的存取。


通过阅读以下详细说明并参照附图,要求权益的主题的实施例的特征会变得非常明显,附图中相似的标号表示相似部件,以及附图中图1是根据本发明的原理、用于处理非结构化流式数据的多核心处理器的一个实施例的框图;图2是框图,说明提供图1所示的多核心处理器中的计算处理器与访问处理器之间的通信机制的多个流端口;图3是用于管理和访问图2所示的流端口的任一个的方法的一个实施例的流程图;图4和图5是包括具有可编程引擎的访问处理器的分散/收集引擎的实施例的框图;图6和图7是可包含在图1所示的访问处理器中的存取模式生成器的实施例的框图;以及图8是支持高速缓存行大小的数据传送以及子高速缓存行大小的数据传送的存储系统的一个实施例的框图。
虽然以下详细描述将参照要求权益的主题的说明性实施例进行,但是,本领域的技术人员会非常清楚许多备选方案、修改及变更。因此,意图是所要求权益的主题被广义地看待,并且仅如所附权利要求所阐述的来定义。
具体实施例方式
根据本发明的一个实施例的系统捕捉无规律数据存取模式,以便优化存储器等待时间和带宽。系统还减小与存储器存取关联的指令开销,其中包括地址计算和数据格式转换。在一个实施例中,快速窄多通道存储控制器通过支持有效的分散/收集操作来节省芯片外带宽。
虽然高速缓存一般在捕捉普通存储器存取模式时是高效的,但是它们无法捕捉无规律的存取模式。根据本发明的原理的存储系统的一个实施例包括传统高速缓存和分散/收集引擎,它们配合以捕捉两种类型的存储器存取模式。此外,对于无规律的存取模式,存储器存取开销可推卸给分散/收集引擎以加速计算。这个独立的分散/收集引擎也可在计算处理器请求数据之前开始从存储器取数据,从而高效地预取数据。如果相同的数据由高速缓存以及分散/收集引擎来存取,则数据相干性得到增强。
图1是根据本发明的原理、用于处理非结构化流式数据的多核心处理器100的一个实施例的框图。多核心处理器100具有多个核心102、102N,其中各核心102包括用于执行数据计算的处理器(“计算处理器”)104。各核心102还包括与传统高速缓存分级结构集成的分散/收集引擎组件。在一个实施例中,分散/收集引擎组件包括高速缓存接口106、访问处理器110和流端口112。在一个实施例中,各核心102具有由单级高速缓存(“L1高速缓存”)108组成的高速缓存分级结构。
存储器带宽节省在大量核心共用具有有限带宽的公共存储接口的多核心处理器中是重要的。通过允许以非结构化存取模式来存取数据,分散/收集引擎150与存储控制器116结合来减少对主存储器118的芯片外存储器带宽使用。例如,数据存取可能是子高速缓存行大小的数据传送。除减少带宽使用之外,分散/收集引擎的一个实施例还是完全可编程的,具有硬件相干性,可隐藏存储器存取等待时间,并且可使存储器存取开销与计算交迭。
多核心处理器100可包括在核心102、102N之中共用的一级或多级高速缓存。在一个实施例中,核心102、102N共用单级高速缓存(“L2高速缓存”)114。
多核心处理器100还包括多通道存储控制器116。多通道存储控制器116支持高速缓存行大小的数据传送、即向/从高速缓存的大顺序存取以及流端口112的分散/收集操作所需的对芯片外(晶片外、板载、外部或主)存储器118的随机小粒度数据传送。主存储器118可能是Rambus动态随机存取存储器(RDRAM)、双倍数据速率动态随机存取存储器(DDR RAM)、同步动态随机存取存储器(SDRAM)或者任何类似类型的存储器。
流端口112包括数据缓冲器、到计算处理器104的接口、到访问处理器110的接口以及到高速缓存接口106的接口。流端口112中的数据缓冲器提供计算处理器104与访问处理器110之间的通信机制。
访问处理器110耦合到流端口112和高速缓存接口106,并根据存取模式生成存储地址。访问处理器110可以是可编程引擎或者硬连线逻辑。硬连线逻辑支持有限类的存取模式,而可编程引擎则具有适应任何存取模式的灵活性。
高速缓存接口106耦合到流端口112、访问处理器110和存储控制器116,并提供高速缓存108、114与流端口112之间的数据相干性。高速缓存接口106还提供到多通道存储控制器116的接口。
各计算处理器104具有两种存储器存取方法一种是通过高速缓存分级结构(L1高速缓存(专用高速缓存)108到第2级(L2)高速缓存(共用高速缓存)114到主存储器118),以及另一种是通过分散/收集引擎150(流端口112、访问处理器110和高速缓存接口106)到主存储器118。多通道存储控制器116向高速缓存以及流端口112提供到主存储器118的接口。
为了避免浪费存储器带宽,分散/收集引擎根据存取模式仅传送和缓冲所需数据大小(称作子高速缓存行大小的数据存取)而不是整个高速缓存行。此外,存储器存取开销和等待时间通过把存储器存取与数据计算分离来卸载,其中访问处理器110预备操作数,同时计算处理器104执行计算。
为了执行计算操作数的函数,计算处理器104分配流端口112,并初始化访问处理器110。流端口112提供计算处理器104与访问处理器110之间的通信机制。对于从存储器118进行的读操作,访问处理器110收集来自存储器118的数据,并把数据流提供给计算处理器104。对于向存储器118进行的写操作,计算处理器104写入数据流,以及访问处理器110把数据分散到存储器118。在一个实施例中,数据以先进先出(FIFO)顺序放入流端口112。
根据本发明的一个实施例,由分散/收集引擎执行的分散/收集技术是不呈现空间或时间局部性的数据密集应用的应用特定优化。不是采用高速缓存来捕捉空间和时间局部性,分散/收集引擎而是采用模式局部性。模式局部性是由应用定义的存储器存取模式。应用明确定义存取模式,并把它传递给利用存取模式的分散/收集引擎。各流端口112和访问处理器110包括存储执行给定分散/收集操作所需的信息的内部寄存器。这种方法比高速缓存更为主动,因为它明确传递数据存取模式而不是依靠数据的空间或时间局部性。因此,分散/收集技术是可为具有极少空间局部性和/或极少时间局部性的应用提供性能改进的应用特定优化。由于地址计算被推卸给访问处理器,因此还可向具有用于执行地址计算的高开销的应用提供性能利益。
可获益于分散/收集引擎的应用的一个实例是采用步幅存取模式、例如矩阵乘法的应用。
计算处理器104和访问处理器112可用来提高矩阵乘法的性能,其中访问处理器112执行变址计算,以及计算处理器104执行乘法。计算C=A×B的三个矩阵A、B、C的矩阵乘法的函数的一个实例如下所示。该函数假定所有矩阵(A、B和C)已经初始化。
MatrixMultiply(){//矩阵int A[N][M],B[M][L],C[N][L];//C=A*Bfor(i=0;i<N;i++)for(j=0;j<L;j++)for(k=0;k<M;k++)C[i][i]+=A[i][k]*B[k][j];}在以上所示的MatrixMultiply函数中,该函数可分为两个独立函数,第一个函数是计算操作数的地址并取操作数,即C[i][j]、A[i][k]和B[k][j],第二个函数是对操作数执行计算,即A×B。第二个函数(计算)在计算处理器104中执行,以及第一个函数(分散/收集操作)在访问处理器110中执行。
首先,计算处理器104分配流端口112,并把存取模式映射到所分配流端口112。随后,访问处理器110运行存储器存取处理机(软件或硬件)以执行分散/收集操作,并把数据放入流端口112。同时,计算处理器104通过流端口112访问数据。最后,在完成存取模式之后,计算处理器104释放流端口112。
在MatrixMultiply函数中,矩阵B可能是最优化的,因为它包含步幅存取、即逐列存取。步幅存取模式数据结构(例如下面所示的STRIDE_ACCESS_PATTERN)被分配和配置用于矩阵B,并存储在分散/收集引擎中。步幅存取模式结构包括预先定义的字段,例如结构的大小(AccessPatternSize)、到访问处理器的处理机函数的指针(*Handler)和读/写标记(Read/Write)。步幅存取模式数据结构中的其它字段是模式相关的。对于这个模式,定义矩阵的起始地址(StartAddress)、数据元素的大小(ElementSize)、行和列的大小(RowSize,ColumnSize)以及用于该模式的存取重复数量(Repeat)。
//步幅存取模式数据结构struct STRIDE_ACCESS_PATTERN{unsigned AccessPatternSize;void(*Handler)(STREAM_PORT,ACCESS_PATTERN);bool ReadWrite;unsigned StartAddress;//&B
unsigned ElementSize; //sizeof(int)unsigned RowSize; //Lunsigned ColumnSize; //Munsigned Repeat; //N}在步幅存取模式已经在分散/收集引擎中初始化之后,矩阵乘法函数可修改为采用访问处理器110以及计算处理器104。在计算处理器104上运行并采用分散/收集引擎来计算操作数的地址并取操作数的矩阵相乘函数的一个实施例如下面所示。
MatrixMultiply(){//矩阵int A[N][M],B[M][L],C[N][L];//流端口STREAM_PORT PortB;//开启端口PortB=OPEN_PORT(WAIT);//配置端口CONFIGURE_PORT(PortB,STRIDE_ACCESS_PATTERN(sizeof(STRIDE_ACCESS_PATTERN),StrideHandler,READ,&B
,sizeof(int),L,M,N));//C=A*Bfor(i=0;i<N;j++)for(j=0;j<L;j++)for(k=0;k<M;k++)C[i][j]+=A[i][k]*ReadPort(PortB);//关闭端口CLOSE_PORT(PortB);}流端口112通过等到端口被分配的“OPEN_PORT”指令对于‘PortB’开启。在分配端口之后,通过如上所述把步幅存取模式参数加载到步幅存取模式数据结构中来配置端口。然后,流端口112通过“CONFIGURE_PORT”指令采用步幅存取模式来配置。在这个实施例中,portB初始化为把数据从主存储器118传送到计算处理器104的读取端口。
数据计算通过ReadPorr在‘PortB’上而不是在矩阵B上执行。当矩阵乘法完成时,‘PortB’通过‘CLOSE_PORT’关闭,以便释放已分配资源供另一个端口使用。
‘MatrixMultiply()’函数在计算处理器104上运行,同时以下所示的‘StrideHandler()’函数在访问处理器110上运行。StrideHandler()函数在访问处理器110上运行以执行分散/收集操作。处理机与具体模式关联。在这个实例中,处理机采用两个输入参数,即端口和模式。‘端口’指定到计算处理器104的通信通道(流端口),以及模式提供存取模式信息。根据来自在存取模式数据结构中定义的存取模式的信息,StrideHandler()函数通过计算存储地址,读取所计算存储地址处存储的数据,并把读出的数据(值)写入流端口供计算处理器104使用,获得由计算处理器104运行的MatrixMultiply函数的操作数。
void StrideHandler(STREAM_PORT Port,ACCESS_PATTERN Pattern){//逐列存取for(k=0;k<Pattern.Repeat;k+-)for(i=0;i<Pattern.RowSize;i++)for(j=0;j<Pattern.ColumnSize;j++){//从存储器读取Value=ReadMemory(Pattern.StartAddress+(i+j*Pattern.RowSize)*Pattern.ElementSize);//写入端口WritePort(Port,Value);}}访问处理器110生成地址序列,并经由ReadMemory指令将其传递给高速缓存接口106。高速缓存接口106把数据引入流端口112。如果数据已经驻留在L1高速缓存108、L2高速缓存114或者另一个流端口112中,则高速缓存接口106从对应的高速缓存或流端口112中获得数据。否则,多通道存储控制器116从主存储器118获得数据。最后,计算处理器104根据端口被初始化为读取端口还是写入端口通过流端口112读取或写入数据。
在所示实施例中,可编程访问处理器运行以上表示为‘StrideHandler()’的存储器存取软件。但是,在其它实施例中,与‘StrideHandler()’相同的功能性可实现为硬连线逻辑。可编程访问处理器提供支持许多存取模式的灵活性,而硬连线逻辑则以降低的灵活性为代价来提供更高的性能和功率效率。
在一个实施例中,流端口112支持流式数据存取模型。在流式数据存取模型中,在数据被存取之后,立即从流端口112中的缓冲器中被丢弃(在读操作的情况中),或者回写到存储器118中(在写操作的情况中)。
数据相干性问题可在高速缓存分级结构与流端口112之间出现。例如,计算处理器104可在数据被缓冲在高速缓存分级结构中的同时通过流端口112存取相同数据,或者计算处理器104可在数据被缓冲在流端口中的同时通过高速缓存分级结构来存取数据。
数据相干性通过增强互斥来支持。高速缓存接口106通过高速缓存分级结构以及流端口112来监视存储器存取,并采取相应的相干动作。如果存在通过高速缓存分级结构存取数据的请求,则从流端口112中使相同的数据无效。类似地,如果存在通过流端口112存取数据的请求,则在高速缓存分级结构中使相同的数据无效。因此,数据相干性得到保证,因为有效数据只能存储在高速缓存分级结构中或者存储在流端口112中的缓冲器中。
在一个实施例中,基于目录的相干性协议被修改为把流端口112看作是另一个高速缓存,并相应地维护目录项。对于读取未命中,查询目录以便查找数据的当前所有者,从其得到最近的数据。对于写入未命中,查询目录以便查找数据的副本的全部所有者。使副本无效并获得所有权。
用于使高速缓存中的数据无效的方法与传统的基于目录的协议中相同。但是,使流端口112中的数据无效由于流式数据组织而需要与高速缓存不同的机制。首先,高速缓存把数据保存在高速缓存行大小的粒度,因此标签开销是可容许的。但是,由于流端口112以字节粒度来管理数据,所以,在最坏情况下,标签开销极大。其次,数据以先进先出(FIFO)顺序放入流端口112。因此,流端口112需要对相干性动作进行完全关联搜索,因为对应的数据可能位于流端口112中的数据缓冲器内的任何位置。用于完全关联搜索的逻辑在物理上很大,并且消耗比较简单搜索多得多的功率。因此,高速缓存之类的失效机制对于流端口112太昂贵。例如,具有1KB数据缓冲器的流端口112的高速缓存之类的失效机制通常需要8KB的标签(每1字节数据64位地址标签)以及用于执行1024个并发比较(对于1K条目的全面搜索)的逻辑。
假定大多数程序或者通过高速缓存或者通过流端口112而不是通过它们两者来存取给定数据项,即,程序不会并发地在高速缓存与流端口112之间频繁传递数据,不是每个数据元素保持一个地址标签,而是每个流端口112的地址范围被保持在流端口112上以及在所有级的共用高速缓存上,在所示实施例中只是L2高速缓存114。地址范围跟踪当前在流端口112中缓冲的地址的下限和上限。每当流端口112存取数据时,地址范围在必要时扩充到包含新的数据项。例如,如果流端口112以0x10、0x09、0x05和0x07的顺序访问地址,则用于流端口112的地址范围从(0x10,0x10)改变为(0x09,0x10)、改变为(0x05,0x10)以及改变为(0x05,0x10)。当共用高速缓存、在所示实施例中只是L2高速缓存114确定一段数据的所有者集合时,它们把数据的地址与所有流端口112的地址范围进行比较。具有匹配范围的所有流端口112都被认为是数据的副本的所有者。当流端口112得到失效请求时,所请求地址与地址范围进行比较。如果存在匹配,则使整个流端口112无效,而不只是对应的数据。
图2是框图,说明用于提供图1所示的多核心处理器100中的计算处理器104与访问处理器110之间的通信机制的多个流端口。流端口112_1、...112_N中的每个包括流端口上下文和数据缓冲器。流端口上下文保持用于流端口112的控制信息,以及数据缓冲器临时存储数据。
提供指令和库函数的集合以便管理及访问图2所示的流端口112_1、...112_N中的任一个。
流端口112的操作类型可通过表明操作类型是读还是写的“Port_Type”的状态来表明。在一个实施例中,对于具有读操作类型的流端口,计算处理器104可仅执行‘port_read’指令,而访问处理器110可仅执行‘port_write’指令。对于具有写操作类型的流端口112,相反的限制适用。同步在‘port_read’和‘port_write’指令中是隐含的。例如,如果在流端口112中没有数据准备就绪则‘port_read’指令停止,而如果在流端口112中没有空的空问,则‘port_write’指令停止。
在一个实施例中,各流端口112中的数据缓冲器是双端口的,从而允许计算处理器104和访问处理器110同时读或写。支持不同大小的数据存取,例如1、2、4、8和16字节。可执行诸如大小扩充、零扩充、截取或饱和之类的数据格式转换。
流端口112和访问处理器110可由操作系统管理。例如,操作系统可维护资源表以跟踪空闲资源列表,并且表明哪一个计算处理器104已经分配特定流端口112和访问处理器110。
提供开启和关闭流端口112的函数(指令)以允许用户应用分配(开启)或释放(关闭)特定流端口112和访问处理器110。还可提供指令以便提供数据保护以及管理访问处理器110。
没有保证流端口112和访问处理器110的可用性。因此,当发出分配端口的指令(open_port)时,用户应用可等到流端口112和访问处理器110可用,或者可在接收到流端口112不可用的指示时通过高速缓存而不是流端口112来存取存储器。
当流端口112被分配给计算处理器104时,与流端口112关联的进程标识符(ID)被设置成与计算处理器104的进程ID相同。各流端口112具有用于存储与流端口112关联的进程ID的内部寄存器。进程ID可通过使用‘port_set_id’指令来设置。
数据保护通过使用进程ID来提供。防止计算处理器104访问不正确的流端口,因为对流端口112读和写数据的指令(port_read、port_write)仅在计算处理器104的进程ID和流端口112中的内部寄存器中存储的进程ID匹配时才是有效的。
资源表可用来定位已经分配给特定计算处理器104的访问处理器110。当例如通过专门指令(ap_launch)配置访问处理器110时,访问处理器的内部寄存器被初始化,并且程序计数器采用处理机的地址(或者函数指针)来初始化。因此,计算处理器104可能仅在已经分配给计算处理器的访问处理器110上运行处理机,由此提供访问处理器级保护。
访问处理器110可访问的存储地址可限制到与访问处理器110和流端口112关联的计算处理器104可访问的那些存储地址。存储地址限制可由地址翻译机构根据进程ID来执行。可提供指令、例如‘ap_set_id’以便设置访问处理器110的进程ID。
计算处理器104可能是多线程的,其中各线程具有其自己的上下文、即程序计数器和线程本地寄存器。各线程具有可能是不活动、正运行、准备运行或睡眠的关联状态。当计算处理器104的线程被切断、即存在上下文切换时,用于那个线程的所有已分配流端口112和访问处理器110也被释放。随后当该线程重新接入时,再次分配流端口112和访问处理器110。提供指令(port_context_in、port_context_out)用于执行上下文切换。这些指令保存或加载流端口上下文。
为了切断线程、即执行上下文切换,对流端口的每个发出‘port_context_out’指令,以及对于分配给该线程的访问处理器110的每个发出‘ap_context_out’指令。然后更新资源表。
对于写入端口,上下文切换在流端口112中的数据元素被写入存储器之后执行。在一个实施例中,‘port_context_out’指令把流端口的所有内部寄存器值写入存储器,以及‘ap_context_out’指令把访问处理器的所有内部寄存器值写入存储器。
为了接入线程,检查资源表以确定所需流端口和访问处理器是否可用。如果是,则分配流端口和访问处理器。对于每个已分配流端口发出‘port_context_in’指令,以及对于访问处理器的每个发出‘ap_context_in’指上下文切换指令仅存储和加载存取模式信息、即控制信息。对于写入端口,当上下文切换发生时,缓冲器始终为空,如前面所述。对于读取端口,在上下文切换时被丢弃的数据在上下文重新接入时被重取。
线程迁移由类似机制处理。如果线程从一个计算处理器104迁移到另一个计算处理器104N,则流端口和访问处理器全部从旧的计算处理器104N中释放。新的资源在另一个计算处理器104N中被分配。如果所需资源在另一个计算处理器104N中不可用,则线程可能从计算处理器104切断。线程则以挂起状态在另一个计算处理器104N中等待。
图3是用于管理和访问图2所示的流端口的任一个的方法的一个实施例的流程图。
在框300,发出‘open_port’指令以便分配流端口。处理在框302继续进行。
在框302,当发出‘open_port’指令以分配端口时,没有保证流端口112和访问处理器110的可用性。因此,‘open_port’指令可包括等待可用流端口的时间周期。在接收到流端口可用的指示时,处理继续进行框304。如果流端口不可用,则处理继续进行框312以便通过高速缓存而不是流端口112来存取存储器。
在框304,在流端口112被分配给计算处理器104之后,流端口112的进程标识符(ID)被设置成与计算处理器104的进程ID相同。各流端口112具有用于存储与流端口112关联的进程ID的内部寄存器。例如,可发出‘port_set_id’指令以便采用拥有已分配流端口112的进程的标识符来设置进程标识符字段。
在框306,在流端口112已经被分配并且端口ID已经设置之后,可发出‘port_read’和‘port_write’指令,以便通过流端口而不是通过高速缓存分级结构分别读取和写入数据。数据保护通过使用进程ID来提供,如上所述。
在框308,如果从计算处理器104接收到例如通过‘close_port’指令关闭流端口的请求,则处理继续进行框310。如果没有接收到请求,则处理继续进行框306,以便处理通过流端口导向的读或写请求。
在框310,流端口关闭,并释放已分配资源。
在框312,对于流端口的请求被拒绝。编程人员具有两种选择等待并重试,或者使用高速缓存分级结构来代替流端口。
图4和图5是包括具有可编程引擎的访问处理器的分散/收集引擎400、500的实施例的框图。可编程引擎具有适应任何存取模式的灵活性,并且在需要支持许多不同存取模式时是有用的。在图4所示的实施例中,分散/收集引擎包括流端口112、访问处理器110和高速缓存接口106。
参照图4,计算处理器104可以是包括对前面所述流端口指令的支持的任何传统处理器。访问处理器110是可编程引擎或者对于地址计算和存储器存取进行优化的专用处理器。在一个实施例中,访问处理器110不包括算术单元、如乘法器或除法器,但包括多个加法器或移位器,以便进行快速地址计算。
访问处理器110收集从主存储器118读取的数据,并把它转发给计算处理器,以及把从计算处理器104接收的数据分散到主存储器118。因此,访问处理器110具有两个数据存取接口,一个用于计算处理器104以及另一个用于主存储器118。与计算处理器104的接口是通过流端口112,以及到存储器的接口是通过多通道存储控制器116。访问处理器110向主存储器118发出分散/收集加载和存储请求(‘sg_load’、‘sg_store’)以便执行分散/收集操作。分散/收集加载和存储请求利用多通道存储控制器116所支持的子高速缓存行粒度数据传送。例如,响应从流端口112接收的‘port_read’请求,访问处理器向存储器生成‘sg_load’请求以便以子高速缓存行大小存取数据。
来看图5,在这个实施例中,图4所示的访问处理器110的功能以在并发多线程(SMT)处理器502中运行的访问线程504实现。SMT处理器502运行计算线程506以及访问线程504。在另一个实施例中,可使用芯片级多处理(CMP)体系结构处理器上的多个核心,使得计算线程506在一个核心上运行,以及访问线程504在另一个核心上运行。这个实施例采用‘port_read’和‘port_write’指令,并且还包括具有由访问线程504用于通过高速缓存接口执行分散/收集存储器存取的分散/收集加载和存储指令(‘sg_load’、‘sg_store’)的存储单元508。
当存取模式的数量受到限制时,专用存取模式生成器可包含在访问处理器110中。图6和图7是可包含在图1所示的访问处理器110中用于优化地址计算的存取模式生成器的实施例的框图。
参照图6,说明可包含在图1所示的访问处理器中的存取模式生成器600的一个实施例。存取模式生成器600专用于可访问不连续地址的步幅存取模式,例如1、5、9、...。两个内部寄存器(基址寄存器602、步幅寄存器604)由计算处理器104对于具体存取模式设置。‘基址寄存器’602存储第一数据元素的虚拟存储地址,以及‘步幅寄存器’604存储相继的存储元素之间的步幅。例如,对于步幅存取模式1、5、9,步幅为4。地址计算器606通过把基址寄存器602的内容与步幅寄存器604的内容相加,来计算虚拟存储地址。翻译后备缓冲器(TLB)608用于把虚拟存储地址翻译成物理存储地址。
例如,基址寄存器602可初始化为0xF0000,以及步幅寄存器初始化为4,地址计算器通过把4加至0xF0000来计算下一个地址,并输出虚拟存储地址0xF0004、0xF0008、0xF000C等。
来看图7,说明地址生成器的另一个实施例。地址生成器700生成间接存取模式。不是直接计算地址。而是,计算处理器104采用变址向量的地址来初始化‘变址寄存器’702。然后,存储接口704把存储器中存储的变址向量元素加载到‘地址寄存器’706中。最后,TLB708把从地址寄存器706接收的虚拟地址翻译成物理地址。
例如,稀疏矩阵密集向量乘法是可采用间接存取模式的应用的一个实例。下面所示的函数执行稀疏矩阵密集向量乘法。函数计算C=A×B,其中,A为稀疏矩阵,以及B和C是密集向量。
SparseMatrixDenseVectorMultiply(){//A压缩行存储格式的稀疏矩阵//B,C密集向量int Arow[N],Acol[NonZero],Adata[NonZero];int B[N],C[N];//C=A*Bfor(i=0;i<N;i++)for(j=Arow[i];j<Arow[i+l];j++)C[i]+=A[j]*B[Acol[j]];}为矩阵B的间接存取模式建立间接存取模式数据结构,如下面所示。模式数据结构与前面所述的步幅存取模式相似,但是在此例中,间接存取模式数据结构定义数据向量的起始地址(DataAddress)、变址向量的起始地址(IndexAddress)、数据元素的大小(ElementSize)和流长度(StreamLength)。
//间接存取模式数据结构struct INDIRECT_ACCESS_PATTERN{unsigned AccessPatternSize;void(*Handler)(STREAM_PORT,ACCESS_PATTERN);bool ReadWrite;unsigned DataAddress;//&Bunsigned IndexAddress; //&Acolunsigned ElementSize;//sizeof(int)unsigned StreamLength; //NoneZero}下面所示的样本代码可在计算处理器104上运行,并且是稀疏矩阵密集向量乘法代码的分散/收集版本。
SparseMatrixDenseVectorMultiply(){//矩阵和向量int Arow[N],Acol[NonZero],Adata[NonZero];int B[N],C[N];//流端口
STREAM_PORT PortB;//开启端口PortB=OPEN_PORT(WAIT);//配置端口CONFIGURE_PORT(PortB,INDIRECT_ACCESS_PATTERN(sizeof(INDIRECT_ACCESS_PATTERN),IndirectHandlcr,READ,&B,&Acol,sizeof(int),NonZero));//C=A*Bfor(i=0;i<N;i++)for(j=Arow[i];j<Arow[i+1];j++)C[i]+=A[j]*ReadPort(PortB);//关闭端口CLOSE_PORT(PortB);}下面所示的‘IndirectHandler()’函数可在访问处理器110上运行。在一个实施例中,图7所示的硬连线逻辑执行相同操作。‘IndirectHandler()’函数加载变址值,计算数据地址,读取存储器,并把值写入流端口112。
void IndirectHandler(STREAM_PORT Port,ACCFSS_PATTERN Pattern){//间接存取for(i=0;i<PatternStreamLength;i++){//计算变址Index=ReadMemory(Pattern.IndexAddress+i);//从存储器读取Value=ReadMemory(Pattern.DataAddress+(Index*Pattern.ElementSize));//写入端口WritePort(Port,Valuc);}}再来看图1,高速缓存接口106提供高速缓存(L1高速缓存108、L2高速缓存114)与流端口之间的数据相干性。在访问处理器110计算地址之后,它请求高速缓存接口106把数据加载到流端口112或者存储来自流端口112的数据。在图1所示的存储器分级结构中,要读取的目标数据或者要写入的目标缓冲器可设置在本地核心102的L1高速缓存、远程核心102N的L1高速缓存108N、共用L2高速缓存114中或者在主存储器118中。另外,目标数据还可位于本地核心106的流端口112中或者远程核心106N的流端口112N中。高速缓存接口106识别正确的目标位置。
当计算处理器104通过高速缓存加载或存储数据时发生类似情况。目标位置可能在本地核心102的L1高速缓存108、远程核心102N的L1高速缓存108N、L2高速缓存114、主存储器118、本地核心102的流端口112或者远程核心102N的流端口112N中。在传统的多处理器系统中,高速缓存相干性协议使计算处理器104能够采用必要的访问许可获得数据的最新副本。但是,由于流端口112的添加,相干性协议扩展为支持高速缓存与流端口之间的数据相干性。
在一个实施例中,高速缓存接口直接连接到多通道存储控制器116。对于对流端口112的每个请求,高速缓存接口106向多通道存储控制器116发出请求,并从主存储器118加载数据/向主存储器118存储数据,而不管实际目标位置。
例如,如果核心102通过高速缓存108写入数据位置,则对应的高速缓存行被以脏独占状态放入高速缓存108。然后,如果核心102N尝试通过流端口112N读取相同的位置,则高速缓存接口106N从主存储器118加载陈旧数据,因为高速缓存106N不知道核心102的L1高速缓存108中有最近的数据。为了防止这种数据不相干性,在核心102N读取数据位置之前,高速缓存行从高速缓存108以及L2高速缓存114被刷新到主存储器118。在由核心102写入高速缓存与由核心102N从流端口112N读取之间执行适当同步。
在另一个实施例中,高速缓存接口106提供完全数据相干性支持。每当计算处理器104访问流端口112时,高速缓存接口106查找最新数据的正确位置。在这个实施例中,核心102N的高速缓存接口106N确定高速缓存108具有最新数据,因此,高速缓存接口106N从高速缓存108而不是从主存储器118获取数据。传统的高速缓存仅对高速缓存而不对流端口112保证数据相干性。例如,如果核心106在核心106N的流端口112N具有相同数据时尝试通过高速缓存读取数据位置,则高速缓存相干性协议经过扩展,使得高速缓存可从核心106N的流端口112N获取数据。
对于通过高速缓存和流端口112、112N同时存取相同数据的应用,即,如果需要高速缓存与流端口112之间进行大量通信,则结合图6和图7所述的访问处理器的实施例可提供比结合图4和图5所述的实施例更好的性能。否则,结合图4和图5所述的访问处理器的实施例更好,因为它们没有承受相干性开销,并且在空间和功率要求方面成本较低。
图8是支持高速缓存行大小的数据传送以及子高速缓存行大小的数据传送的存储系统800的一个实施例的框图。存储空间802分为多个通道806,并且各通道806分为多个存储体808。传统的存储系统、如双倍数据速率动态随机存取存储器(DDR RAM)提供少量宽存储器存取通道。虽然它们对于大高速缓存行大小的数据传送是高效的,但是分散/收集体系结构要求子高速缓存行大小的数据传送。在图8的实施例中,多个通道806被分配给各存储控制器804,以便提供快速窄多通道存储控制器,从而支持有效的分散/收集操作。多通道存储控制器804节省芯片外存储器带宽,并且还减少存储器存取等待时间。分散/收集技术通过以小于常规的粒度存取数据,根据给定存取模式仅允许取有用数据,来提高芯片外带宽效率。
本领域的普通技术人员非常清楚,本发明的实施例中涉及的方法可通过包括计算机可用媒体的计算机程序产品来实施。例如,这样一种计算机可用媒体可包括诸如压缩盘只读存储器(CD ROM)盘或传统ROM装置之类的只读存储装置或者其中存储了计算机可读程序代码的计算机磁盘。
虽然参照本发明的实施例具体说明和描述了本发明的实施例,但是,本领域的技术人员会理解,可对它们进行形式和细节上的各种改变,而没有背离所附权利要求包含的本发明的实施例的范围。
权利要求
1.一种装置,包括处理器;高速缓存,耦合到所述处理器,采用高速缓存行大小的传送在所述高速缓存与芯片外存储器之间传送数据;以及所述处理器可访问的分散/收集引擎,所述分散/收集引擎能够生成对所述芯片外存储器的子高速缓存行大小的数据存取,以便直接从/向所述芯片外存储器读取/写入子高速缓存行大小的数据,供所述处理器使用。
2.如权利要求1所述的装置,其特征在于,所述分散/收集引擎还包括访问处理器,能够为所述存储器存取计算存储地址并执行数据格式转换。
3.如权利要求1所述的装置,其特征在于,所述分散/收集引擎还包括流端口,耦合到所述处理器,所述流端口包括能够存储所述访问处理器和所述处理器可访问的有序数据的缓冲器。
4.如权利要求1所述的装置,其特征在于,所述分散/收集引擎还包括高速缓存接口,耦合到所述高速缓存,当通过所述高速缓存以及所述分散/收集引擎存取相同数据时,所述高速缓存接口结合所述高速缓存来提供数据相干性。
5.如权利要求1所述的装置,其特征在于,还包括存储控制器,耦合到所述分散/收集引擎和所述芯片外存储器,所述存储控制器支持对所述芯片外存储器的高速缓存行以及子高速缓存行大小的存取。
6.如权利要求2所述的装置,其特征在于,所述访问处理器还包括存取模式生成器,用于根据编程定义模式来生成存储器存取。
7.如权利要求2所述的装置,其特征在于,所述访问处理器还包括存取模式生成器,用于根据基于步幅的存取模式来生成存储器存取。
8.如权利要求2所述的装置,其特征在于,所述访问处理器还包括存取模式生成器,用于根据间接存取模式来生成存储器存取。
9.一种方法,包括在高速缓存与芯片外存储器之间传送高速缓存行大小的数据;以及由分散/收集引擎生成对所述芯片外存储器的子高速缓存行大小的数据存取,以便直接从/向所述芯片外存储器读取/写入子高速缓存行大小的数据,供处理器使用。
10.如权利要求9所述的方法,其特征在于,在通过所述高速缓存以及所述分散/收集引擎来存取相同数据时,数据相干性得到增强。
11.如权利要求10所述的方法,其特征在于,数据相干性经由所述分散/收集引擎中的缓冲器中的或所述高速缓存中的数据的互斥来增强。
12.如权利要求10所述的方法,其特征在于,所述数据相干性经由目录中的地址范围检查来增强。
13.如权利要求9所述的方法,其特征在于,生成还包括为所述存储器存取计算存储地址;以及执行数据格式转换。
14.如权利要求9所述的方法,其特征在于,还包括在所述分散/收集引擎中分配流端口;以及通过所分配的流端口存取数据。
15.如权利要求9所述的方法,其特征在于,还包括把所述分散/收集引擎中的流端口分配给所述处理器中的线程;响应线程上下文切换,在所述流端口中存储的写数据已经写入所述存储器之后,释放所述流端口。
16.如权利要求9所述的方法,其特征在于,生成还包括根据程序定义模式为所述存储器存取计算存储地址。
17.一种包括具有关联信息的机器可访问媒体的产品,其中,所述信息在被存取时,使机器执行在高速缓存与芯片外存储器之间传送高速缓存行大小的数据;以及由分散/收集引擎生成对所述芯片外存储器的子高速缓存行大小的数据存取,以便直接从/向所述芯片外存储器读取/写入子高速缓存行大小的数据,供处理器使用。
18.如权利要求17所述的产品,其特征在于,生成还包括为所述存储器存取计算存储地址;以及执行数据格式转换。
19.如权利要求17所述的产品,其特征在于,还包括在所述分散/收集引擎中分配流端口,以便处理子高速缓存行大小的数据;以及通过所分配的流端口来引导对存储器的存取。
20.如权利要求17所述的产品,其特征在于,还包括把所述分散/收集引擎中的流端口分配给所述处理器中的线程;以及响应线程上下文切换,在所述流端口中存储的写数据已经写入所述存储器之后,释放所述流端口。
21.如权利要求18所述的产品,其特征在于,计算还包括根据基于步幅的模式来生成存储器存取地址。
22.如权利要求18所述的产品,其特征在于,计算还包括根据间接模式来生成存储器存取地址。
23.一种系统,包括动态随机存取存储器(DRAM);处理器;高速缓存,耦合到所述处理器,采用高速缓存行大小的传送在所述高速缓存与DRAM之间传送数据;以及所述处理器可访问的分散/收集引擎,所述分散/收集引擎能够生成对所述DRAM的子高速缓存行大小的数据存取,以便直接从/向所述DRAM读取/写入子高速缓存行大小的数据,供所述处理器使用。
24.如权利要求23所述的系统,其特征在于,在通过所述高速缓存以及所述分散/收集引擎来存取相同数据时,数据相干性得到增强。
25.如权利要求23所述的系统,其特征在于,还包括存储控制器,耦合到所述高速缓存接口和所述DRAM,所述存储控制器支持对所述DRAM的高速缓存行以及子高速缓存行大小的存取。
全文摘要
分散/收集技术优化非结构化流式存储器存取,从而通过以精细粒度仅存取有用数据来提供芯片外带宽效率,以及通过支持地址计算、数据混洗和格式转换来卸载存储器存取开销。
文档编号G06F12/08GK101071398SQ20071010631
公开日2007年11月14日 申请日期2007年5月10日 优先权日2006年5月10日
发明者D·金, C·J·休斯, Y·-K·陈, P·昆杜 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1