首页> 中国专利> 用于共享存储多核多线程处理器硬件锁的验证方法

用于共享存储多核多线程处理器硬件锁的验证方法

摘要

本发明公开了一种用于共享存储多核多线程处理器硬件锁的验证方法,实施步骤如下:1)初始化设置同步线程数目、线程访问存储器的最大访问次数;2)构造用于操作共享存储多核多线程处理器硬件锁的同步操作模块;3)根据所述同步线程数目执行多线程初始化;根据所述最大访问次数为每一个线程随机生成小于所述最大访问次数的线程访存操作序列,每一个线程根据所述线程访存次数进行访存操作;4)根据处理器硬件锁的地址范围随机指定一个用于验证激励的硬件锁地址;通过所述同步操作模块控制各个线程针对所述硬件锁地址的同步操作,并在所有线程完成后向验证环境输出激励执行结果。本发明具有验证效率高、验证速度快、使用方便快捷的优点。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-05-03

    未缴年费专利权终止 IPC(主分类):G06F15/167 授权公告日:20140625 终止日期:20180516 申请日:20120516

    专利权的终止

  • 2014-06-25

    授权

    授权

  • 2012-11-28

    实质审查的生效 IPC(主分类):G06F15/167 申请日:20120516

    实质审查的生效

  • 2012-10-03

    公开

    公开

说明书

技术领域

本发明涉及处理器设计领域,具体涉及一种用于共享存储多核多线程处理器硬件锁的验证方法。

背景技术

处理器设计中的芯片级验证是指在全芯片验证环境下、在加载操作系统之前在芯片上运行芯片级验证激励来验证处理器设计的正确性。芯片级验证激励是用面向芯片指令集的汇编语言编写的汇编语言程序,由汇编器汇编成目标码后,再由存储映像生成工具生成存储映像加载到处理器芯片级验证环境中执行。芯片级验证激励的执行可以在全芯片级测试处理器设计的正确性。

共享存储多核多线程处理器已经成为目前通用高性能处理器的主流。随着处理器工艺技术的进步和体系结构的改进,单个芯片支持的线程数目将会达到数百量级。在设计实现这种共享存储众线程处理器的过程中,为了提高多线程操作线程间共享的锁变量的性能,硬件设计了特殊的锁变量处理机制,这种锁机制称为硬件锁。

但是,现有技术针对共享存储众线程处理器的芯片级验证激励代码由设计和验证人员手工编写,现有技术的用于共享存储多核多线程处理器硬件锁的验证方法均针对特定的验证程序模式,不同的程序模式需要按照验证激励代码编写要求,一行一行地编写汇编语言程序。要测试某种硬件锁操作模式下芯片的行为,就要编写相应的汇编语言程序,因此要完成多种特性的验证,则需要投入大量的人力物力,芯片级验证的效率非常低下。

发明内容

本发明要解决的技术问题是提供一种验证效率高、验证速度快、使用方便快捷的用于共享存储多核多线程处理器硬件锁的验证方法。

为了解决上述技术问题,本发明采用的技术方案为:

一种用于共享存储多核多线程处理器硬件锁的验证方法,其实施步骤如下:

1)初始化设置同步线程数目、线程访问存储器的最大访问次数;

2)构造用于操作共享存储多核多线程处理器硬件锁的同步操作模块;

3)根据所述同步线程数目执行多线程初始化;根据所述最大访问次数为每一个线程随机生成小于所述最大访问次数的线程访存操作序列,每一个线程根据所述线程访存次数进行访存操作;

4)根据处理器的锁地址范围随机指定一个用于验证激励的硬件锁地址;通过所述同步操作模块控制各个线程针对所述硬件锁地址的操作,并在所有线程完成后向验证环境输出激励执行结果。

作为本发明上述技术方案的进一步改进:

所述步骤1)还包括初始化设置同步操作类型;所述步骤2)具体的步骤包括:当同步操作类型为栅栏同步操作时,根据栅栏同步操作构造用于操作共享存储多核多线程处理器硬件锁的栅栏同步模块;当同步操作类型为临界区同步操作时,根据临界区同步操作构造用于操作共享存储多核多线程处理器硬件锁的临界区同步模块。

当同步操作类型为栅栏同步操作时,所述步骤4)中通过同步操作模块控制各个线程针对所述硬件锁地址的操作的详细步骤如下:

4.1.1)当线程运行到同步阶段时,将所述硬件锁地址中保存的锁变量读入寄存器中,此时硬件锁变量的值在读入寄存器的同时所述存储器中的锁变量自动加一;

