保证数据缓存与主存储器之间的一致性的制作方法

文档序号:6348894阅读:205来源:国知局
专利名称:保证数据缓存与主存储器之间的一致性的制作方法
技术领域
本发明涉及多线程处理器,并特别地涉及在由多线程访问的缓存存储器与多线程处理器中的主存储器之间的数据非相干(incoherent)的问题。
背景技术
多线程处理器能够同时处理多个不同的指令序列(或线程)。在线程执行期间需要从存储器访问数据和指令。因此,不同的线程可能需要同时访问存储器,并且有时访问存储器的相同部分。为此,在线程之间需要存在某种仲裁以用于存储器访问。如图1所示,多线程处理器典型地具有包含最常访问的数据和指令的数据缓存和指令缓存。如果在这两个缓存中没有找到所需数据或指令,则必须请求在存储器总线上访问存储器。必须控制访问存储器以保证线程不会相互冲突。出于这个原因,根据不同线程从指令和数据缓存到存储器仲裁模块的存储器访问,每个具有他们自己专用的数据路径。图1示出了根据现有技术的多线程处理器中的存储器访问系统的示意图。运行在处理器核心10上的线程能够从数据和指令缓存11、12请求数据和指令。该指令和数据缓存每个具有与其相关联的存储器管理单元。如果请求的数据或指令不在一个缓存中,则该请求传递到存储器总线。为了在从来自不同线程的请求之间做出仲裁,先将请求路由通过线程仲裁器13、14,其中线程仲裁器对线程的请求排序,然后路由到存储器仲裁器15,其中,存储器仲裁器15控制到存储器总线的访问。其中在主存储器中,典型地,数据被以具有固定数量比特的单元(称为缓存行 (cache line))的形式储存并访问。所以,为了从存储器读取存储器地址,必须取出包含该地址的整个缓存行。存在两种缓存行。一种是本地缓存行,该缓存行仅储存用于特定线程的数据。另一个是全局缓存行,该缓存行储存可由不同的线程访问的数据。一条数据是被储存在全局缓存行还是本地缓存行取决于其线性地址。本发明是关于在线程间共享的存储器资源(即,全局缓存行)。全局缓存行可以储存由不同的线程在该缓存行中不同字位置输入的软件本地变量的值。可知,当线程Tx从该缓存行读取其本地变量时,其将取回其上次的写入值。然而, 当使用通过由其他线程访问的数据缓存写入到相同缓存行中他们的本地变量时,会出现促使线程Tx去读取旧的错误的值的情况。当这样的情况发生时,Tx被叫做已经变得“数据非相干(incoherent),,。图加和2b每个示出了由不同线程造成在线程TO上数据非相干的访问序列的一个例子。参考图2a,TO先用写入请求访问其本地变量Α。然后Tl用读取请求访问其本地变量B。A和B的物理地址使得他们缓存在相同的全局数据缓存行。最初A和B都不在该缓存中。典型地,读取请求到达存储器总线的时间比写入请求短。在这种情况下,Tl读取在TO写入之前到达存储器。结果,该缓存行的旧值被储存在该数据缓存中。TO写入请求没有写入到该数据缓存,仅写入到存储器总线。所以,从该数据缓存的缓存行的随后的读取将取得被储存在该数据缓存的旧值作为Tl读取的结果。参考图2b,A和B再一次都在相同的缓存行,并且最初不在该数据缓存中。Tl先用读取请求从存储器总线访问B。在B被取得之前,即在读取请求离开该数据缓存的时刻与包含B的缓存行被储存在该数据缓存的时刻之间,对A的写入请求从TO被发布到存储器总线。再一次,来自TO的写入没有被写入到该数据缓存,使得该数据缓存保持缓存行的旧版本,该旧版本将被随后的读取请求访问。能够看出,当多线程从存储器总线访问全局缓存存储器时,会出现数据非相干,特别是直写式(Write-through)缓存。本发明目的在于通过检测非相干危险并且使用一种机制来保证在安全的时候将读取或写入指令只发布到存储器总线外来处理该问题,。

发明内容
在所附的独立权利要求中限定本发明。在从属权利要求中限定优选的特征。


现在将参考

