一种数据处理方法、解码电路及处理器转让专利

申请号 : CN201911302511.8

文献号 : CN111124495B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈庆

申请人 : 海光信息技术股份有限公司

摘要 :

本申请涉及一种数据处理方法、解码电路及处理器,属于计算机技术领域。该方法包括:判断获取到的指令是否为压缩指令;在为是时,获取所述压缩指令中的关键信息,所述关键信息包括:指令重复类型和指令重复次数,其中,所述指令重复类型用于指示待重复的指令类型,所述指令重复次数为大于等于2的正整数;根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压,以将所述压缩指令解压成与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。本申请实施例中,通过将指令进行压缩,使得一个指令块可以容纳更多的三操作数指令,不仅有效降低了指令缓存未命中的概率,同时优化了效率。

权利要求 :

1.一种数据处理方法,其特征在于,包括:

判断获取到的指令是否为压缩指令;

在为是时,获取所述压缩指令中的关键信息,所述关键信息包括:指令重复类型和指令重复次数,其中,所述指令重复类型用于指示待重复的指令类型,所述指令重复次数为大于等于2的正整数;

根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压,以将所述压缩指令解压成与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。

2.根据权利要求1所述的方法,其特征在于,根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压,包括:根据所述指令重复类型中的操作数对应的地址ID生成指令,并更新所述指令重复次数;

在确定更新后的所述指令重复次数大于预设阈值时,更新所述操作数对应的地址ID;

根据更新后的所述操作数对应的地址ID生成指令,并再次更新所述指令重复次数;

判断再次更新后的所述指令重复次数是否等于所述预设阈值;

在为是时,确定对所述压缩指令的解压结束,得到与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。

3.根据权利要求1所述的方法,其特征在于,根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压,包括:根据所述指令重复类型中的操作数对应的地址ID生成指令,并记录生成指令的生成次数;

在确定所述生成次数小于所述指令重复次数时,更新所述操作数对应的地址ID;

根据更新后的所述操作数对应的地址ID生成指令,并更新所述生成次数;

判断更新后的所述生成次数是否等于所述指令重复次数;

在为是时,确定对所述压缩指令的解压结束,得到与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。

4.根据权利要求2或3所述的方法,其特征在于,更新所述操作数对应的地址ID,包括:根据所述操作数对应的地址ID指向的操作数来源类型更新所述操作数对应的地址ID。

5.根据权利要求2或3所述的方法,其特征在于,更新所述操作数对应的地址ID,包括:根据所述操作数对应的地址ID指向的操作数来源中存储的数据的数据类型更新所述操作数对应的地址ID。

6.根据权利要求2或3所述的方法,其特征在于,所述指令重复类型中的操作数为目的操作数,所述关键信息还包括:目的地直通DF字段,在更新所述操作数对应的地址ID之前,所述方法还包括:确定所述目的地直通DF字段中的数值不为设定阈值。

7.根据权利要求1所述的方法,其特征在于,在获取所述压缩指令中的关键信息之前,所述方法还包括:确定所述压缩指令有效。

8.一种解码电路,其特征在于,包括:

解码器,用于判断获取到的指令是否为压缩指令,在为是时,获取所述压缩指令中的关键信息,所述关键信息包括:指令重复类型和指令重复次数,其中,所述指令重复类型用于指示待重复的指令类型,所述指令重复次数为大于等于2的正整数;

指令解压模块,用于根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压,以将所述压缩指令解压成与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。

9.根据权利要求8所述的解码电路,其特征在于,所述指令解压模块包括:控制器,用于获取所述指令重复类型中的操作数对应的地址ID;

指令生成器,用于根据所述指令重复类型中的操作数对应的地址ID生成指令;

所述控制器,还用于在所述指令生成器根据所述指令重复类型中的操作数对应的地址ID生成指令后,更新所述指令重复次数,以及在确定更新后的所述指令重复次数大于预设阈值时,更新所述操作数对应的地址ID,并将更新后的所述操作数对应的地址ID发给所述指令生成器;

所述指令生成器,还用于根据更新后的所述操作数对应的地址ID生成指令;

所述控制器,还用于在所述指令生成器根据更新后的所述操作数对应的地址ID生成指令后,再次更新所述指令重复次数,并判断再次更新后的所述指令重复次数是否等于所述预设阈值;在为是时,确定对所述压缩指令的解压结束,得到与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。

10.根据权利要求8所述的解码电路,其特征在于,所述指令解压模块包括:控制器,用于获取所述指令重复类型中的操作数对应的地址ID;

指令生成器,用于根据所述指令重复类型中的操作数对应的地址ID生成指令;

所述控制器,还用于在所述指令生成器根据所述指令重复类型中的操作数对应的地址ID生成指令后,记录生成指令的生成次数,以及在确定所述生成次数小于所述指令重复次数时,更新所述操作数对应的地址ID,并将更新后的所述操作数对应的地址ID发给所述指令生成器;

所述指令生成器,还用于根据更新后的所述操作数对应的地址ID生成指令;

所述控制器,还用于在所述指令生成器根据更新后的所述操作数对应的地址ID生成指令后,更新所述生成次数,并判断更新后的所述生成次数是否等于所述指令重复次数;在为是时,确定对所述压缩指令的解压结束,得到与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。

11.根据权利要求9或10所述的解码电路,其特征在于,所述控制器用于根据所述操作数对应的地址ID指向的操作数来源类型更新所述操作数对应的地址ID。

12.根据权利要求9或10所述的解码电路,其特征在于,所述控制器用于根据所述操作数对应的地址ID指向的操作数来源中存储的数据的数据类型更新所述操作数对应的地址ID。

13.根据权利要求9或10所述的解码电路,其特征在于,所述指令重复类型中的操作数为目的操作数,所述关键信息还包括:目的地直通DF字段,所述控制器还用于在更新所述操作数对应的地址ID之前,确定所述目的地直通DF字段中的数值不为设定阈值。

14.根据权利要求9或10所述的解码电路,其特征在于,所述指令重复类型中的操作数对应的地址ID指向的操作数来源类型为LDS,所述指令解压模块还包括:配置寄存器,所述配置寄存器用于存储获取LDS中的源操作数的地址,并且在根据当前的地址从LDS中读取对应的源操作数后自动将自身的地址更新到下一个源操作数对应的地址;

相应地,所述控制器用于根据所述配置寄存器当前指示的地址来更新所述操作数对应的地址ID,其中,所述操作数对应的地址ID与所述配置寄存器当前指示的地址相同。

