高效同步多线程的制作方法

文档序号:6650601阅读:244来源:国知局
专利名称:高效同步多线程的制作方法
背景本发明涉及计算机系统,尤其是这种运行多线程的系统。
包括多处理器(MP)和单处理器系统的计算机系统可包括许多“线程”,每个线程独立于其它线程运行程序指令。多处理器的使用允许多任务或功能,甚至多应用程序,以使处理效率更高速度更快。使用多线程或处理器意味着两个或更多处理器或者线程能够共享存储在系统中的同一数据。然而,当共享数据时,必须注意保持存储器排序。
为了达到数据连续的目的,如果多线程或处理器要读取、修改及向单存储器写入,那么就不允许多代理同时对数据执行操作。进一步,多处理器的复杂应用是数据通常存储在与处理器相连的高速缓存中。由于这种高速缓存典型地位于专门的处理器内,多处理器的计算机系统中的多高速缓存能够包括给定数据项目的不同拷贝。访问此数据的任意代理应当收到有效或更新(即最新)的数据值,并且从高速缓存中回写到存储器中的数据必须为当前数据,以使保持高速缓冲存储的一致性。
存储器指令处理按照目标指令集体系结构(ISA)存储器序列模式执行。作为参考,Intel公司的两个主要ISAs:Intel体系结构(IA-32或x86)和Intel’sITANIUM处理器家族(IPF)具有完全不同的存储器序列模式。在IA-32中,加载(即读取)和存储(即写入)操作在程序序列中必须是可见的,然而在IPF体系结构中,通常不是这样。更进一步,当在芯片多处理器(CMP)或其它多处理器系统中执行多线程时,已排序的存储器指令用于不同线程间的同步和通信。
多线程(MT)软件使用不同的机制以在不同线程间发生作用和调整。多处理器同步的两个主要形式为障碍和信号螺旋锁。障碍机制帮助程序在程序的预定点上同步不同线程。典型地,当其达到这个点时,每一线程增加或减少原子方式中的存储器变量。然后每一线程等待存储器变量达到预定的障碍水平。一旦所有线程完成更新,就达到了同步。当达到障碍时,所有线程就可以继续。
当访问共享存储器变量或结构(即共享元素)时,信号螺旋锁机制用于确保多线程间的互斥。为了提供共享元素的唯一一致的视图,需要有一锁变量来保证。需要访问共享元素的每一线程必须通过原子信号量操作获得保证锁(即锁定)。当得到锁时,只能当其被释放以后(即解锁),通过最初的请求,剩余的线程才能获得锁。只能获得锁的线程才能对共享元素(软件约定)执行操作/更新,于是就确保了互斥。锁定通过指定特殊值表示已锁定状态来执行,并且不同的值表示未锁状态。寻找访问共享元素的每一线程,通过自动更新锁变量为锁值来得到锁(当检查到锁还没有被获得后)。
大多数ISA’s提供特定信号指令以在多线程或处理器间得到多处理器同步。其中,原子增加是障碍同步机制的通用指令。然而,已知的障碍同步方法和信号螺旋锁很低效。当锁变量移向多处理器的不同核心时,障碍机制典型地需要有效通信量,如内处理器高速缓存通信量。同样,螺旋锁机制需要不同处理器核心中的有效通信量。更进一步,原子增加指令需要共享变量深入处理器核心以执行增加操作,重新请求有效通信量,以及利用处理器资源。因此,需要改进多线程间的同步方式。
附图的简要描述