4.1.2)判断读出的锁变量的数值是否等于所述同步线程数目,如果锁变量的数值不等于同步线程数目,则先到达的线程反复读取存储器中的锁变量,此时读出的锁变量的值是锁变量的原始值且这种读取后锁变量原来的值不变;直至后到达的线程将所述锁变量修改为等于所述同步线程数目时判定所有线程的栅栏同步操作完成。

当同步操作类型为临界区同步操作时,所述步骤4)中通过同步操作模块控制各个线程针对所述硬件锁地址的操作的详细步骤如下:

4.2.1)当线程运行到临界区时,将所述硬件锁地址中保存的锁变量读入寄存器中,此时硬件锁变量的值在读入寄存器时所述存储器中的锁变量自动加一;

4.2.2)各个线程分别判断所述存储器中锁变量的数值是否为0,如果锁变量的数值不为0,则当前线程返回继续执行步骤4.2.1);如果锁变量的数值为0,则当前线程进入临界区开始执行临界区的代码;当线程执行完临界区代码后,将硬件锁地址所指向的存储器位置中的锁变量的值写为0以允许其他线程再进入临界区。

本发明具有下述优点:本发明以构造基本硬件锁的同步代码模块为基础,根据最大访问次数为每一个线程随机生成一个小于最大访问次数的线程访存操作,每一个线程根据线程访存次数进行存储器访问,使得不同线程进入同步操作的时间各不相同,然后通过随机指定一个用于验证激励的硬件锁地址、使用硬件锁的同步模块控制各个线程针对硬件锁地址进行同步操作并在所有线程完成后向验证环境输出激励执行结果,能够根据用户指定的验证特性完成对共享存储多核多线程处理器硬件锁的验证,具有验证效率高、验证速度快、使用方便快捷的优点。

附图说明

图1为本发明实施例的实施流程示意图。

图2为本发明实施例中多线程硬件锁验证激励的构建步骤示意图。

图3为本发明实施例中构建完成的多线程使用硬件锁的验证激励的结构示意图。

具体实施方式

如图1所示,本实施例用于共享存储多核多线程处理器硬件锁的验证方法的实施步骤如下:

1)初始化设置同步线程数目、线程访问存储器的最大访问次数;

2)构造用于操作共享存储多核多线程处理器硬件锁的同步操作模块;

3)根据所述同步线程数目执行多线程初始化;根据所述最大访问次数为每一个线程随机生成小于所述最大访问次数的线程访存操作序列,每一个线程根据所述线程访存次数进行访存操作;

4)根据处理器的锁地址范围随机指定一个用于验证激励的硬件锁地址;通过所述同步操作模块控制各个线程针对所述硬件锁地址的操作,并在所有线程完成后向验证环境输出激励执行结果。

本实施例以构造使用基本硬件锁的同步模块为基础,根据最大访问次数为每一个线程随机生成一个小于最大访问次数的线程访存操作,每一个线程根据线程访存次数进行访存操作,使得不同线程进入同步操作的时间各不相同,然后通过随机指定一个用于验证激励的硬件锁地址,同步操作模块控制各个线程针对硬件锁地址进行同步操作并在所有线程完成后向验证环境输出激励执行结果,能够根据用户指定的验证特性完成对共享存储多核多线程处理器的硬件锁的验证,具有验证效率高、验证速度快、使用方便快捷的优点。

所述步骤1)还包括初始化设置同步操作类型;所述步骤2)具体的步骤包括:当同步操作类型为栅栏同步操作时,根据栅栏同步操作构造用于操作共享存储多核多线程处理器硬件锁的栅栏同步模块;当同步操作类型为临界区同步操作时,根据临界区同步操作构造用于操作共享存储多核多线程处理器硬件锁的临界区同步模块。

当同步操作类型为栅栏同步操作时,所述步骤4)中通过同步操作模块控制各个线程针对所述硬件锁地址的操作的详细步骤如下:

4.1.1)当线程运行到同步阶段时,将所述硬件锁地址中保存的锁变量读入寄存器中(这里的读使用的是读加一地址),此时硬件锁变量的值在读入寄存器的同时所述存储器中的锁变量自动加一;

4.1.2)判断读出的锁变量的数值是否等于所述同步线程数目,如果锁变量的数值不等于同步线程数目,则先到达的线程反复读取存储器中的锁变量(这里的读使用的是读原值地址),此时读出的锁变量的值是锁变量的原始值且这种读取后锁变量原来的值不变;直至后到达的线程将所述锁变量修改为等于所述同步线程数目时判定所有线程的栅栏同步操作完成。