15.根据权利要求8所述的解码电路,其特征在于,所述解码器,还用于在获取所述压缩指令中的关键信息之前,确定所述压缩指令有效。

16.根据权利要求8所述的解码电路,其特征在于,所述指令解压模块,还用于在接收到所述解码器发送的关键信息时,向所述解码器发送阻止其从指令分发单元中获取指令的指示,以及在确定对所述压缩指令的解压结束时,向所述解码器发送允许其从指令分发单元中获取指令的指示。

17.一种处理器,其特征在于,包括:指令分发单元、指令执行单元如权利要求8-16任一项所述的解码电路,所述指令分发单元和所述指令执行单元均与所述解码电路连接。

说明书 :

一种数据处理方法、解码电路及处理器

技术领域

[0001] 本申请属于计算机技术领域,具体涉及一种数据处理方法、解码电路及处理器。

背景技术

[0002] 计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。计算机在执行指令(程序)时,需要先去指令缓存(Cache)中读取指令,如果指令缓存未命中(Cache Miss),会带来比较严重的性能问题。例如,取指令需要很长的时间,这显著增加了一个指令序列的处理周期,并且降低了性能。在发生指令缺失时,当前指令序列处于停止和等待状态,如果没有足够的激活指令序列,整个计算单元就可能停止,这显著降低了性能。
[0003] 指令块,指一个缓存行(Cache Line)内指令的集合。由于每个缓存行仅512bit,而3操作数的运算指令使用64bit,因此每个缓存行只能存储8条这样的运算指令,从而使得一个指令块只能容纳8条三操作数指令。处理大型运算因而就需要读取成千上万个指令块,显然这不利于功耗优化。

发明内容

