使用睡眠-唤醒机制的比较和交换操作的制作方法

文档序号:6626093阅读:182来源:国知局
专利名称:使用睡眠-唤醒机制的比较和交换操作的制作方法
技术领域
本发明的实施方案涉及处理器。更具体地,一个实施方案涉及使用睡眠-唤醒机制来执行比较和交换操作。
背景技术
一般地,多线程处理器或多处理器系统能够并发地处理多个指令序列。驱动在单个处理器内执行多个指令流的基本激励因素是由此产生的处理器利用率的提高。多线程处理器允许在不同执行资源中并发地执行多个指令流,以更好地利用这些资源。而且,多线程处理器可用于遇到高等待时间延迟或经常等待事件发生的程序。
一般地,计算机系统具有由所有线程或处理器共享的单资源设置(single resource)setup。资源不充分可能会导致处理器(或线程)之间严重的竞争,例如因为处理器共享总线和存储器带宽。当一个或多个处理器等待信号量(semaphore)或锁(指常用来允许单个处理器排他性地访问其他数据结构的数据结构)变为可用时这一竞争尤其明显。这引发了资源瓶颈以及存储器带宽、计算带宽、微体系结构资源和功率的浪费。处理器的“忙等待”还会对系统中其他处理器的性能具有不利影响。
图1的框图示出了示例性计算机系统100,该系统具有访问共享存储器空间114的处理器102-106。信号量(锁)110是存储器108中的特定位置,其被分配来包括与获得对共享空间114的访问权112相关联的值。处理器102-106中的一个处理器为了访问共享空间114,它首先访问锁110并测试存储在锁位置110中的数据的状态(值),并且,以最简单的格式,两个值中的任何一个被分配给锁110。第一个值表明共享空间114对访问的可用性,而第二个值表明共享空间114的当前利用状况并且因此它不可用于访问。另外,位状态1和0可用于锁110的锁定状态和解锁状态。
处理器102-106访问存储器108以进行数据传输一般涉及加载和存储操作的使用。加载操作从存储器108中被访问的位置传输存储器内容,而存储操作将数据传输到存储器108中被访问的存储器位置。因此,加载/存储操作用于访问存储器108和锁110,以在处理器102-106和存储器108之间传输数据。加载和存储访问也分别称为读和写访问。当进行读时,根据诸如修改、排他、共享、无效(MESI)协议等协议,缓存线以“共享非修改”、“排他”或“修改”中之一存在于处理器的缓存中。如果缓存线不是以这些状态之一(例如无效)存在,则处理器102-106从存储器108取得该线,并将它置于“共享非修改”或“排他”状态。为了执行写,处理器102-106使它缓存中的线处于“排他”或“修改”状态,否则取得它并将之以“排他”状态置于其缓存中。“共享状态”可用于并发读,但只有一个处理器102-106可使线处于“排他”状态以进行读或写。
检查信号量的可用性并使之忙的技术的一个示例是使用原子化(atomic)读-修改-写序列(例如“测试&设置”(TS)机制)。实现同步的一种机制是“比较和交换指令”,它相对来说比较有效,但又不足够有效,因为它需要排他性地占有存储器位置的缓存线。这防止了其他处理器并发读该存储器位置。
另一个示例包括“测试&测试&设置”(TTS)机制。TTS机制相对来说更为有效,因为处理器在信号量非空闲期间,在首次测试中访问该变量共享状态下的本地缓存拷贝。但是,当一个处理器已经获得该锁而其他处理器正在竞争(例如同时的尝试性读以检查该信号量是否空闲)以获得锁时,TTS机制不能防止其他处理器的出现阻塞或瓶颈。获得锁的处理器以“排他”状态获得了该锁的缓存线,迫使它退出所有其他缓存。当完成对锁的写时,其他处理器尝试进行读,这使获得中的处理器在一系列总线事务中,将它修改后的锁值写回到存储器并将现在共享的数据转发到其他处理器。

发明内容
为了解决现有技术中的相关问题,本发明提供了一种方法、装置和系统,用于执行使用睡眠-唤醒机制的比较和交换操作。根据一个实施方案,执行处理器处的指令来帮助代表该处理器获得锁。如果锁不用于由该处理器获得,则将指令置于睡眠,直到事件发生。
根据本发明的一个方面,提供了一种方法,包括执行处理器处的指令以帮助代表该处理器获得锁;以及如果所述锁不可用(unavailable),则将所述处理器处的所述指令置于睡眠,其中所述指令进行睡眠直到事件发生。
根据本发明的另一个方面,提供了一种处理器,包括执行单元,其能够执行指令以帮助代表该处理器获得锁;以及睡眠-唤醒机制,用于如果所述处理器不能获得所述锁,则将所述指令置于睡眠,其中所述指令被置于睡眠直到事件发生。
根据本发明的又一个方面,提供了一种系统,包括多个处理器,包括具有下述部件的第一处理器,即执行单元,其能够执行指令以帮助代表该第一处理器获得锁,和睡眠-唤醒机制,用于如果所述第一处理器不能获得所述锁,则将所述指令置于睡眠,其中所述指令被置于睡眠直到事件发生;与所述多个处理器耦合的存储器,该存储器具有由所述多个处理器共享的存储器空间;以及与所述存储器和所述多个处理器耦合的锁存储位置,该锁存储位置具有所述锁以控制对所述存储器空间的访问。
根据本发明的再一个方面,提供了一种机器可读介质,其上存储有代表指令集的数据,所述指令集被机器执行时使得该机器执行处理器处的指令以帮助代表该处理器获得锁;并且如果所述锁不可用,则将所述处理器处的所述指令置于睡眠,其中所述指令进行睡眠直到事件发生。