当同步操作类型为临界区同步操作时,所述步骤4)中通过同步操作模块控制各个线程针对所述硬件锁地址的操作的详细步骤如下:

4.2.1)当线程运行到临界区时,将所述硬件锁地址中保存的锁变量读入寄存器中(这里的读使用的是读加一地址),此时硬件锁变量的值在读入寄存器时所述存储器中的锁变量自动加一;

4.2.2)各个线程分别判断所述存储器中锁变量的数值是否为0,如果锁变量的数值不为0,则当前线程返回继续执行步骤4.2.1);如果锁变量的数值为0,则当前线程进入临界区开始执行临界区的代码;当线程执行完临界区代码后,将硬件锁地址所指向的存储器位置中的锁变量的值写为0以允许其他线程再进入临界区。

对于多核多线程处理器的芯片级验证而言,多线程的验证激励初始化部分完成了多线程启动设置,该部分功能是成熟的汇编语言代码模块,但是为了面向随机自动构造多种验证激励的需求,可以修改代码模块中指定的线程数目;本实施例中,同步线程数目、线程访问存储体、同步操作类型采用宏定义作为参数,不同激励中的不同的并发线程数目只要自动修改同步线程数目、线程访问存储体、同步操作类型三者的宏定义数值。

本实施例应用的共享存储多核多线程处理器为型号为FT1500的飞腾处理器(下文中简称FT1500处理器)。在FT1500处理器中,硬件锁实现了对特定地址的读取操作就完成了读并加一或读并减一的操作。例如在如下汇编代码中,对地址为0x8F00000000的64位锁变量;当对该地址或0x400后的地址读取时,将锁变量的值读入寄存器%g1同时存储器中的锁变量自动减一;当对该地址或0x800后的地址读取时,将锁变量的值读入寄存器%g1同时存储器中的锁变量自动加一。本实施例中则利用硬件锁的这种机制构造出基本的同步操作模块。

如上代码所示,本实施例根据硬件锁的设计特点,利用硬件锁的特殊功能,构造最常用的同步汇编程序模块(主要是栅栏同步和临界区)。硬件锁的设计特点是;对特定存储器地址的读取操作就完成了对该地址中锁变量的“读加一”(或“读减一”)的原子操作。例如在飞腾处理器(FT1500)的IO(输入输出)地址空间中开辟了锁变量存储区域,对其中锁变量的读取由硬件实现了原子操作功能,原子操作就是指从存储器中读出变量原值的同时将存储器中原值加一或减一,这两个操作不可分割地一起完成。

本实施例中,步骤2)中构造同步操作模块包括栅栏同步操作模块和临界区同步操作模块。在FT1500处理器中,硬件锁是指特定地址空间内的锁变量,针对同一个锁变量,定义了“读原值”地址、“读加一”地址和“读减一”地址。“读加一”和“读减一”是指将该地址的锁变量读入到通用寄存器中之后存储器中锁变量增一或减一;增一或减一操作和读操作原子地完成,这是由硬件实现保证的。栅栏同步就是要所有线程都到达栅栏同步点后,再继续执行后续的程序代码,一旦有线程没有到达,那么先到达的线程就反复判断栅栏同步退出条件,直到条件满足。临界区是一段程序代码,被一个锁变量保护起来,同一时刻只有获得了锁的线程才能执行。临界区通常用0/1锁保护,只有获得了锁的线程才能进入临界区执行。本实施例中,栅栏同步操作模块和临界区同步操作模块均采用Sparc-V9汇编语言描述,FT1500处理器兼容Sparc-V9指令集。

本实施例中,栅栏同步操作模块的代码为:

        

在如上代码模块中通用寄存器%g4中保存的是硬件锁变量所在的存储器位置的“读加一”地址,汇编语句“ldx  [%g4], %g1”将该变量的内容读入到通用寄存器%g1中,同时按照硬件锁的实现特点在读取了该锁变量同时存储器中的该锁变量同时增加了一。汇编语句“cmp %g1, 128”中的128为同步线程数目,表示有128个线程要进行栅栏同步,语句的意思是比较锁变量的值是否和预设的线程数目相同。所有线程都要执行上面的栅栏同步操作模块,当所有线程都执行完这段代码后,所有线程才能继续执行后续的程序语句,先到达的线程要反复读取锁变量的内容,和线程数比较,如果不等就跳转到barrier_wait_sync_inc标号语句反复执行。汇编语句“bne %xcc, barrier_wait_sync_inc”含义是针对上面做比较的汇编语句“cmp %g1, 128”的结果(结果在条件码寄存器%xcc中),如果不相等就跳转到barrier_wait_sync_inc标号。在Sparc V9指令集中,跳转语句后的语句也在跳转之后立即执行(跳转指令有一个指令空槽),即上面代码模块中“ldx [%g2], %g1”语句也在不相等的时候执行,该语句中的通用寄存器%g2中保存的是硬件锁变量的“读原值”地址。