图1是依据本发明一个实施例中的方法的流程图;图2是依据本发明一个实施例中的同步方法的流程图;图3是依据本发明一个实施例中的锁定方法的流程图;图4是依据发明一个实施例中的代表系统的方框图;图5是依据发明另一个实施例中的多处理器系统的方框图。
详细描述在许多实施例中,共享存储器变量(“共享变量”)可用于保持多线程间的同步。共享变量可有多个部分,每一部分都单独与线程之一相关。在这种模式中,共享变量可独立表示每一线程的同步状况。
在某些实施例中,可使用集合体系机制而不是算法操作来更新共享变量,例如增加或减少操作。在这种模式中,在不引起共享变量高速缓冲或进入处理器核心的情况下,可更新不同线程的状况。即,设置/重设操作可以远程或最近电平高速缓存来执行。此外,这些操作可不使用昂贵的加法器或者其它需要位于接近运行核心的电路来执行。
在一实施例中,这里提到的指令fetchset指令可为低耗指令以改进多线程同步,尤其是低线程数的情况。作为通过给定线程执行的fetchset指令对共享变量或集合执行读取,或者根据此线程,存储预定数据到共享变量部分。例如,在有八个或更少的线程运行的实施例中,共享变量可为8个字节。共享变量的每一字节与线程之一相对应。在一个实施例中,预先设定的数值可全部为“1”。例如,fetchset1在给定部分的特定存储器地址上存储FFhex(即11111111)。由于设置(即重写)存储器状态比执行读取—增加—更新操作花费少,这种指令可能为低耗的。
然而如上面所讨论的,每一线程需要字节,在其它实施例中,可能存在不同排列。例如在一个实施例中,单比特可用于表示线程。更进一步,然而如上面所讨论的,当将预先确定的数据设为1时,在其它实施例中可用到任何预期的数值。
现在参考图1,它表示依据本发明的一个实施例中的方法的流程图。更具体地是,图1表示了依据一个实施例执行fetchset指令的方法10。此fetchset指令用于访问共享存储器变量,并存储数据在对应于给定线程的变量的部分中。如图1中所示,fetchset操作初始化(椭圆20)。然后读取第一存储器变量(方框30)。第一存储器变量与用于表示障碍的多线程同步状态的共享变量相对应。线程读取变量来确定变量的所有部分是否与给定数值相等,或者确定变量的特定部分是否为锁定状态,正如下面将要进一步讨论的。
仍然参考图1,接下来,对应于当前线程的第一存储器变量的一部分用预定数值来设定(方框40)。例如,存储器变量的第一部分(如第一字节)可对应于程序的第一线程。在运行fetchset指令时,第一线程可设为那个部分。在一个实施例中,部分可全用1来设定。然后方法10结束(椭圆50)。
当不是如图1中所示的,可以理解的是,当达到障碍时,每一线程对变量执行fetchset指令,并且预定数值存储在变量中的特定位置。当设定存储器变量的所有字节时,就建立了同步。
现在参考图2,表示了依据本发明的一个实施例的同步方法的流程图。如图2中所示,方法100可用于同步程序的多个线程。通过运行给定线程的指令(方框110),方法100开始(椭圆105)。下面确定线程是否达到障碍(菱形120)。例如,障碍对应于预想同步的程序的预定部分。如果没有达到这种障碍,线程继续执行指令,回到方框110。
可选的是,如果线程确实达到障碍,控制传给方框130,在其中对第一存储器变量执行fetchset操作。第一存储器变量可通过多个线程存储在可得到的高速缓存中。这种fetchset操作可包含上文根据图1所述的步骤。即,这种fetchset操作使线程读取第一存储器变量的内容,并为对应于当前线程的第一存储器变量的部分设定值。下面将要确定的是当前线程是否为达到障碍的最后一个(菱形140)。例如,在一个实施例中,线程读取变量内容并确定是否所有部分与设定值相同。然而,在某些实施例中,设定值在第一变量的所有部分中是当前的,除了对应当前线程的部分。如果当前线程不是达到障碍的最后一个,控制传递到方框150,在其中线程在第二存储器变量上螺旋直到它被更新。第二存储器变量也可存储在高速缓存中。
如果当前线程是达到障碍的最后一个,就更新第二存储器变量(方框160)。例如,第二存储器变量有从0到1的更新内容。当程序的所有线程都达到障碍,并且第一、第二存储器变量的内容都设定时,控制就继续到方框170,在其中同步完成。这样,方法100结束(椭圆180)。
由于执行fetchset指令的低耗,及其在字节粒度上的定义,变量的设定就输出到CMP或其它处理器共享的末级高速缓存(LLC)。以这种方式,能够阻止包括变量的高速缓存界线被拷贝到每一障碍更新上的核心中(靠近运行管道)。于是,可以避免根据不同核心移动锁定变量的内处理器高速缓存信号量。通过避免错误地共享在高速缓冲存储块及避免对存储器变量的任何读取或更新(这将引起高速缓存界线的拷贝进入到核心高速缓存储器中),可使用软件以确保高速缓存界线在LLC中保持连接。
其它实施例可用于使用单变量来提供细粒度锁定。例如,一个16字节fetchset指令可表示16细粒度锁。在这种实施例中,包括16个数据元素的数据结构可使用一共享变量来锁定。在锁变量中,数据结构的每一元素分配一个字节。然后,只有结构的那部分使用fetchset指令来锁定。以这种方式,只要将要访问的特殊元素没有被锁定,就允许非模块对同一结构的访问。如果通过对第一线程的fetchset操作所返回的初始值在特定字节位置上是清楚的,那么第一线程就成功锁定了那个元素。然而如果已经设定字节位置,那么项目已经被不同的线程锁定。因此,稍后,锁定操作需要被第一线程所重试。
现在参考附图3,它表示对应本发明的一个实施例的锁定方法的流程图。如图3中所示,方法200可用于锁定使用许多细粒度锁的数据结构。通过寻找访问由锁支配的数据结构的指令(方框210),方法200开始(椭圆205)。Fetchset操作,与图1中所示的相似,可对与数据结构(方框220)相关的共享变量执行操作。然而,对于图3的实施例,图1中方框40可改为用于设定存储器变量一部分的预定数值,此存储器变量与数据结构的给定数据元素相对应。
读取共享变量后,可以确定对应于数据元素的变量部分是否被锁定(菱形230)。例如,在一个实施例中,可以确定此部分是否设定(即具有数据1)。如果此部分表示数据元素已被锁定,就不再允许线程访问数据元素,并且随后重试fetchset操作(方框240)。以这种方式,如果不同线程已经结束了数据元素上的操作,下面线程访问共享变量,特定部分可能处于重新设置状态。
反之如果在菱形230上,确定共享变量部分未被锁定,此部分可被锁定(方框250)。那么当前线程可更新对应于数据结构那部分的数据元素(方框260)。例如,线程更新数据元素,并将已更新的数据重写到其存储器位置上。然后,线程解锁共享变量的那部分(方框270),以使其它线程能够获得给定数据元素上的锁。这样,方法200结束(椭圆280)。
在许多实施例中,由于fetchset或其它指令支持预定义的更新有效载荷(即预定义数值),有效载荷就在运行指令的特定高速缓存上同步。作为结果,当指令流过机器时,对共享变量的更新通过软件错误来阻止有效负载的讹误。
更进一步,由于每一线程的同步是独立的,它提供了加强的障碍同步体系结构。任何未能报告障碍的线程在共享变量中都没有其字节定位集。在这种方式下,任何引起软件故障的错误线程(不论是由于软件或硬件故障)都是独立的,并基于共享变量的状态来识别。然后软件选择性地对特殊线程执行恢复。
Fetchset指令(即fetchset.double)的16字节变量可定义为在16字节粒度上操作,并在16个线程中提供同步。
在某些实施例中,分级障碍体系结构可用于建立在具有大线程数目的软件中的同步。在这种实施例中,在建立CMP处理器或集群系统的本地集群内建立同步的较低层次上,以fetchset为基础的体系结构的可作为高效障碍体系结构。
现在参考下面的表1,表示根据本发明一个实施例中的fetchset指令的指令语法。如表1中所示,指令语法在IPF ISA的范围内。
表1fetchset.dbl.p1.sz.sem r1,[ar.csd]=[r3]dbls-读取8字节d---读取16字节。第二个8字节目标ar.csd.
p10---清除(‘0个有效载荷)1---设置(‘1111....个有效载荷)sz0---1个字节1---2个字节2---4个字节3---8个字节4---16个字节(当dbl设为d时才有效)semacq---获取rel---释放注当dbl设为d时才ar.csd应用)如表1中所示,指令语法表示执行8字节或16字节读取操作;将被写入到特定位置的有效载荷;大小;信号量的类型,如为获取或释放操作。
现在参考下面的表2,表示根据本发明的一个实施例,利用fetchset指令建立障碍同步的伪代码例子。此外,尽管本发明的范围不限于此,这个伪代码是在IPF内容中。
表2//r20包括障碍地址.
//r40包括共享存储器变量stf.spill[r20]=f0stf.spill[r40]=f0//注此行写入16字节的数值0到目标记录中mov r30=‘hFFFFFFFFFFFFFFFF;;mov ar.csd=r30;;//注此行将fetchset操作的第二操作数移到目标记录中//开始独立线程—电平运行.
.
.
//完成线程运行fetchset.d.l.rel r10,ar.csd=[r20],0;;cmp.eq p1,p2=r10,r30//注如果记录数值相等,p1设为1,p2设为0,否则反之mov r35=ar.csd;;cmp.eq.and p1,p2=r10,r35;;p1stf.spill[r40]=f1;;p1br sync_cmp//注如果p1等于1,操作转向sync_cmp(即同步完成)spin_loopldff19=[r40]fcmp.eq p1,p2=f19,f1;//注如果目标数值相等,p1等于0,p2等于1,操作转向sync_cmp(即同步完成),否则反之,并重复spin_loopp2br spin_loopsync_cmp//同步完成总之,表2中的代码执行下面的行为。首先,代码初始化将要存储共享变量的高速缓存中的位置,并进一步初始化共享变量为0。然后,独立线程运行。一旦线程完成,通过每一线程读取共享变量的数值并与预定数值相对比,执行fetchset指令。如果共享变量与该值相等,就表示当前线程为最后线程,并且完成同步。如果不等,当前线程更新其共享变量的位置,并输入螺旋循环,直到最后线程完成其运行以完成同步,现在参考图4,它表示依据发明的一个实施例的典型计算机系统300的方框图。如图4中所示,计算机系统300包括可以是芯片多处理器(CMP)的处理器310。如图4中所示,处理器310包括第一核心310a(核心A)和第二核心310b(核心B)。在一个实施例中,处理器310可使存储器系统互连320与高速缓冲相干共享存储器子系统(“相干存储器”)330相耦合。在一个实施例中,相干存储器330包括动态随机存取存储器(DRAM),并进一步包括在多处理器间逻辑共享相干存储器330的相干存储控制器。
可以理解的是,在其它实施例中,另外的处理器可与相干存储器330耦合。此外在某些实施例中,相干存储器330可分步执行并展开,以使系统300的次处理器与相干存储器330的某些部分通信,及使其它处理器与相干存储器330的其它部分通信。
如图4中所示,依据本发明的一个实施例,核心310a包括高速缓存314a和执行单元316a。高速缓存314a可为与核心310a相连的低电平高速缓存(如电平一(L1))。当然,其它元件可位于核心310a中,如附加高速缓存。尤其是,末级高速缓存(LLC)305,它可为电平二(L2)高速缓存,可与核心310a和310b相耦合。依据本发明的一个实施例,LLC305可存储锁变量。更进一步,设置在锁变量部分中的数值可在LLC305中同步。如图4进一步所示,相似的处理器元件可位于核心310b中,它可为多处理器系统如芯片多处理器(CMP)的第二处理器核心。
相干存储器330也可与输入/输出(I/O)网络集线器335相耦合(通过网络集线器连接),此网络集线器335与I/O扩展总线355和外设总线350相耦合。在许多实施例中,在其它装置间,I/O扩展总线355与许多I/O装置相耦合,如键盘和鼠标。外设总线350与许多元件相耦合,如可为存储装置如闪存、附加卡等的外设装置370。尽管是参考系统300的特定元件来描述,图示的实施例的许多更改也是可以的。
在某些实施例中,多处理器系统为点对点的总线系统,如通用系统接口(CSI)系统。现在参考图5,表示依据本发明其它实施例的多处理系统的方框图。如图5中所示,多处理器系统为点对点总线系统,并包括通过点对点互联450耦合的第一处理器470和第二处理器480。第一处理器470包括多处理器核心474a和474b(尽管可以存在更多核心)、存储控制器网络集线器(MCH)472、高速缓存473和点对点(P-P)接口476和478。同样,第二处理器480包括同样的元件,称为处理器核心484a和484b、MCH482、高速缓存483和P-P接口486和488。依据本发明的一个实施例,高速缓存473和483可存储锁变量。更进一步,设置到锁变量部分中的数值可在高速缓存473和483得到同步。
如图5中所示,MCH的472和482将处理器与称为存储器432和存储器444的各自的存储器相耦合,它们都是位于各自处理器的主存储器上的部分。
第一处理器470和第二处理器480分别通过P-P接口452和454与芯片集490相耦合。如图5中所示,芯片集490包括P-P接口494和498。更进一步,芯片集490包括接口492(I/F)以使芯片集490与高性能图形引擎438相耦合。在一个实施例中,高级图形端口(AGP)总线439可用于将图形引擎438与芯片集490相耦合。AGP总线439符合由Intel公司,加利福尼亚的Santa Clara于1998年5月4日出版的《加速图形端口接口分类,修订本2.0》。可选的是,点对点互连439可与这些元件耦合。
接下来,芯片集490通过接口496与第一总线416相耦合。在一个实施例中,第一总线416可为外围设备互连(PCI)总线,如出版于1995年6月的《PCI本地总线分类,产品版本,版本2.1》中所定义的,或者如PCI并行总线或者其它的第三代I/O互连总线,尽管本发明的范围不限于此。
如图5所示,与将第一总线416与第二总线420耦合的总线桥418一起,许多输入/输出(I/O)装置414可与第一总线416耦合。在一个实施例中,第二总线420可为小插针数(LPC)总线。许多装置可与第二总线420耦合,包括如,键盘/鼠标422、通讯装置426和包括在一个实施例代码430中的数据存储单元428。更进一步,音频I/O 424可与第二总线420耦合。
实施例可在计算机程序上执行,这些程序存储在具有指令的存储介质上,以对计算机系统编程来执行实施例。存储介质包括但不仅限于,任何类型的磁盘包括软盘、光盘、只读光盘(CD-ROMs)、可擦写光盘(CD-RWs)和磁光盘,半导体装置如只读存储器(ROMs),随机存储存储器(RAMs)如动态和静态RAMs、可擦写编程只读存储器(EPROMs)、电可擦除编程只读存储器(EEPROMs),闪存、磁性或光卡,或其它适合存储电子指令的介质。其它实施例可作为由可编程控制装置执行的软件模块来实施。
当参考有限的几个实施例描述了本发明时,从此本领域的技术人员将作出许多更改或变化。在本发明的确切精神和范围内,附具的权利要求意图覆盖所有的更改或变化。
权利要求
1.一种方法,包括为多线程中每一个分配共享变量中的位置;及写入数值到对应的位置,以表示对应线程达到了障碍。
2.如权利要求1所述的方法,其特征在于,所述位置包括所述共享变量的字节。
3.如权利要求1所述的方法,其特征在于,共享变量位于至少由两个处理器共享的末级高速缓存内。
4.如权利要求1所述的方法,其特征在于,还包括当多线程的至少一个达到所述障碍时,读取所述共享变量的至少一部分。
5.如权利要求1所述的方法,其特征在于,还包括同步其中存储了所述共享变量的高速缓存中的所述值。
6.一种方法,包括用具有多个数据元素的数据结构关联一单变量;及使用所述单变量锁定所述多个数据元素中的至少一个。
7.如权利要求6所述的方法,其特征在于,还包括用多个数据元素中的每一个关联单变量的字节。
8.如权利要求7所述的方法,其特征在于,还包括通过与多个数据元素之一相关的字节的设置由第一线程锁定多个数据元素中的一个。
9.如权利要求8所述的方法,其特征在于,还包括阻止在设置字节时第二线程对多个数据元素之一的访问。
10.一种包括了含有指令的机器可读存储介质,如果由机器执行所述指令时可使得所述机器执行如下方法运行程序的多个线程;及当第一线程达到程序的障碍时,在共享变量的第一部分内存储第一个值。
11.如权利要求10所述的物品,其特征在于,所述方法还包括由所述第一线程读取共享变量来确定第一线程是否为达到障碍的多个线程中的最后一个。
12.如权利要求10所述的物品,其特征在于,所述方法还包括基于共享变量的状态来隔离给定线程的故障。
13.如权利要求10所述的物品,其特征在于,所述方法还包括当第二线程达到障碍时,在共享变量的第二部分内存储所述第一个值。
14.如权利要求13所述的物品,其特征在于,所述方法还包括如果多个线程达到障碍,就更新第二变量。
15.如权利要求14所述的物品,其特征在于,所述方法还包括使得多个线程中的至少一个在第二变量上旋转直到更新第二线程。
16.一种装置,包括与第一处理器和第二处理器耦合的高速缓存,它存储具有多个部分的共享存储器结构,其中所述多个部分中的每个部分都对应于程序的多个线程中的一个。
17.如权利要求16所述的装置,其特征在于,所述高速缓存包括末级高速缓存。
18.如权利要求16所述的装置,其特征在于,所述第一处理器和所述第二处理器包括芯片多处理器的心核。
19.如权利要求16所述的装置,其特征在于,当多个线程中对应的那一个达到障碍时,所述高速缓存就与所述多个部分中的至少一个内的值同步。
20.一种系统,包括第一处理器;耦合至所述第一处理器的第二处理器;与第一处理器和第二处理器耦合的高速缓存,它存储具有多个部分的第一共享变量,所述多个部分的每一个都对应于第一数据结构的多个数据元素中的一个;以及耦合至所述高速缓存的动态随机存取存储器。
21.如权利要求20所述的系统,其特征在于,高速缓存包括末级高速缓存。
22.如权利要求21所述的系统,其特征在于,所述高速缓存存储具有用于程序的多线程的每一个的位置的第二共享变量。
23.如权利要求22所述的系统,其特征在于,当所述多线程中的一个达到障碍时,所述高速缓存就同步在用于所述多线程中的一个的位置中的值。
24.一种装置,包括第一处理器核心;耦合至所述第一处理器核心的第二处理器核心;以及与所述第一处理器核心和所述第二处理器核心相耦合的高速缓存,它存储具有多个部分的第一共享存储器结构,其中所述多个部分的每一部分都对应于在所述第一处理器核心和所述第二处理器核心执行的程序的多线程中的一个。
25.如权利要求24所述的装置,其特征在于,所述第一处理器核心和所述第二处理器核心包括芯片多处理器,并且其中所述高速缓存包括末级高速缓存。
26.如权利要求24所述的装置,其特征在于,当多个线程中对应的那一个到达障碍时,所述高速缓存就同步在所述多个部分的至少一个内的值。
27.如权利要求24所述的装置,其特征在于,所述高速缓存存储表示了多个线程同步状态的状况变量。
28.如权利要求24所述的装置,其特征在于,所述高速缓存存储具有多位置的第二共享存储器结构,其中多位置中的每一个都对应于数据结构的多个数据元素中的一个。
29.如权利要求28所述的装置,其特征在于,如果所述第二共享存储器结构的对应位置表示了锁定状态,就阻止线程访问所述多个数据元素中的一个。
全文摘要
在一个实施例中,本发明包括在为每一多线程在共享变量中分配位置和写入数值到对应位置以表示对应线程已经达到障碍的方法。以这种方式,当所有的线程都达到障碍时,就建立了同步。在某些实施例中,共享变量由多线程存储在可访问的高速缓存中。还描述和阐明了其它实施例。
文档编号G06F17/30GK1818874SQ20051012173
公开日2006年8月16日 申请日期2005年12月29日 优先权日2004年12月29日
发明者J·克劳福德, S·考塔帕尔利 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1