[0004] 鉴于此,本申请的目的在于提供一种数据处理方法、解码电路及处理器,以改善现有指令块只能容纳8条三操作数指令,导致在执行任务时需要发送很多指令,不利于功率优化的问题。
[0005] 本申请的实施例是这样实现的:
[0006] 第一方面,本申请实施例提供了一种数据处理方法,包括:判断获取到的指令是否为压缩指令;在为是时,获取所述压缩指令中的关键信息,所述关键信息包括:指令重复类型和指令重复次数,其中,所述指令重复类型用于指示待重复的指令类型,所述指令重复次数为大于等于2的正整数;根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压,以将所述压缩指令解压成与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。本申请实施例中,当获取到的指令为压缩指令,获取该压缩指令中的关键信息,然后根据关键信息中的指令重复类型和指令重复次数对压缩指令进行解压,以将压缩指令解压成与指令重复类型对应的,且与指令重复次数数量相同的多条指令,通过将指令进行压缩,使得一个指令块可以容纳更多的三操作数指令,不仅有效降低了指令缓存未命中的概率,同时优化了效率。
[0007] 结合第一方面实施例的一种可能的实施方式,根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压,包括:根据所述指令重复类型中的操作数对应的地址ID生成指令,并更新所述指令重复次数;在确定更新后的所述指令重复次数大于预设阈值时,更新所述操作数对应的地址ID;根据更新后的所述操作数对应的地址ID生成指令,并再次更新所述指令重复次数;判断再次更新后的所述指令重复次数是否等于所述预设阈值;在为是时,确定对所述压缩指令的解压结束,得到与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。本申请实施例中,在根据指令重复类型和指令重复次数对压缩指令进行解压时,在每生成一条指令后,更新指令重复次数,并判断更新后的指令重复次数是否等于预设阈值,在为否时,更新操作数对应的地址ID,并基于根据更新后的操作数对应的地址ID生成指令,然后再次更新指令重复次数,并判断更新后的指令重复次数是否等于预设阈值,直至更新后的指令重复次数等于预设阈值时,完成对压缩指令的解压,在判断是否完成对压缩指令的解压的整个过程中,无需要借助其他元件(如计数器),通过每生成一条指令后直接更新指令重复次数,即可完成,在保证准确的前提下,能最大化的简化处理流程,节约成本。
[0008] 结合第一方面实施例的一种可能的实施方式,根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压,包括:根据所述指令重复类型中的操作数对应的地址ID生成指令,并记录生成指令的生成次数;在确定所述生成次数小于所述指令重复次数时,更新所述操作数对应的地址ID;根据更新后的所述操作数对应的地址ID生成指令,并更新所述生成次数;判断更新后的所述生成次数是否等于所述指令重复次数;在为是时,确定对所述压缩指令的解压结束,得到与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。本申请实施例中,在根据指令重复类型和指令重复次数对压缩指令进行解压时,在每生成一条指令后,便记录生成指令的生成次数,并判断记录的生成次数是否等于指令重复次数,在为否时,更新操作数对应的地址ID,并基于根据更新后的操作数对应的地址ID生成指令,然后更新生成次数,并判断更新后的生成次数是否等于指令重复次数,直至更新后的指令重复次数等于指令重复次数时,完成对压缩指令的解压,在这个过程中,利用计数器来对生成指令的生成次数进行记录,在每生成一条指令后,便更新生成指令的生成次数,当生成次数等于指令重复次数时,完成对压缩指令的解压,提供了另一种可行的方式,丰富了方案的适用性。
[0009] 结合第一方面实施例的一种可能的实施方式,更新所述操作数对应的地址ID,包括:根据所述操作数对应的地址ID指向的操作数来源类型更新所述操作数对应的地址ID。本申请实施例中,通过操作数对应的地址ID指向的操作数来源类型更新操作数对应的地址ID,使得在地址更新时,不同的操作数来源类型更新操作数对应的地址ID时的规则可以不同。
[0010] 结合第一方面实施例的一种可能的实施方式,更新所述操作数对应的地址ID,包括:根据所述操作数对应的地址ID指向的操作数来源中存储的数据的数据类型更新所述操作数对应的地址ID。本申请实施例中,操作数对应的地址ID指向的操作数来源中存储的数据的数据类型更新操作数对应的地址ID,使得在地址更新时,不同的数据类型可以对应不同的更新规则。
[0011] 结合第一方面实施例的一种可能的实施方式,所述指令重复类型中的操作数为目的操作数,所述关键信息还包括:目的地直通DF字段,在更新所述操作数对应的地址ID之前,所述方法还包括:确定所述目的地直通DF字段中的数值不为设定阈值。本申请实施例中,当操作数为目的操作数,在更新操作数对应的地址ID之前,需要确定目的地直通DF字段中的数值不为设定阈值,以避免对数据直通造成影响。
[0012] 结合第一方面实施例的一种可能的实施方式,在获取所述压缩指令中的关键信息之前,所述方法还包括:确定所述压缩指令有效。本申请实施例中,在获取压缩指令中的关键信息之前,还需要确定该压缩指令有效,以提高效率,避免对错误的压缩指令进行解压而造成资源浪费。
[0013] 第二方面,本申请实施例还提供了一种解码电路,包括:解码器和指令解压模块;解码器,用于判断获取到的指令是否为压缩指令,在为是时,获取所述压缩指令中的关键信息,所述关键信息包括:指令重复类型和指令重复次数,其中,所述指令重复类型用于指示待重复的指令类型,所述指令重复次数为大于等于2的正整数;指令解压模块,用于根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压,以将所述压缩指令解压成与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。
[0014] 结合第二方面实施例的一种可能的实施方式,所述指令解压模块包括:控制器,用于获取所述指令重复类型中的操作数对应的地址ID;指令生成器,用于根据所述指令重复类型中的操作数对应的地址ID生成指令;所述控制器,还用于在所述指令生成器根据所述指令重复类型中的操作数对应的地址ID生成指令后,更新所述指令重复次数,以及在确定更新后的所述指令重复次数大于预设阈值时,更新所述操作数对应的地址ID,并将更新后的所述操作数对应的地址ID发给所述指令生成器;所述指令生成器,还用于根据更新后的所述操作数对应的地址ID生成指令;所述控制器,还用于在所述指令生成器根据更新后的所述操作数对应的地址ID生成指令后,再次更新所述指令重复次数,并判断再次更新后的所述指令重复次数是否等于所述预设阈值;在为是时,确定对所述压缩指令的解压结束,得到与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。
[0015] 结合第二方面实施例的一种可能的实施方式,所述指令解压模块包括:控制器,用于获取所述指令重复类型中的操作数对应的地址ID;指令生成器,用于根据所述指令重复类型中的操作数对应的地址ID生成指令;所述控制器,还用于在所述指令生成器根据所述指令重复类型中的操作数对应的地址ID生成指令后,记录生成指令的生成次数,以及在确定所述生成次数小于所述指令重复次数时,更新所述操作数对应的地址ID,并将更新后的所述操作数对应的地址ID发给所述指令生成器;所述指令生成器,还用于根据更新后的所述操作数对应的地址ID生成指令;所述控制器,还用于在所述指令生成器根据更新后的所述操作数对应的地址ID生成指令后,更新所述生成次数,并判断更新后的所述生成次数是否等于所述指令重复次数;在为是时,确定对所述压缩指令的解压结束,得到与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。
[0016] 结合第二方面实施例的一种可能的实施方式,所述控制器在用于根据所述操作数对应的地址ID指向的操作数来源类型更新所述操作数对应的地址ID。
[0017] 结合第二方面实施例的一种可能的实施方式,所述控制器用于根据所述操作数对应的地址ID指向的操作数来源中存储的数据的数据类型更新所述操作数对应的地址ID。
[0018] 结合第二方面实施例的一种可能的实施方式,所述指令重复类型中的操作数为目的操作数,所述关键信息还包括:目的地直通DF字段,所述控制器还用于在更新所述操作数对应的地址ID之前,确定所述目的地直通DF字段中的数值不为设定阈值。
[0019] 结合第二方面实施例的一种可能的实施方式,所述指令重复类型中的操作数对应的地址ID指向的操作数来源类型为LDS,所述指令解压模块还包括:配置寄存器,所述配置寄存器用于存储获取LDS中的源操作数的地址,并且在根据当前的地址从LDS中读取对应的源操作数后自动将自身的地址更新到下一个源操作数对应的地址;相应地,所述控制器用于根据所述配置寄存器当前指示的地址来更新所述操作数对应的地址ID,其中,所述操作数对应的地址ID与所述配置寄存器当前指示的地址相同。
[0020] 结合第二方面实施例的一种可能的实施方式,所述解码器,还用于在获取所述压缩指令中的关键信息之前,确定所述压缩指令有效。
[0021] 结合第二方面实施例的一种可能的实施方式,所述指令解压模块,还用于在接收到所述解码器发送的关键信息时,向所述解码器发送阻止其从指令分发单元中获取指令的指示,以及在确定对所述压缩指令的解压结束时,向所述解码器发送允许其从指令分发单元中获取指令的指示。
[0022] 第三方面,本申请实施例还提供了一种处理器,包括:指令分发单元、指令执行单元如上述第二方面实施例和/或结合上述第二方面实施例的任一种可能的实施方式提供的解码电路,所述指令分发单元和所述指令执行单元均与所述解码电路连接。
[0023] 本申请的其他特征和优点将在随后的说明书阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请实施例而了解。本申请的目的和其他优点可通过在所写的说明书以及附图中所特别指出的结构来实现和获得。

附图说明

[0024] 为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。通过附图所示,本申请的上述及其它目的、特征和优势将更加清晰。在全部附图中相同的附图标记指示相同的部分。并未刻意按实际尺寸等比例缩放绘制附图,重点在于示出本申请的主旨。
[0025] 图1示出了本申请实施例提供的一种VOP3R指令中各字段的示意图。
[0026] 图2示出了本申请实施例提供的一种解码电路的结构示意图。
[0027] 图3示出了本申请实施例提供的又一种解码电路的结构示意图。
[0028] 图4示出了本申请实施例提供的又一种解码电路的结构示意图。
[0029] 图5示出了本申请实施例提供的一种数据处理方法的流程示意图。
[0030] 图6示出了本申请实施例提供的一种处理器的结构示意图。

具体实施方式