本实施例中,临界区保护操作模块的代码为:

     

上述代码块中,语句“ldx  [%g4], %g5”将通用寄存器%g4中的锁变量地址所指的锁变量内容读入到通用寄存器%g5中,同时存储器中该锁变量值加一。汇编语句“cmp %g5, 0”的含义是:由于用硬件锁实现临界区保护,那么锁变量不为0表示已经有线程加锁了,其他线程就反复读取比较,如果锁变量为0,那么进行读取操作同时已经完成了锁变量增一的操作(即加锁操作),就表示执行该读取操作的线程获得了锁,可以执行临界区的代码了。获得了锁变量的线程执行完临界区的代码后,在临界区代码的结尾部分,用指令将锁变量重新置为0;那么,其他线程就可以再获得这个锁,进入临界区。

本实施例的各个线程初始化以后、在进入同步操作之前,需要随机执行一些存储器访问操作,强化各个线程访问锁变量的随机性。在此代码模块的构造中,本发明也采用随机的方法,各个线程根据用户指定的最大访存次数来生成小于最大访存次数的访存行为,访存行为中具体写入存储器的内容并不重要,本实施例中将地址值写入相应地址中。例如在FT1500这一硬件支持多线程的处理器中,芯片级验证激励中的如下代码就可以实现根据线程号跳转到不同的线程开始代码段执行。本实施例中存储访问操作的代码如下所示:

       其中语句“ta  T_RD_THID”的作用是处理器进入多线程执行状态,每个线程的各自线程号在寄存器%o1中(每个硬件线程都有一个独立的硬件寄存器%o1)。语句“mov      %o1, %l7”的作用是各个线程都将各自线程号存入各自本地的寄存器%l7中。之后的比较和跳转语句表示分别和自己的线程号比,如果相同,就跳入各个线程的入口处(在如上例子中是Thread1和Thread2),从各个线程入口开始各个线程并行执行各自的代码段。如果多线程同步时,各个线程执行的代码段的最后部分是跳入到同步程序模块(如栅栏和临界区)的开始处。各个线程在进入同步阶段(无论是栅栏同步还是临界区)之前,执行一些存储器访问操作。如上面举的例子中,线程1(Thread1)和线程2(Thread2)执行一些存储器访问操作,这些操作的具体内容并不重要,只要在自动构造激励的过程中保证随机访问一定次数的存储器,使各个线程到达同步点的时间有随机性。

在FT1500处理器中,在IO空间指定了特定的地址区域作为硬件锁变量存储空间。该处理器支持的锁地址范围是从0x8F00000000到0x8F00000BFF共1024个字节作为锁变量的存储空间,这个存储空间称为“锁空间”,锁变量可以按1/2/4/8字节四种访问宽度的整数来访问。为了遍历以上锁空间中的锁变量,在构造激励的过程中,本发明的自动化方法采用随机方法指定一个验证激励所使用到的硬件锁地址,如果不采用自动化方法,对每个锁变量的测试都要有手工编写或改写相应的汇编语言激励程序。随机生成的锁变量的地址,作为后续汇编语言程序段中的操作数。因此在硬件锁分配模块中需要随机生成一个锁变量的相应地址,用于后续对该硬件锁的同步操作。

在完成了多线程初始化、分配了硬件锁、多线程随机存储访问之后,在验证激励中插入栅栏同步操作模块或者临界区保护操作模块,并在多线程栅栏同步模块中设置相应的线程数,并使用步骤4)中随机选择的锁变量地址,通过同步操作模块控制各个线程针对硬件锁地址进行同步操作,并在所有线程完成后向验证环境输出激励执行结果,最终完成对共享存储多核多线程处理器硬件锁的验证。

本实施例的方法以多线程汇编语言程序作为载体,能够自动生成使用指定同步操作的多线程汇编语言程序,作为芯片级验证激励。将该激励加载到芯片模拟环境中运行,可以利用多线程并发执行对硬件锁的操作,来验证处理器提供的硬件锁机制的功能和正确性。本实施例在编程实现时,程序的输入是要验证的同步线程数目、线程访问存储体、同步操作类型,输出是实现此功能的、可作为芯片级验证激励的汇编语言程序;多次运行该程序,提供不同的输入,可以自动生成多种模式的面向硬件锁验证的验证激励代码,可以减少激励代码的开发时间,大幅度提高芯片级验证的效率。