本发明的示例,在附图中图1示出了在常规多线程处理器核心中的存储器访问系统;图加和图2b每个示出了引起缓存非相干的存储器访问序列;图3示出了根据本发明的系统;图4示出了根据本发明的示例性全局写入地址存储器的操作;图5示出了在图3的系统中使用的非相干检测模块;图6示出了在图3系统中使用的存储器仲裁器;图7示出了在仲裁器的命令执行。
具体实施例方式如图加和图2b所示,由于不同的状况,会出现数据非相干,这可以以不同方式来处理。图加示出的非相干能够使用第一种机制来避免,而图2b示出的非相干能够使用第二种机制来避免。图3是示出根据本发明第一方面的系统的示意图。图3示出了用于从存储器总线访问数据的系统,该系统避免能够从参考图加描述的状况出现的数据非相干。由于本发明关于数据非相干并因此访问数据,因此为了清楚,省略了用于从存储器总线取得指令的路径。该系统包括数据缓存存储器管理单元30,该数据缓存存储器管理单元30连接到处理器核心;线程仲裁器31、32,该线程仲裁器31、32连接到存储器管理单元;以及存储器仲裁器33,该存储器仲裁器33连接在线程仲裁器与存储器总线之间。其中,数据缓存存储器管理单元是数据缓存34本身和用于地址翻译等相关的存储器管理功能,以及非相干检测模块。如图1中的系统、图2中的系统,当在处理器核心上执行的线程发布读取或写入请求时,将该请求路由到数据缓存MMU 30。对于读取请求,如果数据在数据缓存34,则立即取得并使用该数据。如果不在数据缓存中,则必须访问存储器总线上的存储器。对于在直写式缓存的写入请求,该写入请求总是访问存储器总线。与数据缓存相关的存储器管理单元 (MMU)功能会将在处理器上运行的程序使用的虚拟存储器地址转换成存储器总线上的物理地址。本发明的一个方面,提供了非相干检测模块35,用来处理由全局读取请求和全局写入请求造成的非相干。此处使用的术语“全局读取请求”和“全局写入请求”意味着向对多个线程共享的部分存储器的请求。在到达存储器仲裁器33之前,来自数据缓存34的全局读取或写入请求必须首先通过非相干检测模块35,然后通过存储器总线。对非相干检测模块在图5中详细说明。非相干检测模块具有三种功能。一个是维持之前全局写入请求的物理地址的记录。另一个是将任意新来的全局读取的地址与之前写入请求的记录相比较,以确定是否存在过去的向相同的全局缓存行的写入。最后一个是使用比较信息来向每个请求增加 “命令执行边带(order enforcement sideband) ”(或插入单独的“分隔请求(barrier request) ”),以使存储器仲裁器33能够如非相干检测模块35计划的那样,执行向存储器总线发布请求的命令。该机制在存储器仲裁器之前没有暂缓(stall)或节流(throttle)通过各个模块的数据流,暂缓或节流通过各种模块的数据流会造成性能下降。保留所有先前的全局缓存写入的单个物理地址的记录,会需要极大的存储器总量,其实现不实际。另一种作为替换的是将全局写入请求的单个地址压缩成地址范围。这种实施方式中,非相干检测模块包括针对每个线程的全局写入地址存储器(GWAM)。每个GWAM 包括少量数据存储段(storage slot),每个存储段存储不重叠的地址范围。图4示出了根据本发明的示例性GWAM是如何操作的。图如示出了具有4个存储段的GWAM。这些储存器段最初是空的。每个存储器段具有4个字段有效标志字段、32-比特字节地址字段(TAG)、高地址范围大小掩码(MU)以及低地址范围大小比特掩码(ML)。有效标志简单地指示记录的写入地址是否在存储器段中。TAG字段指示在存储器地址范围中由该段覆盖的地址。MU和ML字段定义由该段覆盖的存储器地址范围。对于被覆盖的地址范围,低地址 =TAG&&(MU&ML),其中&&表示比特与(AND)操作,以及&表示向量拼接(concatenation)。 高地址=TAGl I ! (MU&ML),其中| |表示比特或(OR)操作。例如,使用十六进制符号,对于 TAG = 0xAAAAAA34, ML = OxFFFFOO, MU = OxFF,地址范围=OxAAAAAAOO 到 OxAAAAAAFF。当第一写入地址被记录时,第一写入地址被分配到GWAM中的存储器段。这在图 4b中说明。由于此前所有段为空,就不需要压缩数据。所以在这种情况下,将写入地址 ΟχΒΙΟΟΟΟΟΟ以最小地址范围储存在第一段。当第二写入地址OxAOOOOOOO将被储存在GWAM时,第二接入地址被储存在第二段, 也是以最小的范围。这在图4c中示出。当发布第三写入地址时,第三写入地址会落入由另一个段的MU字段定义的地址范围,将第三写入地址放置在那个段并改变ML字段以适应新地址。图4d示出了这点。在图4d中,新的写入请求是到地址0xB1000004。由于这个地址能够通过改变ML(并且不改变 MU)的值而被压缩到第一段,故将该地址压缩到第一段。图如和图4f示出了再增加两个写入请求地址0x80000000和0x90000000,这两个写入地址不能被压缩到现有的段。在这些地址增加后,所有的段都在被使用。图4g示出了随后新请求地址OxCOOOOOOO的增加。由于这个地址不能被压缩到任何一个段,并且所有的段已满,在第一段,将所有现有的段压缩到一个范围。然后就有三个段可用于新进的写入请求地址。该GWAM安排允许将关于写入地址的足够的信息储存在小存储器。其能够导致将一些不必要的分隔插入,但在实践中这种折中没有实质上影响性能。图5示出了图3的非相干检测模块的组成部分。一从线程Tx接收到请求,在块 500非相干检测模块首先确定该请求是到全局缓存行的读取请求还是写入请求。如果该请求是全局写入请求,则将线程Tx的GWAM参考图4来更新。图5在块510示出了由非相干检测模块维持的针对每个线程的存储器和寄存器。 GWAM被示出为块515。还包括缓存计数寄存器520,该缓存计数寄存器520是为FIFO 580 中的线程排队的请求的数量的记录,正等待被传递到存储器仲裁器;最后分隔缓冲空(LB_ 缓冲_空(LB_bUfT_empty))寄存器525,该寄存器取值1或0,并指示自该线程的最后一个分隔后,是否有任何请求从数据缓存被传递;以及请求ID(req_id),针对每个在FIFO 580 中的请求设置标识值。如果是来自线程Tx的全局读取请求,该请求被传递到比较器单元530。该比较器单元530检查以查看全局读取请求的存储器地址是否落入在其它线程的任何GWAM中的地址范围内。如果该读取请求的地址没有落入在另一个线程的GWAM中的地址范围内,那么能够在不插入任何分隔标志或分隔请求的情况下将该读取请求传递到存储器仲裁器。然而,如果该读取请求的地址落入另一个线程(此处,将该线程成为匹配线程)的 GffAM的存储的地址范围内,则将该请求传递到块504,其中,块504确定每个匹配线程的LB_ 缓冲_空(LB_bufT_empty)寄存器的值。如果对于匹配线程该LB_缓冲_空(LB_buff_ empty)寄存器具有值0 (也就是,如果在插入最后的分隔后没有对该线程排队的请求),那么不需要再插入分隔。然而,如果对于匹配线程该LB_缓冲_空(LB_bUfT_empty)寄存器具有值1,那么必须对该线程插入分隔,以防止出现非相干问题。有两种方式能够用来插入分隔。可以将分隔作为附加的边带数据插入到现有请求,或将分隔作为单独的“分隔请求”来插入,该分隔请求是包含带有附加的边带数据的新请求。如果有在FIFO 580中排队的针对所述的线程的请求,则将分隔作为边带数据增加到 FIFO的最后的请求。如果在FIFO 580中不存在针对该线程的排队的请求,则没有让分隔边带附着的请求。在那种情况下,分隔必须表现为具有附加的分隔边带数据的新的分隔请求的形式。所以在块M5,非相干检测模块确定每个匹配线程的缓存计数是否等于0。如果缓存计数等于0,则将分隔作为新的分隔请求插入。这在块565被指示。同时,向读取请求增加边带数据(称为块检查数据),以及增加或改变(toggled)添加到每个请求的时间戳。块检查数据包括每个已插入分隔的匹配线程的线程ID。然后将请求在每个线程FIFO 580中排队,直到能够将这些请求发布到存储器仲裁器。此处使用的“时间戳” 意思是与时间相关的一条数据,当其被改变时,标记新的时间周期。在优选的实施方式中, 时间戳是能够取值0或1的1-比特字段。如果对于将被插入分隔的匹配线程的缓存计数不等于0,则作为边带数据将分隔
8附加到FIFO 580中的最后请求。然而,直到该请求已经离开FIF0580之后,才能增加分隔边带数据。因此,对每个线程提供后端分隔插入FIF0550。FIFO 550储存请求的线程ID和分隔数据本身,分隔将被附着到请求的线程ID,包括对应的全局读取请求的ID。按照所有已说明的检查,针对每个线程的读取和写入请求被排队在每个线程请求 FIFO 580中。在图5中示出了多路传输功能570,来说明将请求和分隔路由到适当的线程 FIFO 580。来自块565的箭头指示用于插入的分隔请求。来自该图上部的箭头指示经过多路传输器570被增加到每个线程FIFO的读取和写入请求。所以,如果分隔将被作为单独的分隔请求插入,则将该分隔排队在正确的线程请求FIFO中,而将对应的读取请求排队在其线程请求FIFO中。在每个请求FIFO 580的出口提供后端分隔插入检查阶段560。对首先进入对应的后端分隔插入FIFO 550的条目检查每个离开FIFO 580的请求。当存在匹配,则在将请求发送到存储器仲裁器之前,向该请求附加边带数据。当在请求队列中包含的分隔,作为边带数据或作为单的分隔请求时,刷新该线程的GWAM。能够抹去该GWAM中的所有条目,因为不再有与那些存储器地址条目相关的任何非相干危险。总之,为了支持命令执行,当新进的读取地址落入GWAM地址范围段的一个段时, 非相干模块进行以下步骤1)对需要一个分隔请求的线程发布分隔请求2)向读取请求分配适当的块检查边带数据3)改变内部的1-比特时间戳,该1-比特时间戳被附加到每个读取/写入4)刷新已经发布分隔请求的线程的GWAM。图6示出了根据本实施方式的命令执行存储器仲裁器的功能硬件块。该存储器仲裁器维持分隔状态寄存器600以及当前时间戳寄存器605。分隔状态寄存器600指示是否已经通过线程仲裁器610发布分隔以及从哪个线程发布分隔。在每次增加或改变存储器仲裁器内部的时间戳时,将分隔状态寄存器清除。在每次通过线程仲裁器发布具有块检查边带的读取请求时,增加或改变内部的时间戳。该时间戳寄存器是当前时间戳值的简单记录。首先在块615确定,从非相干检测模块到达的请求是否是具有块检查边带数据的全局读取请求。如果是具有块检查边带数据的全局读取请求,则在块620,存储器仲裁器读取在块检查边带数据中的分隔数据,并且对着分隔状态寄存器检查它,以确定是否相关的分隔都已经被该线程仲裁器610发布。如果所有相关的分隔已经被发布,则将全局读取请求释放到线程仲裁器。如果相关的分隔没有被线程仲裁器全部发布,则将全局读取请求阻挡在存储器仲裁器的输入。重复这些检查,直到能够释放全局读取请求。如果该请求不是具有块检查边带数据的全局读取请求,则在块625,将该请求的时间戳与储存在当前时间戳寄存器的内部的时间戳值相比较。如果时间戳匹配,则将该请求释放到线程仲裁器。如果时间戳不匹配,则阻挡该请求。重复此时间戳检查,直到时间戳匹配以及请求被释放。线程仲裁器610接收所有线程的释放的请求,并使用仲裁技术(例如,循环(round robin)技术),以在向存储器总线访问的线程之间仲裁。在线程仲裁器中可使用任意标准
9以在在线程之间仲裁。当请求包括分隔(或单独的分隔请求),并且线程仲裁器发布具有块检查边带数据的全局读取请求时,则如上面描述和在图6示出的,将分隔状态寄存器和时间戳寄存器更新。在块630和635中对于具有块检查边带数据的全局读取请求以及分隔来检查请求。 如果检测到分隔,则在块640,更新分隔状态寄存器。如果检测到具有块检查边带数据的全局读取请求,则在块645,清除分隔状态寄存器,并且将时间戳寄存器中的时间戳改变。整体的效果是,存储器仲裁器不发布按照攻击性(offending)读取的任何请求, 直到已经将在该读取之前的来自所有线程的所有存储器请求已被发布。由于执行机制已经保证没有将来的新进的请求会赶上(overtake)已经发布的分隔请求,可以将已经发布分隔请求的线程的GWAM内容抹去。参考图加的示例序列,当Tl_读取_到_C1 (Tl_Read_to_Cl)呈现在检测模块输入时,来自GWAM的匹配将由检测模块产生如下动作-向其他非请求线程TO插入分隔请求T0_分隔_T1(T0_Bar_Tl)。该分隔请求具有线程ID Tl的边带数据,指示该分隔请求是由Tl全局读取产生的分隔请求;-将Tl_读取_到_C1(Tl_Read_to_Cl)的块检查值设置为“等待,直到来自TO的分隔”;-在全局缓冲读取之后,对将来的请求增加时间戳标志。存储器仲裁器解码那些命令执行边带值,并采取适当的动作-当将分隔请求发布出去到存储器总线时,不暂缓分隔请求T0_分隔_T1(T0_Bar_ Tl)并更新分隔发布状态寄存器;-保持Tl_读取_到_C1(Tl_Read_to_Cl),直到分隔发布状态寄存器指示T0_分隔_T1 (T0_Bar_Tl)已经被发布。在将Tl_读取_到_C1 (Tl_Read_to_Cl)发布之后,仲裁器更新其自己的当前时间戳寄存器。T0_分隔_Tl(T0_Bar_Tl)的发布,意味着在Tl_读取 _到_(1(11_彻3(1_切_(1)之前的所有请求已经被发布,这些请求包括来自TO的攻击性写入,Τ0_ 写入 _ 到 _C1 (T0_ffrite_to_Cl)。-对于那些T0_ 写入 _ 到 _C3 (T0_ffrite_to_C3)以及 Tl_ 读取 _ 到 _C4 (Tl_Read_ to_C4)的“安全”请求,将仲裁器当前时间戳寄存器与时间戳值相比较,并且仅当时间戳值匹配的时候发布。图7示出了由存储器仲裁器的这种命令执行过程和结果。来自数据缓冲的初始请求流在图7上部被示出为流70。请求被分到每个线程流中,并且分隔和边带数据由如上面描述并在图7示出的非相干检测模块插入,作为流71和72进入线程仲裁器73。在图7的下部,示出了向存储器总线发送的请求的命令流74。在图2b中示出的非相干危险能够使用不同的机制来处理。数据缓冲包括在数据缓存的DATA RAM中储存缓存行物理地址的TAG RAM。当数据缓存接收到在数据缓存中遗漏的读取请求时,选择来自TAG RAM的条目来存储将由该读取请求获得的缓存行的物理地址信息。能够将填充标志增加到在TAG RAM的该物理地址信息,该物理地址信息指示该RAM 部分为了当前被获得的缓存行而被留出。当缓存行被获得时,填充标志取值1 ;当没有被获得的缓存行时,填充标志取值0。当有从向其他线程向相同缓存行的相同或不同位置的随后的写入时,当填充标志具有值1,则为那个缓存行设置另一个在TAG RAM中的标志,称作“污点标志(dirty flag) ”。当该污点标志具有值1时,其指示存在潜在的非相干危险,因为一个线程正在修改当前正被获得的缓冲行,因此,不能保证最后被放入数据缓冲行的数据会是最新的数据。当污点标志为1时,由于其数据不能被信任,该缓存行被认为无效。在这种情况下,后续的读取请求将忽略在数据缓存行的数据并将从主存储器获得最新的数据。以下序列说明用于在图2b中示出的情况的这种机制。Tl读取B。由于B不在数据缓存中,数据缓存MMU从存储器总线获得包括B的缓存行。将TAG RAM中的A TAG字段更新,并且设置填充标志为1,以及设置污点标志为0。TO将数据0X10写入到A。尽管A不在缓存中,在RAM中的填充标志指示缓冲行当前正被填充。污点标志因此被设置为1。Tl缓冲行获得完成。由于读取请求,在数据缓冲行的缓冲行包括来自主存储器的 A的旧值。TO读取A。尽管TAG RAM指示缓存成功(hit),因为数据缓冲包含具有A的缓存行,对于那个缓存行将污点标志设置为1。然后该硬件确定在缓存中遗漏该读取,并且从存储器总线再次获得该行。由于此读取发生在TO写入之后,读取返回A的最后值并且维持数据的相干性。两种机制,第一种应对如图加所示的情景,第二种应对如图2b所示的情景,这两种机制的组合提供了数据非相干的解决方案,这种数据非相干由于在通过数据缓存写入情况下缓存遗漏而产生。
权利要求
1.一种用于通过支持多个线程的多线程处理器来控制存储器访问的系统,该系统包括处理器核心;缓存存储器,该缓存存储器储存能由所述多个线程的每一个线程访问的数据;主存储器,该主存储器存储能由所述多个线程访问的数据;非相干检测模块;以及存储器仲裁器,其中所述非相干检测模块连接在所述处理器核心与所述存储器仲裁器之间,以及所述存储器仲裁器连接在所述非相干检测模块与所述主存储器之间,并且其中存在针对每个线程的单独的请求队列,该针对每个线程的单独的请求队列用于读取以及写入被从所述缓存存储器发送到所述存储器仲裁器的请求;其中,在使用中,所述非相干检测模块在写入地址存储器中储存对于被从所述缓存存储器发送到所述主存储器的每个写入请求的存储器地址的指示、并且将每个被从所述缓存存储器发送到所述主存储器的随后的读取请求的地址与在所述写入地址存储器中的指示相比较,以及,如果随后的读取请求的地址与指示相匹配,则所述非相干检测模块将对应于所述读取请求的分隔插入到匹配的指示所属的线程的请求队列中,并且其中所述存储器仲裁器阻止所述随后的读取请求访问所述主存储器,直到对应的分隔已经被所述存储器仲裁器接收。
2.根据权利要求1所述的系统,其中所述非相干检测模块向所述随后的读取请求附加边带数据。
3.根据权利要求2所述的系统,其中所述边带数据将所述线程的列表包含进对应的分隔已被插入的线程的请求队列中,并且其中所述随后的读取请求被阻止访问所述主存储器,直到所有对应的分隔已经被所述存储器仲裁器接收。
4.根据前述任一项权利要求所述的系统,其中所述非相干检测模块向每个请求附加当前时间戳。
5.根据权利要求4所述的系统,其中,在每次读取请求的地址与所述写入地址存储器中的一个或多个指示相匹配时,所述非相干检测模块更新所述当前时间戳。
6.根据从属于权利要求2或3的权利要求4或5的任一项权利要求所述的系统,其中所述存储器仲裁器包括内部的时间戳计数器,并且当附加到请求的时间戳与所述内部的时间戳计数器相匹配时,仅会允许除了边带数据附加到的读取请求以外的请求访问所述主存储器,以及其中在每次具有附加的边带数据的读取请求通过所述存储器仲裁器时,更新所述内部的时间戳计数器。
7.根据前述任一项权利要求所述的系统,其中所述非相干检测模块通过在所述写入地址存储器中储存写入请求的存储器地址所属的地址范围,来存储所述写入请求的存储器地址的指示。
8.根据权利要求7所述的系统,其中所述非相干检测模块在所述写入地址存储器的单一地址范围条目中储存多个地址,以及其中所述地址范围的大小能够被动态改变。
9.根据前述任一项权利要求所述的系统,其中针对被从所述处理器核心发送到所述存储器总线的每个写入请求的存储器地址的指示被存储在所述非相干检测模块中的线程专用写入地址存储器中,以及所述非相干检测模块将所述随后的读取请求的地址与每个其它线程的写入地址存储器中的指示相比较。
10.根据前述任一项权利要求所述的系统,其中每个线程具有专用写入地址存储器,以及其中当分隔被针对线程而增加到所述请求队列时,删除针对该线程的写入地址存储器中的所有条目。
11.根据前述任一项权利要求所述的系统,其中所述分隔包括用于识别对应的读取请求所属的线程的数据。
12.根据前述任一项权利要求所述的系统,其中所述分隔包括附加到在匹配的指示所属的线程的请求队列中的现有请求的分隔边带数据。
13.根据权利要求1-11中任一项权利要求所述的系统,其中,当在所述匹配的指示所属的线程的请求队列中不存在请求时,所述分隔包括附加到被插入到所述请求队列的新的请求的分隔边带数据。
14.根据前述任一项权利要求所述的系统,其中,由于先前的分隔针对线程被插入,如果已经存在针对该线程的从所述缓存存储器发送的请求,则所述非相干检测模块仅将分隔插入到所述匹配的指示所属的线程的请求队列中。
15.一种用于通过由多线程处理器中的线程来控制访问全局存储器的方法,所述多线程处理器包括处理器核心、储存能由多个线程的每一个线程访问的数据的缓存存储器、连接到存储能由所述多个线程访问的数据的主存储器的存储器总线、以及针对每个线程的写入地址存储器,所述方法包括以下步骤(a)针对每个线程,在对应的写入地址存储器中储存对所述主存储器的每个写入请求的存储器地址的指示;(b)将随后的读取请求的存储器地址与其他线程的写入地址存储器的内容相比较;以及(c)如果所述读取请求的所述存储器地址对应于写入地址存储器中的指示,则将分隔插入到对应的写入请求所属的线程的请求队列中,以及阻止所述读取请求访问所述主存储器,直到对应的分隔已经被所述主存储器接收。
16.根据权利要求15所述的方法,该方法还包括以下步骤当分隔被增加到线程的请求队列时,删除针对该线程的写入地址存储器中的所有条目。
17.根据权利要求15或16所述的方法,其中,所述分隔包括用于识别对应的读取请求所属的线程的数据。
18.根据权利要求15、16或17中任一项权利要求所述的方法,其中所述分隔包括附加到所述请求队列中的现有请求的边带数据。
19.根据权利要求15-18中任一项权利要求所述的方法,其中,当在所述匹配的指示所属的线程的请求队列中不存在请求时,所述分隔包括附加到被插入到所述请求队列的新的请求的分隔边带数据。
20.根据权利要求15-19中任一项权利要求所述的方法,其中,由于先前的分隔针对线程被插入,如果已经存在针对该线程的从所述缓存存储器发送的请求,则仅执行将分隔插入到该线程的请求队列中的步骤。
21.根据权利要求15-20中任一项权利要求所述的方法,该方法还包括将当前时间戳附加到每个请求的步骤。
22.根据权利要求21所述的方法,该方法还包括在每次读取请求的所述存储器地址对应于所述写入地址存储器中的一个或多个指示时更新所述时间戳的步骤。
23.根据权利要求15-22中任一项权利要求所述的方法,该方法还包括将边带数据附加到随后的读取请求的步骤。
24.根据权利要求23所述的方法,其中所述边带数据将所述线程的列表包含进对应的分隔已被插入的线程的请求队列中,并且其中仅在所有对应的分隔已经通过所述存储器仲裁器后将所述读取请求传递到所述主存储器。
25.根据权利要求23或M所述的方法,其中所述步骤(c)还包括阻止除了边带数据已经附加到的读取请求以外的请求访问所述主存储器,直到附加到该请求的时间戳与内部的时间戳计数器相匹配,以及该方法还包括每次具有附加的边带数据的读取请求通过所述存储器仲裁器时更新所述内部的时间戳计数器的步骤。
26.根据权利要求15-25中任一项权利要求所述的方法,其中所述步骤(a)包括通过在所述写入地址存储器中储存所述写入请求所属的地址范围,储存每个写入请求的存储器地址的指示。
27.根据权利要求沈所述的方法,其中所述步骤(a)包括将多个地址存储作为单一地址范围。
全文摘要
提供一种用于在支持多个线程的多线程处理器控制存储器访问的设备,该设备包括处理器核心;缓存存储器,该缓存存储器储存能够由多个线程的每一个线程访问的数据;主存储器,该主存储器存储能够由多个线程访问的数据;非相干检测模块;以及存储器仲裁器,其中将非相干检测模块连接在处理器核心与存储器仲裁器之间,以及将存储器仲裁器连接在非相干检测模块与主存储器之间,并且其中存在针对每个线程的单独的请求队列,该请求队列用于从缓存存储器被发送到存储器仲裁器的读取及写入请求;其中,在使用中,非相干检测模块在写入地址存储器中储存对于每个被从缓存存储器发送到主存储器的写入请求的存储器地址的指示,并且将每个被从缓存存储器发送到主存储器的随后的读取请求,与在写入地址存储器中的指示相比较,以及如果随后的读取请求的地址与指示相匹配,则插入对应于读取请求的分隔到匹配的指示所属的线程的请求队列,并且其中,存储器仲裁器阻止随后的读取请求访问存储器总线,直到对应的分隔已经被存储器仲裁器接收。
文档编号G06F12/08GK102388372SQ201080016118
公开日2012年3月21日 申请日期2010年4月7日 优先权日2009年4月7日
发明者R·G·伊舍伍德, Y·N·科 申请人:想象技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1