[0031] 下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。
[0032] 应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本申请的描述中诸如“第一”、“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0033] 再者,本申请中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。
[0034] 鉴于当前一个缓存行只能存储8条3操作数的运算指令,为了避免发生指令缓存未命中(Cache Miss)的情况,使得一个指令块只能容纳8条三操作数指令,这对于功率优化来说,远远不够。因此,本申请实施例中提供了一种高效的指令压缩方法,使得可以将64条3操作数指令压缩为64bit,因此每个缓存行最多可以存储512条3操作数指令,不仅提高了运算性能,而且还可以显著减少指令缓存未命中的情况。
[0035] 为了支持可以将64条3操作数指令压缩为64bit,本申请中引入了一个VOP3R(Vector Operation with 3Operand and Repeat,具有3个操作数和重复的向量运算)指令,设定类型为“110010”,即110010表示指令是VOP3R指令,如图1所示。其中,VOP3R指令定义了如下特殊字段,见表1。
[0036] 表1
[0037]
[0038]
[0039] 需要说明的是,表1中的各个字段的位数(位宽)是相对固定的,其位置是可以变化的,例如,Repeat_Enable可以不再是[62:59]这一位数,其可以是在[3:0]这一位数,其余字段的情况与之类似。
[0040] 其中,Repeat_Enable:重复使能字段,4bit,各个bit指示源操作数(Operand0,Operand1,Operand2)和目的操作数(也称为结果Result)的重复,例如,B[59:59](Or B[0:0]):Repeat Operand0;B[60:60](Or B[1:1]):Repeat Operand1;B[61:61](Or B[2:2]):
Repeat Operand2;B[62:62](Or B[3:3]):Repeat destination。其中,需要说明的是,仅对源操作数来源于向量通用寄存器(Vector General Purpose Register,VGPR)/标量通用寄存器(Scalar General Purpose Register,SGPR)/局部数据存储(Local Data Share,LDS_DIRECT),以及目的操作数来源于VGPR/SGPR的操作数重复,其他情况直接忽略。
[0041] 为了支持这种指令重复,在硬件上,本申请实施例提供了一种解码电路,如图2所示。当解码电路从指令分发单元(Instruction Dispatch)中获取指令后,判断该指令是否是压缩指令,在为否时,也即当前指令不为压缩指令时,解码电路将该指令直接发送至指令执行单元(Instruction Execution),指令执行单元执行指令;在为是时,也即当前指令为压缩指令时,解码电路获取压缩指令中的关键信息;再根据关键信息中的指令重复类型和指令重复次数对该压缩指令进行解压,以将该压缩指令解压成与指令重复类型对应的,且与指令重复次数数量相同的多条指令。
[0042] 其中,该关键信息包括:指令重复类型和指令重复次数,指令重复类型用于指示待重复的指令类型,指令重复次数为大于等于2的正整数。根据压缩指令中的重复使能字段(Repeat_Enable)来获得指令重复类型,根据重复计数字段(Repeat_Counter)来获得指令重复次数。在判断该指令是否为压缩指令时,可以根据Repeat_Counter字段来判断当前指令是否为压缩指令,若Repeat_Count!=0x0,则为压缩指令,若repeat_count==0x0(16进制0),则为非压缩指令。关键信息的详细参数如表2所示。
[0043] 表2
[0044]字段 位数
Operation_code 10
Repeat_Counter 6
Result_ID 8
Repeat_Enable 4
Operand2_ID 9
Operand1_ID 9
Operand0_ID 9
[0045] 为了便于理解,具体进行说明,例如,压缩指令为:
[0046] Repeat Enable(0x3),Repeat Counter(62)::
[0047] Forwarding=LDS_Direct(M0_register)*B(1,ALU_Index)+Forwarding;
[0048] 则根据指令重复类型和指令重复次数对该压缩指令进行解压,可以得到与指令重复类型(重复Operand0和Operand1)对应的,且与指令重复次数(62)数量相同的62条指令,得到的指令如下:
[0049] Forwarding=LDS_Direct(M0_register)*B(1,ALU_Index)+Forwarding;
[0050] Forwarding=LDS_Direct(M0_register)*B(2,ALU_Index)+Forwarding;
[0051] Forwarding=LDS_Direct(M0_register)*B(3,ALU_Index)+Forwarding;
[0052] ……
[0053] Forwarding=LDS_Direct(M0_register)*B(61,ALU_Index)+Forwarding;
[0054] Forwarding=LDS_Direct(M0_register)*B(62,ALU_Index)+Forwarding;
[0055] 其中,Repeat Enable表示指令重复类型,其中的0x3表示重复Operand0和Operand1两个操作数,Repeat Counter表示指令重复次数,其中的62表示重复次数,这样对该压缩指令进行解压后就可以得到62条指令。需要说明的是,此处仅以待重复的指令类型为Operand0和Operand1为例进行了说明,待重复的指令类型可以是重复Result(目的操作数)、Operand0、Operand1、Operand2这四种操作数中的至少一种,这样有15种组合,通过定义不同的字节来表示不同的重复类型,如Repeat Enable(0x1)表示重复Operand0操作数,Repeat Enable(0x2)表示重复Operand1操作数,Repeat Enable(0x3)表示重复Operand0和Operand1两个操作数。
[0056] 其中,由于指令分为常规指令(单指令)和压缩指令,对应的硬件的指令逻辑包括常规模式和重复模式,当Repeat_Count==0表示常规模式,在常规模式下,执行逻辑从指令分发单元获取指令,并执行。Repeat_Count!=0表示为重复模式,在重复模式下,解码电路停止从指令分发单元获取指令,当解码电路完成对该压缩指令的解压工作后,也即当Repeat_Count==0时,切换回到常规模式。
[0057] 其中,作为一种实施方式,解码电路在根据指令重复类型和指令重复次数对压缩指令进行解压的过程可以是:根据指令重复类型中的操作数对应的地址ID生成指令,并更新指令重复次数;在确定更新后的指令重复次数大于预设阈值时,根据操作数对应的地址ID指向的更新操作数对应的地址ID;根据更新后的操作数对应的地址ID生成指令,并再次更新指令重复次数;判断再次更新后的指令重复次数是否等于预设阈值;在为是时,完成对压缩指令的解压,得到与指令重复类型对应的,且与指令重复次数数量相同的多条指令,在为否时,重复该操作(更新操作数对应的地址ID;根据更新后的操作数对应的地址ID生成指令,并再次更新指令重复次数;判断再次更新后的指令重复次数是否等于预设阈值),直至更新后的指令重复次数等于预设阈值则结束。
[0058] 该过程的代码表示如下:
[0059]
[0060]
[0061] 在该种实施方式中,也即,在第一次生成指令时,根据压缩指令中自带的地址ID生成指令,如上述的示例中,“Forwarding=LDS_Direct(M0_register)*B(1,ALU_Index)+Forwarding”这条指令就是根据压缩指令中默认的地址ID(地址1)生成的,然后更新指令重复次数(此时的指令重复次数为61),在确定更新后的指令重复次数(61)大于预设阈值(如0)时,更新操作数对应的地址ID(地址2),根据更新后的地址ID生成指令,并再次更新指令重复次数,然后判断更新后的指令重复次数是否等于预设阈值,在是否时,再次更新操作数对应的地址ID,根据更新后的地址ID生成指令,并再次更新指令重复次数(此时的指令重复次数为60),然后判断更新后的指令重复次数(60)是否等于预设阈值,若依然大于,则重复上述的操作(更新操作数对应的地址ID,根据更新后的地址ID生成指令,并再次更新指令重复次数,然后判断更新后的指令重复次数是否等于预设阈值),直至更新后的指令重复次数(0)等于预设阈值(如0)则结束,当更新后的指令重复次数等于预设阈值时,就得到了操作数的62条指令,即完成对压缩指令的解压。
[0062] 作为又一种实施方式,解码电路在根据指令重复类型和指令重复次数对压缩指令进行解压的过程可以是:根据指令重复类型中的操作数对应的地址ID生成指令,并记录生成指令的生成次数;在确定生成次数小于指令重复次数时,更新操作数对应的地址ID;根据更新后的操作数对应的地址ID生成指令,并更新生成次数;判断更新后的生成次数是否等于指令重复次数;在为是时,完成对压缩指令的解压,得到与指令重复类型对应的,且与指令重复次数数量相同的多条指令;在为否时,重复该操作(更新操作数对应的地址ID;根据更新后的操作数对应的地址ID生成指令,并更新生成次数;判断更新后的生成次数是否等于指令重复次数),直至更新后的生成次数等于指令重复次数则结束。
[0063] 该种实施方式的原理与前述实施方式的原理相同,不同的是,第一种实施方式中,在生成指令后,是通过更新指令重复次数,并通过判断更新后的指令重复次数是否等于预设阈值(例如0)来判断是否完成对压缩指令的解压工作,而本实施例中,在生成指令后,是通过记录生成指令的生成次数,并通过判断生成次数是否等于指令重复次数来判断是否完成对压缩指令的解压工作。也即在本实施例中,需要使用计数器来对生成指令的次数进行计数,每生成一条指令就计数一次,数值就增加一次,通过判断记录的次数是否等于指令重复次数(62)来决定是否需要继续生成指令。
[0064] 其中,在对压缩指令进行解压的过程中,每生成一条指令,就将该指令下发至指令执行单元。
[0065] 其中,上述的指令重复类型中的操作数可以是Result、Operand0、Operand1、Operand2这四种操作数中的至少一种。在更新操作数对应的地址ID时,一种实施方式下,可以是根据操作数对应的地址ID指向的操作数来源类型(如VGPR/SGPR/LDS_DIRECT),如不同的操作数来源类型对应的更新地址ID的规则可以不同,例如,操作数来源为VGPR对应的更新地址ID的规则与操作数来源为SGPR对应的更新地址ID的规则不同。
[0066] 下面以操作数来源为VGPR对应的更新地址ID的规则与操作数来源为SGPR对应的更新地址ID的规则相同为例进行说明,例如,当操作数对应的ID指向的操作数来源为VGPR/SGPR时,则在更新地址ID的时候,可以是基于(Operand_ID++,或Result_ID++)的规则进行更新,也即更新后的地址等于更新前的地址加一。为了便于理解,以Operand1为例进行说明,如果Operand1_ID指向的是VGPR/SGPR,使其重复如下:
[0067]
[0068] 也即,如果Operand1_ID指向的操作数来源是VGPR/SGPR,且Repeat_Enable[60]为1,则操作数1的地址(Operand1_ID)增加1;如果为0,操作数1的地址保持不变。其中,需要说明的是,上述的示例中仅以地址自增,且增幅为1为例进行举例的,地址更新的规律,还可以是地址自减,此时,幅度还可以不为1,其主要取决于存储数据时,是采用递增的方式存储,还是递减的方式存储,是否是连续存储等,因此,不能将该示例理解成是对本申请的限制。
[0069] 当操作数对应的ID指向的操作数来源为LDS_DIRECT,则更新地址ID的规则与操作数对应的ID指向的操作数来源为VGPR/SGPR时的不同。如果当操作数对应的ID指向的操作数来源为LDS_DIRECT时,在这种模式下,硬件从LDS读取数据作为操作数,访问地址和数据类型由配置寄存器,如M0寄存器(32bit的专用硬件内部寄存器,其低16bit被LDS_DIRECT用作地址)确定。M0寄存器的32bit定义如表3所示。
[0070] 表3
[0071]
[0072] 因此,当源操作数来源于LDS_DIRECT时,此时在更新地址ID时,需要对M0寄存器的地址字段进行自动更新。对应的,该地址ID的指向的地址为存储于M0寄存器中的地址,该地址用于读取存储于LDS中的源操作数。也即,M0寄存器,用于存储读取LDS中的源操作数(如矩阵中的每一行的元素)的地址,并且在根据当前的地址从LDS中读取对应的元素后需要将M0寄存器的地址更新到下一个元素对应的地址。
[0073] 作为又一种实施方式,除了根据操作数对应的地址ID指向的操作数来源类型更新操作数对应的地址ID外,还可以根据操作数对应的地址ID指向的操作数来源中存储的数据的数据类型来更新操作数对应的地址ID。不同的数据类型,对应的地址更新规则不同,例如,如下所示:
[0074] Address i+1=Addressi+0x1;//数据类型为unsigned byte;
[0075] Address i+1=Addressi+0x2;//数据类型为unsigned byte;
[0076] Address i+1=Addressi+0x4;//数据类型为DWord;
[0077] Address i+1=Addressi+0x0;//数据类型为Default(Reserved);
[0078] Address i+1=Addressi+0x1;//数据类型为signed byte;
[0079] Address i+1=Addressi+0x2;//数据类型为signed short;
[0080] Address i+1=Addressi+0x8;//数据类型为Qword;
[0081] 以操作数对应的地址ID指向的操作数来源为LDS_DIRECT为例,此时,在更新对M0寄存器的地址字段进行自动更新,还要考虑LDS中存储的数据的数据类型,若数据类型为unsigned byte,则按照Address i+1=Addressi+0x1的规律进行更新。
[0082] 其中,当操作数为目的操作数(Result)时,在进行地址更新之前,还需要确保目的操作数对应的地址ID指向的操作数来源类型不为用于数据直通的临时寄存器。其中,可以通过目的地直通DF字段来判断该目的操作数对应的地址ID指向的操作数来源类型是否为用于数据直通的临时寄存器。当DF==1时,则Result_ID为forwarding(直通),此时,地址不需要更新,保持forwarding即可,此时,在生成指令时,是基于压缩指令中默认的Result_ID来生成指令,每条指令中的Result_ID相同。反之也即DF不为1,则该目的操作数对应的地址ID指向的操作数来源类型不为用于数据直通的临时寄存器,如为VGPR/SGPR,则按照前面的方式进行地址更新即可。
[0083] 为了提高效率,在获取压缩指令中的关键信息之前,解码电路还可以先判断该压缩指令是否有效,当确定压缩指令有效后,才获取压缩指令中的关键信息,并根据关键信息中的指令重复类型和指令重复次数对压缩指令进行解压。
[0084] 作为一种实施方式,可以通过以下方式来确定该压缩指令是否有效:根据压缩指令中的表征源操作数的重复使能字段,或者压缩指令中的表征目的操作数的重复使能字段来判断压缩指令是否有效;在表征源操作数的重复使能字段不为零,且源操作数对应的地址ID指向指定操作数来源类型(如VGPR/SGPR/LDS_Direct)时,或者,在表征目的操作数的重复使能字段不为零时,表征压缩指令有效。若以下至少一项为真,则表征该压缩指令有效:
[0085] If(Repeat_Enable[59:59]!=0x0)andoperand0_ID isVGPR/SGPR/LDS_DIRECT;
[0086] If(Repeat_Enable[60:60]!=0x0)andoperand1_ID isVGPR/SGPR/LDS_DIRECT;
[0087] If(Repeat_Enable[61:61]!=0x0)andoperand2_ID isVGPR/SGPR/LDS_DIRECT;
[0088] If(Repeat_Enable[62:62]!=0x0);
[0089] 也即,至少一个源操作数的重复使能字段不为零,且对应的地址ID指向指定操作数来源类型,或者目的操作数的重复使能字段不为零,则表征该压缩指令有效。
[0090] 以上是从整个解码电路的角度来叙述的,为了便于理解该解码电路中的各个元件之间的信息交互,下面对解码电路中的各个元件所执行的步骤进行说明。如图1所示,解码电路包括:解码器(Repeat Decoder)、指令解压模块,解码器和指令解压模块连接。
[0091] 其中,解码器用于判断获取到的指令是否为压缩指令,在为否时,将该指令发送给至指令执行单元去执行该指令,在为是时,获取压缩指令中的关键信息。
[0092] 为了提高效率,可选地,解码器还用于在获取所压缩指令中的关键信息之前,确定该压缩指令有效。作为一种实施方式,解码器用于根据以下方式来确定该压缩指令有效:根据压缩指令中的表征源操作数的重复使能字段,或者压缩指令中的表征目的操作数的重复使能字段来判断压缩指令是否有效;在表征源操作数的重复使能字段不为零,且源操作数对应的地址ID指向指定操作数来源类型时,或者,在表征目的操作数的重复使能字段不为零时,表征压缩指令有效。
[0093] 指令解压模块,用于根据指令重复类型和指令重复次数对压缩指令进行解压,以将压缩指令解压成与指令重复类型对应的,且与指令重复次数数量相同的多条指令。
[0094] 可选地,指令解压模块,还用于在接收到解码器发送的关键信息时,向解码器发送阻止其从指令分发单元中获取指令的指示,以及在完成对压缩指令的解压时,向解码器发送允许其从指令分发单元中获取指令的指示。
[0095] 一种实施方式下,如图3所示,该指令解压模块包括:控制器和指令生成器。控制器分别与指令生成器和解码器连接。
[0096] 一种实施方式下,可选地,控制器用于获取指令重复类型中的操作数对应的地址ID;指令生成器,用于根据指令重复类型中的操作数对应的地址ID生成指令;控制器,还用于在指令生成器根据指令重复类型中的操作数对应的地址ID生成指令后,更新指令重复次数,以及在确定更新后的指令重复次数大于预设阈值时,更新操作数对应的地址ID,并将更新后的操作数对应的地址ID发给指令生成器;指令生成器,还用于根据更新后的操作数对应的地址ID生成指令;控制器,还用于在指令生成器根据更新后的操作数对应的地址ID生成指令后,再次更新指令重复次数,并判断再次更新后的指令重复次数是否等于预设阈值;在为是时,完成对压缩指令的解压,得到与指令重复类型对应的,且与指令重复次数数量相同的多条指令。
[0097] 又一种实施方式下,控制器,用于获取指令重复类型中的操作数对应的地址ID;指令生成器,用于根据指令重复类型中的操作数对应的地址ID生成指令;控制器,还用于在指令生成器根据指令重复类型中的操作数对应的地址ID生成指令后,记录生成指令的生成次数,以及在确定生成次数小于指令重复次数时,更新操作数对应的地址ID,并将更新后的操作数对应的地址ID发给指令生成器;指令生成器,还用于根据更新后的操作数对应的地址ID生成指令;控制器,还用于在指令生成器根据更新后的操作数对应的地址ID生成指令后,更新生成次数,并判断更新后的生成次数是否等于指令重复次数;在为是时,完成对压缩指令的解压,得到与指令重复类型对应的,且与指令重复次数数量相同的多条指令。
[0098] 一种实施方式下,控制器在更新操作数对应的地址ID时,还用于根据操作数对应的地址ID指向的操作数来源类型更新操作数对应的地址ID。
[0099] 一种实施方式下,控制器在更新操作数对应的地址ID时,控制器在更新操作数对应的地址ID时,还用于根据操作数对应的地址ID指向的操作数来源中存储的数据的数据类型更新操作数对应的地址ID。
[0100] 可选地,指令重复类型中的操作数为目的操作数,关键信息还包括:目的地直通DF字段,控制器在更新操作数对应的地址ID之前,还用于确定目的地直通DF字段中的数值不为设定阈值(如1)。
[0101] 可选地,控制器还用于在对压缩指令进行解压缩的过程中,还向解码器发送阻止其(解码器)从指令分发单元获取指令的指示,此时,解码器不在从指令分发单元中获取指令。待解压缩完成时,向解码器发送允许其(解码器)从指令分发单元获取指令的指示,此时,解码器可以从指令分发单元中获取指令。也即控制器包括常规模式和重复模式,在常规模式(当Repeat_Count==0表示常规模式,)下,控制器允许解码器从指令分发单元获取指令,并执行。在重复模式(Repeat_Count!=0表示为重复模式)下,控制器阻止解码器从指令分发单元获取指令,当控制器完成对该压缩指令的解压工作后,也即当Repeat_Count==0时,切换回到常规模式。
[0102] 当指令重复类型中的操作数对应的地址ID指向的操作数来源类型为LDS,指令解压模块还包括:配置寄存器,配置寄存器用于存储获取LDS中的源操作数的地址,并且在根据当前的地址从LDS中读取对应的源操作数后自动将自身(配置寄存器)的地址更新到下一个源操作数对应的地址。此时,控制器在更新操作数对应的地址ID时,还用于根据配置寄存器当前指示的地址来更新操作数对应的地址ID,该地址ID与配置寄存器当前指示的地址相同。此时,如图4所示,指令解压模块包括:控制器、配置寄存器(M0寄存器)和指令生成器。控制器分别与解码器、指令生成器和配置寄存器连接。
[0103] 其中,在对各个元器件的功能作用进行描述时,未提及之处可参考前述以解码电路为整体进行描述时的实施例中的相同部分,该部分在前述装置实施例中已经作了详细介绍,为了说明书的简洁,在此不再重复介绍。
[0104] 本申请实施例中,通过VOP3R来将指令进行压缩,使得每个缓存行(512bit)能容纳512条3操作数指令,不仅有效降低了指令缓存未命中的概率,同时优化了效率。为了便于理解,接下来以将本申请实施例提供的方法应用于矩阵乘法中作为示例进行说明。此处以
64X64的矩阵为例,C64x64=A64x64*B64x64,其中,64X64的矩阵大小仅是示例,不限于此。假设有
64个算术运算单元,每一个算术运算单元具有200x64 bit的VGPR空间。
[0105] 计算过程大致如下:
[0106] 1)矩阵A以线性模式加载到LDS:
[0107] A(0,0)→LDS(Address0);//A(0,0)存储在LDS的Address0的位置;
[0108] A(0,1)→LDS(Address1);//A(0,1)存储在LDS的Address1的位置;
[0109] A(0,2)→LDS(Address2);//A(0,2)存储在LDS的Address2的位置;
[0110] ……
[0111] 2)矩阵B加载到VGPR空间,如表4所示。
[0112] 表4
[0113] ALU0 ALU1 ALU2 …… ALU62 ALU63B0,0 B0,1 B0,2 …… B0,62 B0,63
B1,0 B1,1 B1,2 …… B1,62 B1,63
…… …… …… …… …… ……
B63,0 B63,1 B63,2 …… B63,62 B63,63
[0114] 其中,不同的VGPR存储不同的行,在计算时,矩阵A中的元素逐个并行地被加载到64个ALU中,与64个向量通用寄存器中各自存储的列对应的元素进行相乘,64个ALU并行地将矩阵A中同一行中的元素逐个与矩阵B的对应元素产生的相乘结果依次累加,得到矩阵C同一行的所有元素,从而完成矩阵A和第二矩阵B的乘法运算。
[0115] 3)计算矩阵C:
[0116] 在常规模式下计算矩阵C的指令如下:
[0117] M0_register=start_address;//M0寄存器的初始地址,其中,M0寄存器用于存储读取矩阵A中每个元素的地址,并且在64个ALU并行地根据M0寄存器当前的地址从所LDS读取矩阵A中对应的元素后自动更新到下一个元素对应的地址。
[0118] //-----------------------------------------
[0119] //Calculate the first row of Matrix C(计算矩阵C的第一行):
[0120] //C(0,0)is calculated on ALU_Index0:ALU_Index=0(ALU0计算C(0,0)).[0121] //C(0,1)is calculated on ALU_Index1:ALU_Index=1(ALU1计算C(0,1)).[0122] //......
[0123] //-----------------------------------------每个ALU分别计算矩阵C的第一行中对应的一个元素的执行指令如下:
[0124] Block_Start::Forwarding=LDS_Direct(M0_register)*B(0,ALU_Index);
[0125] Forwarding=LDS_Direct(M0_register)*B(1,ALU_Index)+Forwarding;
[0126] Forwarding=LDS_Direct(M0_register)*B(2,ALU_Index)+Forwarding;
[0127] Forwarding=LDS_Direct(M0_register)*B(3,ALU_Index)+Forwarding;
[0128] Forwarding=LDS_Direct(M0_register)*B(4,ALU_Index)+Forwarding;
[0129] ……
[0130] Block_End::C(0,ALU_Index)=LDS_Direct(M0_register)*B(63,ALU_Index)+Forwarding;
[0131] //-----------------------------------------
[0132] //Calculate the second row of Matrix C(计算矩阵C的第二行):
[0133] //C(1,0)is calculated on ALU_Index0(ALU0计算C(1,0)).
[0134] //C(1,1)is calculated on ALU_Index1(ALU1计算C(1,1)).
[0135] //......
[0136] //------------------------------------------每个ALU分别计算矩阵C的第二行中对应的一个元素的执行指令如下:
[0137] Block_Start::Forwarding=LDS_Direct(M0_register)*B(0,ALU_Index);
[0138] Forwarding=LDS_Direct(M0_register)*B(1,ALU_Index)+Forwarding;
[0139] Forwarding=LDS_Direct(M0_register)*B(2,ALU_Index)+Forwarding;
[0140] Forwarding=LDS_Direct(M0_register)*B(3,ALU_Index)+Forwarding;
[0141] Forwarding=LDS_Direct(M0_register)*B(4,ALU_Index)+Forwarding;
[0142] ……
[0143] Block_End::C(1,ALU_Index)=LDS_Direct(M0_register)*B(63,ALU_Index)+Forwarding;
[0144] ……
[0145] //-----------------------------------------
[0146] //Calculate the last row of Matrix C(计算矩阵C的最后一行):
[0147] //C(63,0)is calculated on ALU_Index0(ALU0计算C(63,0)).
[0148] //C(63,1)is calculated on ALU_Index1(ALU1计算C(63,1)).
[0149] //......
[0150] //-----------------------------------------每个ALU分别计算矩阵C的最后一行中对应的一个元素的执行指令如下:
[0151] Block_Start::Forwarding=LDS_Direct(M0_register)*B(0,ALU_Index);
[0152] Forwarding=LDS_Direct(M0_register)*B(1,ALU_Index)+Forwarding;
[0153] Forwarding=LDS_Direct(M0_register)*B(2,ALU_Index)+Forwarding;
[0154] Forwarding=LDS_Direct(M0_register)*B(3,ALU_Index)+Forwarding;
[0155] Forwarding=LDS_Direct(M0_register)*B(4,ALU_Index)+Forwarding;
[0156] ……
[0157] Block_End::C(63,ALU_Index)=LDS_Direct(M0_register)*B(63,ALU_Index)+Forwarding;
[0158] 以上是没有使用指令压缩的常规模式,以下是利用本申请提供的指令压缩方法,可以将上述的常规指令列表压缩如下:
[0159] M0_register=start_address;
[0160] //-----------------------------------------
[0161] //Calculate the first row of Matrix C(计算矩阵C的第一行):
[0162] //C(0,0)is calculated on ALU_Index0:ALU_Index=0.
[0163] //C(0,1)is calculated on ALU_Index1:ALU_Index=1.
[0164] //......
[0165] //-----------------------------------------
[0166] Block_Star::Forwarding=LDS_Direct(M0_register)*B(0,ALU_Index);
[0167] RepeatEnable(0x3,RepeatCounter(62)::
[0168] Forwarding=LDS_Direct(M0_register)*B(1,ALU_Index)+Forwarding;//Repeat Operand0 and Operand1;
[0169] Block_End::C(0,ALU_Index)=LDS_Direct(M0_register)*B(63,ALU_Index)+Forwarding;
[0170] //-----------------------------------------
[0171] //Calculate the second row of Matrix C(计算矩阵C的第二行):
[0172] //C(1,0)is calculated on ALU_Index0.
[0173] //C(1,1)is calculated on ALU_Index1.
[0174] //...........
[0175] //-----------------------------------------
[0176] Block_Start::Forwarding=LDS_Direct(M0_register)*B(0,ALU_Index);
[0177] RepeatEnable(0x3),RepeatCounter(62)::
[0178] Forwarding=LDS_Direct(M0_register)*B(1,ALU_Index)+Forwarding;//Repeat Operand0 and Operand1;
[0179] Block_End::C(1,ALU_Index)=LDS_Direct(M0_register)*B(63,ALU_Index)+Forwarding;
[0180] ……
[0181] //-----------------------------------------
[0182] //Calculate the last row of Matrix C(计算矩阵C的最后一行):
[0183] //C(63,0)is calculated on ALU_Index0.
[0184] //C(63,1)is calculated on ALU_Index1.
[0185] //...........
[0186] //-----------------------------------------
[0187] Block_Start::Forwarding=LDS_Direct(M0_register)*B(0,ALU_Index);
[0188] RepeatEnable(0x3),RepeatCounter(62)::
[0189] Forwarding=LDS_Direct(M0_register)*B(1,ALU_Index)+Forwarding;//Repeat Operand0 and Operand1;
[0190] Block_End::C(63,ALU_Index)=LDS_Direct(M0_register)*B(63,ALU_Index)+Forwarding;
[0191] 从上述可以看出,采用常规的指令模式,完成C64x64=A64x64*B64x64需要64X64条指令=4096条指令,而采用本申请的指令压缩后,仅需要3x64条指令,显著的提高了效率。
[0192] 请参阅图5,为本申请实施例提供的一种数据处理发法,下面将结合图5对其所包含的步骤进行说明。
[0193] 步骤S101:判断获取到的指令是否为压缩指令。
[0194] 在为是时,执行步骤S102,在为否时,将获取到的指令发送给指令执行单元。
[0195] 步骤S102:获取所述压缩指令中的关键信息,所述关键信息包括:指令重复类型和指令重复次数。
[0196] 其中,所述指令重复类型用于指示待重复的指令类型,所述指令重复次数为大于等于2的正整数。
[0197] 步骤S103:根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压,以将所述压缩指令解压成与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。
[0198] 可选地,在获取所述压缩指令中的关键信息之前,所述方法还包括:确定所述压缩指令有效。
[0199] 其中,一种实施方式下,根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压的过程可以是:根据所述指令重复类型中的操作数对应的地址ID生成指令,并更新所述指令重复次数;在确定更新后的所述指令重复次数大于预设阈值时,更新所述操作数对应的地址ID;根据更新后的所述操作数对应的地址ID生成指令,并再次更新所述指令重复次数;判断再次更新后的所述指令重复次数是否等于所述预设阈值;在为是时,确定对所述压缩指令的解压结束,得到与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。
[0200] 一种实施方式下,根据所述指令重复类型和所述指令重复次数对所述压缩指令进行解压的过程可以是:根据所述指令重复类型中的操作数对应的地址ID生成指令,并记录生成指令的生成次数;在确定所述生成次数小于所述指令重复次数时,更新所述操作数对应的地址ID;根据更新后的所述操作数对应的地址ID生成指令,并更新所述生成次数;判断更新后的所述生成次数是否等于所述指令重复次数;在为是时,确定对所述压缩指令的解压结束,得到与所述指令重复类型对应的,且与所述指令重复次数数量相同的多条指令。
[0201] 可选地,更新所述操作数对应的地址ID的过程可以是:根据所述操作数对应的地址ID指向的操作数来源类型更新所述操作数对应的地址ID。
[0202] 可选地,更新所述操作数对应的地址ID的过程还可以是:根据所述操作数对应的地址ID指向的操作数来源中存储的数据的数据类型更新所述操作数对应的地址ID。
[0203] 可选地,所述指令重复类型中的操作数为目的操作数,所述关键信息还包括:目的地直通DF字段,在更新所述操作数对应的地址ID之前,所述方法还包括:确定所述目的地直通DF字段中的数值不为设定阈值。
[0204] 本申请实施例所提供的方法,其实现原理及产生的技术效果和前述装置实施例相同,为简要描述,方法实施例部分未提及之处,可参考前述装置实施例中相应内容。
[0205] 本申请实施例还提供了一种处理器,如图6所示。该处理器包括上述任一实施例中的解码电路、指令执行单元和指令分发单元。指令分发单元和指令执行单元均与解码电路连接。指令分发单元用于存储指令,以便于解码电路从指令分发单元中获取指令。指令执行单元用于执行解码电路下发的指令。
[0206] 其中,该处理器可能是一种集成电路芯片,具有信号的处理能力。上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(Network Processor,NP)、图形处理器(Graphics Processing Unit、GPU)等;通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
[0207] 需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
[0208] 以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。