如图2所示,本实施例中构建多线程汇编语言程序的具体步骤如下:

A1)创建一个空的汇编语言源程序文件,本实施例中,将该文件命名为verif.s。

A2)确定验证激励代码的验证特性。

验证激励代码的验证特性是指:同步线程数目、线程访问存储器最大次数、同步操作类型和锁变量地址,前三个特性(同步线程数目、线程访问存储器最大数据、同步操作类型)可以由每次自动生成激励时指定,最后一个特性(锁变量地址)采用在锁空间中随机分派的方法生成,这有利于生成大量的激励代码中尽可能随机地使用到锁空间中的锁变量,达到较好的验证效果。

A3)向verif.s文件中写入汇编语言的程序文本,按如下顺序写入相应内容。

A3.1)写入加载头文件语句。在激励程序的开始部分加载验证激励头文件,本实施例面向的FT1500处理器构造芯片级验证激励的过程中,在激励程序开始处写入“#include “hboot.s”。

A3.2)写入多线程初始化的代码模块。多线程初始化的代码模块,已经是验证激励编写中成熟的代码模块;在本实施例的激励自动化构造中,根据验证特性中线程数目,仅修改宏定义的同步线程数目。

A3.3)写入各个线程随机访问存储器的代码模块。按本实施例步骤3)的方法,根据各个线程进入同步段之前的存储访问的最大次数,随机为每个线程设置存储器访问的次数,即向verif.s文件中每个线程的执行体中写入指定次数(小于最大存储访问次数)的存储器读写语句(即ldx语句和stx语句),来增加各个线程进入同步点之前的访存随机性。

A3.4)写入使用硬件锁的多线程同步结构代码模块。根据同步操作的类型(栅栏同步或临界区),向verif.s文件中写入本实施例步骤一中构造多线程同步结构代码,根据线程数修改同步结构代码模块中的线程数。

A3.5)写入临界区内的代码。如果是验证多个线程利用硬件锁保护临界区,那么写入若干条汇编语句作为临界区执行的内容。本实施例主要测试硬件锁的设计正确性,临界区内线程的执行代码不重要,在具体实现中,本实施例仅写入某全局寄存器加一代码(该全局寄存器初始值为0,可以通过查看该寄存器内容来了解到多少个线程执行过了临界区)。

A3.6)写入汇报激励状态的程序语句。激励代码的最后部分,执行的是向验证环境报告激励执行情况的程序语句。在面向FT1500的芯片级验证环境中,只用如下一条跳转语句“ba Good_Trap”,Good_Trap是验证环境中固定的表示激励运行正确的代码的开始,已经在验证环境中预先定义了。

A3.7)写入数据段初始化语句。向verif.s中接着写入整个汇编程序的数据段初始化汇编语句,指定数据段的标识和空间长度,并为每个线程设置好数据段起始标号。

最终得到的多线程汇编语言程序的结构如图3所示,其具体结构包括:

B1)加载验证激励头文件程序语句。所有芯片级验证激励都要包含公共的初始化部分,这些公共的初始化部分已经在单独的汇编语言程序中实现。

B2)多线程初始化程序语句。在芯片级验证激励中,进入多线程模式代码模块已经是固定的,激励程序执行到这一步,就进入多线程并行的状态。

B3)多线程随机存储器访问的程序语句。进入多线程状态后,为了增加激励的复杂度和随机性,每个线程执行一些随机的存储器访问指令。

B4)使用硬件锁进行同步操作的程序语句。verif.s激励文件中的此部分代码就是采用补周一构造的使用硬件锁的多线程同步操作模块,可以是栅栏同步也可以是临界区,由激励构造时选择。

B5)“Good Trap”的程序语句。在verif.s激励文件的最后是“ba good_trap”语句。程序执行到这条语句就表示所有线程正确完成了使用硬件锁的同步操作,跳转到处理器的自陷(在该自陷中激励向验证环境汇报激励执行正确)。

B6)数据段声明语句。在激励的数据段声明语句中,用数据段标识“.data”标识程序的全局数据区的开始,在全局数据区中为程序的访问存储器的操作开辟存储器空间。对多线程存储器访问,在数据段中为不同的线程指定操作的数据段区域。

以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号