所附权利要求具体地阐明了本发明的特征。本发明的实施方案及其优点可从下面的详细描述并结合附图而得到最佳的理解,其中图1的框图示出了具有访问共享存储器空间的处理器的示例性计算机系统;图2的框图示出了指令编码方案的实施方案;图3的框图示出了具有带睡眠-唤醒机制的比较和交换操作的处理体系结构的实施方案;图4的框图示出了用于实现本发明一个或多个实施方案的示例性计算机系统;图5的框图示出了用于实现本发明一个或多个实施方案的多线程处理器的实施方案;图6的框图示出了一种系统的实施方案,其具有使用带睡眠-唤醒机制的比较和交换操作的多个处理器。
图7的流程图示出了用于使用睡眠-唤醒机制执行比较和交换操作的过程的实施方案;并且图8的框图示出了用于带睡眠-唤醒机制的比较和交换操作的状态机的实施方案。
具体实施例方式
下面描述了一种系统和方法,用于使用睡眠-唤醒机制执行比较和交换操作。在下面的描述中,可能给出了大量具体细节,例如逻辑实现、操作码、资源划分、资源共享以及资源复制实现、系统组件的类型和相互关系以及逻辑划分/集成选项,以更彻底地理解本发明的各个实施方案。但是,本领域的技术人员将会认识到,基于所提供的公开内容,本发明的实施方案可在没有这些具体细节的情形下实施。在其他情形下,未详细示出控制结构、门级电路和完整的软件指令序列以免模糊本发明。本领域的普通技术人员利用所包括的描述将能够实现适当的功能而无需非常规的试验(undue experimentation)。
下面将描述本发明的各个实施方案。各个实施方案可由硬件组件执行,或者可在机器可执行指令中实施,所述指令可用来使得用所述指令编程的通用或专用处理器或机器或逻辑电路执行各个实施方案。或者,各个实施方案可由硬件和软件的组合执行。
本发明的各个实施方案可提供为计算机程序产品,该产品可包括其上存储有指令的机器可读介质,所述指令可用于对计算机(或其他电子设备)编程以执行根据本发明各个实施方案的过程。机器可读介质可包括但不局限于软盘、光盘、压缩只读盘存储器(CD-ROM)、磁光盘、只读存储器(ROM)、随机访问存储器(RAM)、可擦除可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM)、磁或光卡、闪存或适合存储电子指令的任何其他类型的介质/机器可读介质。而且,本发明的各个实施方案还可作为计算机程序产品而下载,其中该程序可以通过包括在载波或其他传播介质中的数据信号,经由通信链路(例如调制解调器或网络连接)从远程计算机传输到请求计算机。
图2的框图示出了指令200的编码方案的实施方案。示出的是用于执行读-修改-写操作的指令(例如比较和交换(CMPXCHG))200。指令200读第一源数据,将它与另一源数据比较,并且如果所述比较满足预定标准或条件(例如当比较为真时)则将某个修改后的值写到某个位置。该位置可包括第一源数据的初始位置。如果未满足预定条件,则该位置中的初始数据不被修改。可使用所述状况更新另一个位置,包括初始数据之外的一个位置,如下所述cmpxchg dest,src(利用隐式累加器寄存器)累加器寄存器RAX包括预期未锁定值if accumulator=dest thenzero_flag=1dest=srcelsezero_flat=0accumulator=destendif指令200包括单个原子化指令,该原子化指令包括操作码操作数202,它用来将指令200标识为CMPXCHG指令,还包括与对应于源和目的地的SRC1、SRC2、SRC3和DEST204-210相关联的操作数。
图3的框图示出了用于实现指令200的处理体系结构300的实施方案。处理器302示出为中央处理单元(CPU),其具有执行单元304、寄存器文件306(包括寄存器308)和译码器314,它们由总线316耦合到一起。寄存器文件306包括一组寄存器308,寄存器308由执行单元304访问以执行指令200。指令200可包括图2的CMPXCHG指令或带有睡眠-唤醒机制的比较和交换指令(CMPXCHG_SW指令)的实施方案。
指令200示出为驻留在执行单元304内,从指令200的操作数202-210到寄存器文件306中的对应寄存器308以虚线示出。译码器314用来译码指令200以执行。存储器320可通过总线318与总线接口单元(BIU)312通信。BIU 312用来在存储器320和处理器302之间传输数据。可以考虑到,指令200的程序例程(操作序列)可驻留在存储器320内。在执行指令200之前,可将SRC1、SRC2和SRC3加载在寄存器308中。在一个实施方案中,处理-比较-操作数(PCO)寄存器(未示出)可用来在指令200的执行期间的不同时间段工作为SRC2和/或DEST的寄存器。换言之,在执行之前,SRC1和SRC3加载在寄存器308中,而SRC2信息加载到PCO寄存器中,该寄存器用作为SRC2信息的专用寄存器。
在一个实施方案中,指令200包括CMPXCHG_SW指令,对该指令,由处理体系结构300实现并执行带有睡眠-唤醒机制的比较和交换操作(CMPXCHG_SW机制)。该机制可使用硬件(例如实现在处理器302中)和/或软件(例如用于实现和执行该机制的各个功能的同步代码)来实现。在一个实施方案中,CMPXCHG_SW机制用来在所期望的锁322(用于获得对共享存储器空间326的访问权)不可用(例如正由另一个处理器获得)时使CMPXCHG_SW指令睡眠。随后,当获得中的处理器已完成它对共享存储器空间326的访问时,它然后可能需要将锁322重置(或修改)为打开(或解锁)状态,以使得另一个处理器现在可获得控制以访问共享存储器空间326。系统如何释放对共享存储器空间326的控制可以是一种设计选择(例如由系统体系结构决定)。例如,可将解锁状况值直接写到锁322或者写/保存在寄存器308中。CMPXCHG_SW机制参考图7-9有进一步的公开。
图4的框图示出了示例性计算机系统400,用于实现本发明的一个或多个实施方案。该计算机系统(系统)包括一个或多个处理器402-406。处理器402-406可包一个或多个单线程或多线程处理器。典型的多线程处理器可包括多个线程或逻辑处理器,并可能够使用它的多个线程来并发地处理多个指令序列。处理器402-406还可包括一级或多级内部缓存(未示出)以及用于指引与处理器总线412的交互的总线控制器或总线接口单元。
处理器总线412也称为主机总线或前侧总线,可用于将处理器402-406与系统接口414相耦合。处理器总线412可包括控制总线432、地址总线434和数据总线436。控制总线432、地址总线434和数据总线436可以是多点(multidrop)双向总线,例如连接到3个或更多总线主体(agent),而非只连接在两个总线主体之间的点到点总线。
系统接口414(或芯片组)可连接到处理器总线412,以将系统400的其他组件与处理器总线412相接口。例如,系统接口414可包括存储器控制器418,以将主存储器416与处理器总线412相接口。主存储器416一般包括一个或多个存储卡和控制电路(未示出)。系统接口414还可包括输入/输出(I/O)接口420,以将一个或多个I/O桥或I/O设备与处理器总线412相接口。例如,如图所示,I/O接口420可将I/O桥424与处理器总线412相接口。I/O桥424可工作为接口在系统接口414和I/O总线426之间的总线桥。一个或多个I/O控制器和/或I/O设备可与I/O总线426相连接,例如I/O控制器428和I/O设备430,如图所示。I/O总线426可包括外设部件互连(PCI)总线或其他类型的I/O总线。
系统400可包括动态存储设备(称为主存储器416),或耦合到处理器总线412以存储由处理器402-406执行的信息和指令的随机访问存储器(RAM)或其他设备。主存储器416还可用于存储处理器402-406执行指令期间的临时变量或其他中间信息。系统400可包括耦合到处理器总线412以存储处理器402-406的静态信息和指令的只读存储器(ROM)和/或其他静态存储设备(未示出)。
主存储器416或动态存储设备可包括磁盘或光盘,用于存储信息和指令。I/O设备430可包括显示设备(未示出),例如阴极射线管(CRT)或液晶显示器(LCD),用于向最终用户显示信息。例如,安装状况的图形和/或文本指示、试用期的剩余时间以及其他信息可在显示设备上呈现给潜在购买者。I/O设备430还可包括输入设备(未示出),例如字母数字输入设备,包括字母数字键和其他键,用于将信息和/或命令选择传送给处理器402-406。另一类用户输入设备包括光标控制,例如鼠标、轨迹球或光标方向键,用于将方向信息和命令选择传送给处理器402-406以及用于控制显示设备上的光标运动。
系统400还可包括通信设备(未示出),例如调制解调器、网络接口卡或其他公知接口设备,例如那些用于耦合到以太网、令牌环或其他类型的物理附接的设备,以例如用于提供通信链路来支持局域网或广域网。换言之,系统400可经由传统网络基础设施(例如公司的内部网和/或因特网)与多个客户和/或服务器相耦合。
应认识到,比上面描述的实施例装备得更多或更少的系统对于某些实现方式来说可能是所期望的。因此,系统400的配置可在实现方式之间有所不同,依赖于各种因素,例如价格约束、性能需求、技术改进和/或其他情况。
应注意,尽管这里描述的实施方案可在经编程的处理器(例如处理器402-406)的控制下执行,但是在其他实施方案中,所述实施方案可全部或部分地由可编程或硬编码逻辑来实现,例如现场可编程门阵列(FPGA)、晶体管-晶体管逻辑(TTL)逻辑或专用集成电路(ASIC)。另外,本发明的实施方案可由经编程的通用计算机组件和/或定制硬件组件的任何组合来执行。因此,不应将这里公开的任何内容理解为将本发明的各个实施方案限制为特定实施方案,其中所引用的实施方案可由硬件组件的特定组合执行。
图5的框图示出了多线程处理器500的实施方案,用于实现本发明的一个或多个实施方案。根据一个实施方案,处理器500可形成为单个集成电路。根据另一个实施方案,多个集成电路可一起形成处理器500,而根据本发明再一个实施方案,硬件和软件例程(例如二进制翻译例程)可一起形成处理器500。处理器500可包括图4的处理器402-406中的一个或多个。如图所示,总线/存储器控制器520可将用于执行的指令提供给前端530。前端530可根据指令指针570,指引从各个线程取得指令。指令指针逻辑可被复制以支持多线程。
根据一个实施方案,前端530可将指令馈送到线程/处理器可划分资源540作进一步处理。线程/处理器可划分资源540可包括当在处理器500内有多个线程活动时,可逻辑分割成专用于特定线程的分区。线程/处理器可划分资源540例如可包括指令队列。当处于单线程模式中时,线程/处理器可划分资源540的分区可组合来形成专用于该一个线程的单个大分区。
根据一个实施方案,处理器500还可包括复制的状态580。复制的状态580可包括足以维护逻辑处理器的上下文的状态变量。利用复制的状态580,可执行多个线程而不会争用状态变量存储。另外,寄存器分配逻辑可为每个线程进行复制。所复制的状态相关的逻辑可利用适当的资源分区进行操作,来准备到来的指令,以用于执行。
根据一个实施方案,线程/处理器可划分资源540可将指令传递给共享资源550。共享资源550可对指令进行操作而不考虑其来源。例如,调度器和执行单元可以是线程不敏感(thread-unaware)的共享资源。可划分资源540可通过以对每个活动线程提供持续进展的公平方式在线程之间交替,将来自多个线程的指令馈送到共享资源550。
根据一个实施方案,共享资源550可后跟有另一组线程/处理器可划分资源560。线程/处理器可划分资源560可包括隐退(retirement)资源,例如重排序缓冲区。相应地,线程/处理器可划分资源560可确保来自每个线程的指令的执行会适当地结束,并且适当地更新该线程的适当的状态。
根据一个实施方案,可向程序员提供一种机制,以通过睡眠-唤醒比较和交换来实现有效同步这一功能,而无需经常轮询存储器位置或甚至无需执行指令。例如,存储器访问监视器510可用与某存储器访问位置有关的信息来编程,其中可使得存储器访问监视器510能够监视该位置。相应地,存储器访问监视器510可包括监视器位置信息寄存器512,其中使用比较逻辑514来将监视器位置信息寄存器512与从总线/存储器控制器520接收的存储器位置信息作比较。
监视器位置信息寄存器512可包括指定了可触发指令的恢复或唤醒的周期类型和/或地址的细节。监视器510可包括超时计数器以开始恢复信号。另外,监视器510可包括寄存器512,寄存器512包括与来到总线的信息匹配的地址。进行总线和寄存器512(例如具有所述超时计数器)之间的比较。任何周期都可具有显式写周期的形式,并且/或者可以是为了获得占有权的读(例如导致排他占有缓存线的动作)或另一个主体尝试来取得可缓存线的排他占有权的无效周期。
图6的框图示出了系统600的实施方案,系统600具有使用CMPXCHG_SW机制614-618的多个处理器602-606。如图所示,系统600包括争用锁634的多个处理器602-606,其中锁634被分配来控制对存储器632中的共享空间/变量636的访问(如箭头638所示)。在所示出的实施方案中,处理器602-606中的每一个都使用CMPXCHG_SW机制614-616,CMPXCHG_SW机制614-616可以是实现在每个处理器602-606上的硬件,并使用基于软件的同步代码来执行。还对每个处理器602-606示出了示例性指令序列620-624,以澄清和更好地理解实施方案。
如图所示,CMPXCHG_SW指令608在处理器602上执行,处理器602成功地获得了锁634,以访问共享存储器空间636。存储器632的共享空间636可用在处理器602占有信号量的期间,但处理器602在获得过程中可以排他性状态获得锁634,并防止对锁634发生其他动作。之后,共享状态可用来共享锁634的拷贝。在一个实施方案中,当另一个处理器604-606尝试获得非空闲的锁634时,将处理器604-606处的CMPXCHG_SW指令610-612置于睡眠。换言之,例如当处理器604试图获得已被获得的锁634时,从存储器632返回一个值,表明锁634正为处理器602所用,并且在一个实施方案中,不是将处理器604置于持续的“while”循环中直到锁634变得可用,而是将处理器604处的CMPXCHG_SW指令610置于睡眠。类似地,当处理器606寻求的竞争锁634忙时,将处理器606处的CMPXCHG_SW指令612也置于睡眠。
在一个实施方案中,将CMPXCHG_SW指令610-612置于睡眠状态表明CMPXCHG_SW指令610-612空闲并正在等待事件来唤醒或触发它。当CMPXCHG_SW指令610-612处于空闲或睡眠状态时,处理器606-608可继续执行其他任务,例如执行其他指令628-630(尽管指令628-630可能不会被隐退)直到较老的CMPXCHG_SW指令610-612被唤醒、执行并隐退。换言之,任何后续的加载(例如指令628或630)可在处理器604-606中获得其值、执行某些任务和计算,但在一种尝试性或推测性的状态中等待,直到睡眠的CMPXCHG_SW指令610-612被唤醒。可乱序执行来自重排序缓冲区(ROB)的任何指令;但是,不能隐退仍处于推测阶段的新的或较年轻的指令628-630,直到最老的CMPXCHG_SW指令610-612被唤醒并隐退。
在CMPXCHG_SW指令610-612睡眠期间,让处理器604-606执行各种任务而不是继续转圈等待(加载并比较)本地共享拷贝,这有助于避免处理器604-606被阻塞或瓶颈化。这一技术有助于节省功率和时间,并提高了性能。该技术还有助于在没有在同步进程之间进行动态数据共享的情况下的并发推进。例如,假设锁634保护了一个哈希表以防止多个进程同时更新它,并且如果两个进程必须要更新该哈希表的不同部分(例如向不同的容器(bin)添加元素),则该技术可使得两个进程同时动作。这有别于让一个处理器进行更新的同时完全阻塞任何其他处理器上的所有有用的工作,即使它不会动态干扰任何其他处理器。例如,处理器602可占有锁,定位适当的哈希表容器并用其值更新它。同时,不占有锁的处理器604也可定位适当的容器,准备要写的值和位置,但不隐退更新哈希表的指令直到处理器604能够获得锁并隐退CMPXCHG_SW指令608。
在一个实施方案中,CMPXCHG_SW指令610-612的唤醒可用事件的发生来触发,例如锁634的释放(并变得可用)或当具有锁634的处理器602作出尝试(在示例性指令序列620中)以重写锁值时(这表明锁634可能的可用性)。例如,在指令610处于睡眠状态时,处理器604可通过寻求新锁值(例如锁被释放)或观测处理器改变锁值的尝试(例如锁可能被释放、包括共享空间636的缓存线的无效、包括锁634的缓存线的无效)来监视锁634的可用性。处理器作出改变锁值的尝试(例如处理器602无效处理器604-606的缓存(未示出)中的变量以获得写锁变量的排他占有权)时,触发CMPXCHG_SW指令610的唤醒。处理器604然后读新值并再一次地请求获得共享空间636中的634(例如锁变量),并且响应于该请求,接收锁变量634,执行并隐退CMPXCHG_SW指令610,并随后还隐退任何其他指令628(CMPXCHG_SW指令610睡眠期间被执行)。通过将指令610置于睡眠,处理器604避免了持续流经典型的加载、比较和分支序列,有助于增加效率和节省功率。
在一个实施方案中,CMPXCHG_SW机制614-618有助于避免产生基于软件的转圈循环,因为等待(“while”循环)可以硬件实现。在一个实施方案中,CMPXCHG_SW机制614-618是基于硬件和/或软件的,将“while”循环结合到CMPXCHG指令610-612的睡眠中,这有助于避免持续运行“while”循环。用于实现和同步机制614-616的示例性同步代码包括eax(accumulator)=0 //0表示空闲ecx=1//1表示锁定labelcmpxchg[lock_var],ecx; //如果lock_var=0,则设置为1zf,设置//lock_var=1,否则睡眠jne lable //如果未能获得,则再次尝试instr1;//临界区指令instr2;//临界区指令lock_var=0; //解锁其中,eax和ecx(以及ebx、edx等等)指各种寄存器,通常也称为R1或Reg1、R2或Reg2、R3或Reg3等等,zf指处理器的零标志状况寄存器,jne(如果不等则跳转)指确定尝试是否成功,如果不成功则它分支回到标签(例如jne label)以执行指令。
图7的流程图示出了用于执行CMPXCHG_SW机制的过程的实施方案。首先,在处理框702,多处理器系统中的处理器寻求获得锁。可以认为该寻求可能不需要排他占有锁,而是可以共享状态获得该锁。在判断框704,确定锁是否可用。如果锁可用,则处理器在处理框706处利用传统的比较和交换操作获得它。
在一个实施方案中,如果锁不可用,则处理器处的CMPXCHG_SW指令被置于睡眠,直到例如它在处理框708处被锁值的改变(或尝试的改变)所唤醒。换言之,一旦来自存储器的值被返回到表明锁不可用的处理器后,正寻求锁的处理器处的CMPXCHG_SW指令被置于睡眠,而不是让CMPXCHG_SW指令持续地在“while”循环中转圈并在每次循环重复请求该锁。在处理框710,处理器的存储器系统监视锁值的任何改变,其中所述改变可能表明锁的可用性或可能的可用性。例如,具有对锁的访问权的处理器可尝试来改变锁值以释放该锁,以使其他处理器进行寻求并获得。任何这种活动都可被存储器系统观测到,并可唤醒睡眠中的CMPXCHG_SW指令以关注可能的锁可用性。
在一个实施方案中,在CMPXCHG_SW指令睡眠期间,处理器的存储器系统监视锁值的改变。而且,在处理框712,其他指令(包括ROB中的其他CMPXCHG_SW和加载指令)可被加载并执行,以使得处理器可继续执行其他任务。换言之,处理器处的CMPXCHG_SW指令的睡眠不仅没有将处理器置于持续的转圈或“while”循环中,它也不使该处理器被阻塞或无用。相反,尽管是乱序的,但可加载任意数量的后续指令到临界区中作推测式执行,然而不能隐退比睡眠中的CMPXCHG_SW指令更年轻的指令,直到最老的指令(例如睡眠中的CMPXCHG_SW指令)被隐退。没有处理器被阻塞,并且它们继续执行有用的任务,节省了功率和时间并提高了性能。
在判断框714,确定锁值是否改变了或已有尝试来重写该值。如果否,则在处理框712继续执行其他指令的过程。但是,如果已有尝试来改变锁值或者如果该值已被改变,则在处理框716触发睡眠中的CMPXCHG_SW指令的唤醒。一旦CMPXCHG_SW指令被唤醒并且锁变得可用后,处理器在处理框706获得锁。作为唤醒CMPXCHG_SW指令的一部分,然后可隐退CMPXCHG_SW指令。另外,还可隐退临界区中已被推测式执行的任何后续指令。
图8的框图示出了用于实现CMPXCHG_SW机制的状态机800的实施方案。如果处理器中缓存线可用并且锁可用,则通过初始软件“while”循环并执行指令(例如CMPXCHG_SW指令)。如图所示,发射加载802。如果存在缓存线的命中804并且在读该值之后,则确定锁可用(锁是“未锁定的”),发出请求以获得缓存线的读占有(RFO)806。然后,开始用于原子化地获得锁的机制,这导致各种微指令(uop)例如加载的启动。
在一个实施方案中,发射加载802,但缓存线要么产生缺失,要么另一个处理器正持有它(例如被锁定)810,或者仅仅是缓存中没有足够的数据要读或了解它是否被锁定。这可能要花一些时间来将它传过总线,可能要花费几个时钟来执行。这导致加载在存储器排序缓冲区(MOB)中的睡眠812。MOB 812用来包括加载和存储缓冲区,以及确保维护适当的存储器操作排序。MOB还用来重发射由于某种原因而未完成的加载,所述原因例如是缓存缺失、存储器重排序依赖性、睡眠状况等等。而且,MOB跟踪加载没有完成的原因,并在防止完成的状况被处理后将它们唤醒。在一个实施方案中,数据位于缓存中,在读所述值后,确定它被锁定810(例如另一个处理器拥有它)。这还导致加载转到在MOB中睡眠812。在一个实施方案中,(1)缓存线变得可用(例如它现在处于处理器的缓存中)或(2)另一个处理器尝试重新变量中的值(可能使缓存线可用)二者中的一项,可以触发加载的唤醒814。重发射加载816,并且如果缓存线可用(例如存在命中)并在读所述值之后,确定锁可用(已解锁)818,发出获得占有权的请求806。但是,如果存在另一次缺失820,则加载返回到睡眠812。
在一个实施方案中,可引入超时计数器来限制睡眠时间。例如,开始超时计数器822后,睡眠时间在自处理器开始睡眠812起,特定量的时间过去后结束。换言之,处理器放弃被另一个处理器或事件唤醒,相反,它执行其他任务(例如转到处理步骤806)。例如,超时计数器在锁被非活动的处理器占有(这可能会使得其他处理器在几乎没有或根本没有机会获得锁的情况下进行等待)时可能是必需的。在一个实施方案中,在被超时计数器唤醒时,指令可尝试来获得锁,并可在不成功的状况下隐退。在另一个实施方案中,在被唤醒时,指令可取消(abort)获得锁的尝试,并简单地在不成功的状况下隐退。另外,等待锁的处理器(例如有处于睡眠模式的CMPXCHG_SW指令的处理器)发生超时824,放弃获得特定的锁,并执行其他任务以继续保持有效。另外,超时824可使得从睡眠状态812退出,表明处理器在一段时间里寻求获得锁,但超时824不能见证表明另一个处理器正在写该线的缓存线无效。
CMPXCHG机制可实现在任何多种的微处理器体系结构中并与其兼容,例如英特尔的奔腾处理器。这些体系结构的改变对处理器的MOB和数据缓存单元(DCU)来说可能是最小的,其中可将用于实现“睡眠”模式的状态机800防止在DCU中。例如,存储器系统中的3位数据可用来表明锁定或未锁定,因此可与寄存器(例如eax)的最低3位进行比较。但是,存储器系统中的任何数量的位(例如32)可用来表明锁定/解锁状态,并且该数量可以任何必需或所期望的方式来划分(例如用于锁定或解锁的位不一定相等)。而且,CMPXCHG_SW机制可使用值0和1来分别作为解锁和锁定值,因此3个最低有效位可能是足够了。在一个实施方案中,线程可插入标识(ID)值而非1和0来表明所述状况。另外,任何非零值都可表明锁定而值0可表明空闲。在一个实施方案中,如果预期空闲值和从存储器加载的位的值的3个位不同,则锁可被认为是非空闲;但是,如果所述值匹配,则锁可以也可以不被认为是空闲。例如,所述比较可能表明当前值和解锁值之间的部分匹配。部分匹配可开始操作来尝试获得锁(例如处理框806和808)。但是,当使用CMPXCHG_SW机制比较了所有的位时,该操作可发现锁被另一个处理器获得了,并且可采用代码中的分支并再次尝试。
在一个实施方案中,例如,比较器保持eax[2:0](例如eax的较低3位)的值,当从缓存(例如L1缓存)返回数据用于load_with_store_intent(具有存储目的的加载)uop时,将它与eax比较器进行比较。load_with_store_intent uop是CMPXCHG指令的构成uop,加载正被用作为锁变量的存储器位置的值。如果二者相等,则将该值写回到写回总线上。如果二者不等,则DCU取消写回,将加载在MOB中置于睡眠,并开始超时计数器。如果MOB检测到对锁缓存线的无效探听(snoop),则它唤醒并重新派发该load_with_store_intent uop。然后在每个时钟处递减超时计数器。当它等于0时,DCU可发送超时信号到MOB。MOB在接收到超时信号时派发load_with_store_intent uop。在该派发期间,load_with_store_intent uop执行到完成并隐退,而不管所述比较的结果如何。
应认识到,在前面对本发明的示例性实施方案的描述中,有时将本发明的各个特征组合在单个实施方案、附图、或其描述中以更流畅地进行公开,有助于理解各个创造性方面中的一个或多个方面。虽然在附图中描述并示出了某些特定实施方案,但是应理解到这些实施方案仅仅是示意性的而非限制性的,并且,本发明的实施方案并不局限于所示出和描述的特定实施方案和设置,因为本领域的普通技术人员在阅读本公开内容后可作出许多修改。
权利要求
1.一种方法,包括执行处理器处的指令以帮助代表该处理器获得锁;以及如果所述锁不可用,则将所述处理器处的所述指令置于睡眠,其中所述指令进行睡眠直到事件发生。
2.如权利要求1所述的方法,还包括监视对应于所述锁的存储器地址,其中所述锁用于控制对存储器的共享存储器空间的处理器访问。
3.如权利要求1所述的方法,其中所述指令包括比较和交换指令,用于执行比较和交换操作以由所述处理器获得该锁,所述比较和交换操作包括原子化比较和交换操作。
4.如权利要求1所述的方法,还包括监视具有锁值的目的地,以确定是否已发生所述事件,所述目的地的所述监视包括观测下述中的一个或多个所述锁值的改变以及改变所述锁值的尝试,其中所述目的地包括寄存器或存储器位置;检测所述事件的发生;当已发生所述事件时唤醒所述指令,其中所述事件包括下述中的一个或多个如果所述锁值已改变,所述锁变得可用,以及如果已发生改变所述锁值的尝试,所述锁可能变得可用;以及所述处理器获得所述可用的锁。
5.如权利要求1所述的方法,其中所述将所述指令置于睡眠的操作包括放弃资源以使所述处理器可用来执行包括下述中的一个或多个的其它任务加载多个指令以及执行所述多个指令。
6.如权利要求5所述的方法,其中所述放弃所述资源的操作包括放弃寄存器池中的多个寄存器;放弃指令队列中的多个指令队列条目;放弃存储缓冲区中的多个存储缓冲区条目;以及放弃重排序缓冲区中的多个重排序缓冲区条目。
7.一种处理器,包括执行单元,其能够执行指令以代表该处理器获得锁;以及睡眠-唤醒机制,用于如果所述处理器不能获得所述锁,则将所述指令置于睡眠,其中所述指令被置于睡眠直到事件发生。
8.如权利要求7所述的处理器,其中所述指令包括比较和交换指令,用于执行比较和交换操作以由所述处理器获得该锁,所述比较和交换操作包括原子化比较和交换操作。
9.如权利要求7所述的处理器,还包括监视逻辑,用于监视具有锁值的目的地,以确定是否已发生所述事件,所述目的地的所述监视包括观测下述中的一个或多个所述锁值的改变以及改变所述锁值的尝试,其中所述目的地包括专用寄存器或存储器位置;检测逻辑,用于检测所述事件的发生;以及所述睡眠-唤醒机制,用于当已发生所述事件时唤醒所述指令,其中所述事件包括下述中的一个或多个如果所述锁值已改变,所述锁变得可用,以及如果已发生改变所述锁值的尝试,所述锁可能变得可用。
10.如权利要求7所述的处理器,其中所述将所述指令置于睡眠包括放弃资源以使所述处理器可用来执行包括下述中的一个或多个的其它任务加载多个指令以及执行所述多个指令。
11.如权利要求10所述的处理器,其中所述放弃所述资源包括放弃寄存器池中的多个寄存器;放弃指令队列中的多个指令队列条目;放弃存储缓冲区中的多个存储缓冲区条目;以及放弃重排序缓冲区中的多个重排序缓冲区条目。
12.如权利要求7所述的处理器,还包括将所述处理器耦合到存储器的总线接口单元,该总线接口单元还包括所述专用寄存器。
13.如权利要求7所述的处理器,还包括具有包括所述比较和交换指令在内的多个指令的指令集。
14.一种系统,包括多个处理器,包括具有下述部件的第一处理器执行单元,其能够执行指令以代表该第一处理器获得锁,以及睡眠-唤醒机制,用于如果所述第一处理器不能获得所述锁,则将所述指令置于睡眠,其中所述指令被置于睡眠直到事件发生;与所述多个处理器耦合的存储器,该存储器具有由所述多个处理器共享的存储器空间;以及与所述存储器和所述多个处理器耦合的锁存储位置,该锁存储位置具有所述锁以控制对所述存储器空间的访问。
15.如权利要求14所述的系统,其中所述指令包括比较和交换指令,用于执行比较和交换操作以由具有逻辑处理器或线程的所述第一处理器获得该锁。
16.如权利要求14所述的系统,还包括监视逻辑,用于监视具有锁值的目的地,以确定是否已发生所述事件,所述目的地的所述监视包括观测下述中的一个或多个所述锁值的改变以及改变所述锁值的尝试,其中所述目的地包括专用寄存器或存储器位置;检测逻辑,用于检测所述事件的发生;以及所述睡眠-唤醒机制,用于当已发生所述事件时唤醒所述指令,其中所述事件包括下述中的一个或多个如果所述锁值已改变,所述锁变得可用,以及如果已发生改变所述锁值的尝试,所述锁可能变得可用。
17.如权利要求14所述的系统,其中所述将所述指令置于睡眠包括放弃资源以使所述第一处理器可用来执行包括下述中的一个或多个的其它任务加载多个指令以及执行所述多个指令。
18.如权利要求17所述的系统,其中所述放弃所述资源包括放弃寄存器池中的多个寄存器;放弃指令队列中的多个指令队列条目;放弃存储缓冲区中的多个存储缓冲区条目;以及放弃重排序缓冲区中的多个重排序缓冲区条目。
19.一种机器可读介质,其上存储有代表指令集的数据,所述指令集被机器执行时使得所述机器执行处理器处的指令以帮助代表该处理器获得锁;并且如果所述锁不可用,则将所述处理器处的所述指令置于睡眠,其中所述指令进行睡眠直到事件发生。
20.如权利要求19所述的机器可读介质,其中所述指令集被所述机器执行时还使得该机器监视对应于所述锁的存储器地址,其中所述锁用于控制对存储器的共享存储器空间的处理器访问。
21.如权利要求19所述的机器可读介质,其中所述指令包括比较和交换指令,用于执行比较和交换操作以由所述处理器获得该锁,所述比较和交换操作包括原子化比较和交换操作。
22.如权利要求19所述的机器可读介质,其中所述指令集被所述机器执行时还使得该机器监视具有锁值的目的地,以确定是否已发生所述事件,所述目的地的所述监视包括观测下述中的一个或多个所述锁值的改变以及改变所述锁值的尝试,其中所述目的地包括寄存器或存储器位置;检测所述事件的发生;当已发生所述事件时唤醒所述指令,其中所述事件包括下述中的一个或多个如果所述锁值已改变,所述锁变得可用,以及如果已发生改变所述锁值的尝试,所述锁可能变得可用;以及代表所述处理器获得所述可用的锁。
23.如权利要求19所述的机器可读介质,其中所述将所述指令置于睡眠包括放弃资源以使所述处理器可用来执行包括下述中的一个或多个的其它任务加载多个指令以及执行所述多个指令。
24.如权利要求23所述的机器可读介质,其中所述放弃所述资源包括放弃寄存器池中的多个寄存器;放弃指令队列中的多个指令队列条目;放弃存储缓冲区中的多个存储缓冲区条目;以及放弃重排序缓冲区中的多个重排序缓冲区条目。
全文摘要
提供了一种方法、装置和系统,用于执行使用睡眠-唤醒机制的比较和交换操作。根据一个实施方案,执行处理器处的指令来帮助代表该处理器获得锁。如果锁不可用于由该处理器来获得,则将指令置于睡眠,直到事件发生。
文档编号G06F15/16GK1716186SQ20051007980
公开日2006年1月4日 申请日期2005年6月29日 优先权日2004年6月30日
发明者布拉廷·萨哈, 马修·默藤, 珀尔·哈马伦德 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1