本发明实施例涉及计算机
技术领域:
,尤其涉及一种计算方法及装置。
背景技术:
:随着技术的飞速发展,乘法器的运用越来越广泛,然而,乘法器计算位宽大的乘法的计算效率较低,且会占用较多的系统资源。因此,通常需要将位宽大的乘法拆分为多个位宽小的乘法,然后将多个位宽小的乘法的计算结果求和,得到位宽大的乘法计算的结果。例如,假设需要计算a*b,其中a为被乘数,b为乘数,且a由{a3,a2,a1,a0}按位拼接而成,且b由{b3,b2,b1,b0}按位拼接而成,那么a*b就可以拆成如16个位宽较小的乘法,在拆分时,通常会将被乘数中的各个数分别与乘数中的低位数值相乘,再将被乘数中的各个数分别依次与乘数中的高位数值相乘。例如。将a0、a1、a2以及a3分别与b0相乘,将a0、a1、a2以及a3分别与b1相乘,将a0、a1、a2以及a3分别与b2相乘,以及将a0、a1、a2以及a3分别与b3相乘,再将这16个乘法的计算结果相加,得到a*b的计算结果。由于a3的位宽大于a2的位宽,a2的位宽大于a1的位宽,a1的位宽大于a0的位宽,以及b3的位宽大于b2的位宽,b2的位宽大于b1的位宽,b1的位宽大于b0的位宽,因此,这16个乘法的计算结果的位宽不全相同。为了方便计算,在位宽小的多个乘法中,通常会按照计算结果的位宽将位宽小的乘法归类。例如,具体归类如下表1所示,由于先是将a0、a1、a2以及a3分别与b0相乘,再将a0、a1、a2以及a3分别与b1相乘,然后将a0、a1、a2以及a3分别与b2相乘,最后将a0、a1、a2以及a3分别与b3相乘。因此,表1中第一行为a0、a1、a2以及a3分别与b0的乘法,表1中第二行为a0、a1、a2以及a3分别与b1的乘法,表1中第三行为a0、a1、a2以及a3分别与b2的乘法,表1中第四行为a0、a1、a2以及a3分别与b3的乘法。为了计算结果的位宽相同的乘法归类,在表1中,计算结果的位宽相同的乘法位于同一列,例如,在这16个乘法中,没有一个乘法的计算结果的位宽与a0*b0的计算结果的位宽相同,因此,a0*b0位于第一列,且没有其他乘法与a0*b0位于同一列。a1*b0的计算结果的位宽以及a0*b1的计算结果的位宽相同,因此,a1*b0和a0*b1位于同一列,也即位于第二列。a2*b0的计算结果的位宽、a1*b1的计算结果的位宽以及a0*b2的计算结果的位宽相同,因此,a2*b0、a1*b1以及和a0*b2位于同一列,也即位于第三列。其他列同理。表1a3*b0a2*b0a1*b0a0*b0a3*b1a2*b1a1*b1a0*b1a3*b2a2*b2a1*b2a0*b2a3*b3a2*b3a1*b3a0*b3在计算这16个乘法中,通常分成列进行计算,例如,对于任意一列,计算该列中的每一个乘法的计算结果,将该列中的每一个乘法的计算结果求和,得到该列的乘法计算结果。对于其他每一列同样执行上述操作,如此得到每一列的乘法计算结果,然后将每一列的乘法计算结果求和得到a*b的计算结果。其中,在计算每一列的乘法计算结果时,一般是按照先计算位宽较低的列再计算位宽较高的列的第一预设顺序进行计算。例如,在上表1中,最右侧一列第一列,最左侧一列为第七列,先计算第一列,再计算第二列,依次计算到第七列,其次,在计算该列中的每一个乘法的计算结果时,通常按照乘数的位宽由小至大的第二预设顺序进行计算。例如在表1中的第三列中,由于b0的位宽小于b1的位宽,b1的位宽小于b2的位宽,因此先计算a2*b0,再计算a1*b1,最后计算a0*b2。然而,发明人发现:对于任意一列,在计算该列中的每一个乘法时,都需要从缓存中读取该乘法中的被乘数和乘数,因此,每当计算一个乘法就需要从缓存中读两次数据。由于从缓存中读取一次数据就会产生一定的功耗,因此,现有技术中,每当计算一个乘法就会产生较多的功耗,最终导致整个计算过程中的功耗较多。技术实现要素:为克服相关技术中存在的问题,本发明实施例提供一种计算方法及装置。根据本发明实施例的第一方面,提供一种计算方法,所述方法包括:按照第一预设顺序依次将相邻的两个列组成列组,任意两个列组中包括的列完全不同;对于每一个列组,将所述列组中的位于相同行的乘法组成行组;按照第二预设顺序依次计算所述列组每一个行组中的两个乘法,且,在计算行组中的两个乘法时,按照第一预设顺序先计算行组中的位于后一列的乘法再计算行组中的位于前一列的乘法。在本发明实施例中,按照第一预设顺序依次将相邻的两个列组成列组,任意两个列组中包括的列完全不同;对于每一个列组,将所述列组中的位于相同行的乘法组成行组;按照第二预设顺序依次计算所述列组每一个行组中的两个乘法,且,在计算行组中的两个乘法时,按照第一预设顺序先计算行组中的位于后一列的乘法再计算行组中的位于前一列的乘法。通过本发明实施例的方法可以减少计算乘法时读取数据的读取次数,进而降低功耗。根据本发明实施例的第二方面,提供一种计算方法,所述方法包括:按照第一预设顺序依次将相邻的两个列组成列组,任意两个列组中包括的列完全不同;对于每一个列组,将所述列组中的位于相同行的乘法组成行组;按照第二预设顺序的反顺序依次计算所述列组每一个行组中的两个乘法,且,在计算行组中的两个乘法时,按照第一预设顺序先计算行组中的位于前一列的乘法再计算行组中的位于后一列的乘法。在本发明实施例中,按照第一预设顺序依次将相邻的两个列组成列组,任意两个列组中包括的列完全不同;对于每一个列组,将列组中的位于相同行的乘法组成行组;按照第二预设顺序的反顺序依次计算列组每一个行组中的两个乘法,且,在计算行组中的两个乘法时,按照第一预设顺序先计算行组中的位于前一列的乘法再计算行组中的位于后一列的乘法。通过本发明实施例的方法可以减少计算乘法时读取数据的读取次数,进而降低功耗。应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本发明实施例。附图说明此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明实施例的原理。图1是根据一示例性实施例示出的一种计算方法的流程图;图2是根据一示例性实施例示出的一种计算方法的流程图。具体实施方式这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明实施例的一些方面相一致的装置和方法的例子。图1是根据一示例性实施例示出的一种计算方法的流程图,如图1所示,该方法包括以下步骤。在步骤s101中,按照第一预设顺序依次将相邻的两个列组成列组,任意两个列组中包括的列完全不同;例如,上表1中,按照第一预设顺序,将第一列与第二列组成一个列组,将第三列与第四列组成一个列组,将第五列与第六列组成一个列组,还剩余第七列,将第一列单独作为一个列组。在步骤s102中,对于每一个列组,将列组中的位于相同行的乘法组成行组;按照第二预设顺序依次计算列组每一个行组中的两个乘法,且,在计算行组中的两个乘法时,按照第一预设顺序先计算行组中的位于后一列的乘法再计算行组中的位于前一列的乘法。例如,对于第三列和第四列组成的列组,将这两列中的位于第一行的两个乘法a3*b0和a2*b0组成第一个行组,将这两列中的位于第二行的两个乘法a2*b1和a1*b1组成第二个行组,将这两列中的位于第三行的两个乘法a1*b2和a0*b2组成第三个行组,将这两列中的位于第四行的两个乘法a0*b3组成第四个行组。其中,在a*b中,b为乘数,因此,b按位拆分的b0、b1、b2以及b3为这16个乘法中的被乘数,b0的位宽小于b1的位宽,b1的位宽小于b2的位宽,以及b2的位宽小于b3的位宽,且,第二预设顺序是按照乘数的位宽的由小至大的顺序,由于第一个行组中的两个乘法的乘数均为b0,第二个行组中的两个乘法的乘数均为b1,第三个行组中的两个乘法的被乘数均为b3,第一个行组中的乘法的被乘数为b3。因此,先需要先计算第一个行组中的两个乘法,再计算第二个行组中的两个乘法,然后计算第三个行组中的两个乘法,最后计算第四个行组中的乘法。由于第一预设顺序是由第一列至第七列的顺序,也即,第一预设顺序是按照被乘数的位宽由小至大的顺序。因此,在第一个行组的两个乘法a3*b0和a2*b0中,a3*b0所在的列位于a2*b0所在的列之后,因此,需要先计算a3*b0,再计算a2*b0。在第二个行组的两个乘法a2*b1和a1*b1中,a2*b1所在的列位于a1*b1所在的列之后,因此,需要先计算a2*b1,再计算a1*b1。在第三个行组的两个乘法a1*b2和a0*b2中,a1*b2所在的列位于a0*b2所在的列之后,因此,需要先计算a1*b2,再计算a0*b2。最后计算第四个行组中的乘法a0*b3。综上,在计算第三列和第四列组成的列组中的乘法的计算顺序为:a3*b0、a2*b0、a2*b1、a1*b1、a1*b2、a0*b2以及a0*b3。其中,在计算这7个乘法时,先从缓存中读取a3和b0,计算a3*b0,再从缓存中读取a2,计算a2*b0,再从缓存中读取b1,计算a2*b1,再从缓存中读取a1,计算a1*b1,再从缓存中读取b2,计算a1*b2,再从缓存中读取a0,计算a0*b2,再从缓存中读取b3,计算a0*b3。除了在计算a3*b0时需要从缓存中读取两次数据,在计算其他6个乘法中的每一个乘法时只需读取一次数据,从而降低了功耗。另外,对于第一列和第二列组成的列组、第五列和第六列组成的列组,同样如此,在此不做详述。在本发明实施例中,按照第一预设顺序依次将相邻的两个列组成列组,任意两个列组中包括的列完全不同;对于每一个列组,将所述列组中的位于相同行的乘法组成行组;按照第二预设顺序依次计算所述列组每一个行组中的两个乘法,且,在计算行组中的两个乘法时,按照第一预设顺序先计算行组中的位于后一列的乘法再计算行组中的位于前一列的乘法。通过本发明实施例的方法可以减少计算乘法时读取数据的读取次数,进而降低功耗。图2是根据一示例性实施例示出的一种计算方法的流程图,如图2所示,该方法包括以下步骤。在步骤s201中,按照第一预设顺序依次将相邻的两个列组成列组,任意两个列组中包括的列完全不同;例如,上表1中,按照第一预设顺序,将第一列与第二列组成一个列组,将第三列与第四列组成一个列组,将第五列与第六列组成一个列组,还剩余第七列,将第一列单独作为一个列组。在步骤s202中,对于每一个列组,将列组中的位于相同行的乘法组成行组;按照第二预设顺序的反顺序依次计算列组每一个行组中的两个乘法,且,在计算行组中的两个乘法时,按照第一预设顺序先计算行组中的位于前一列的乘法再计算行组中的位于后一列的乘法。例如,对于第三列和第四列组成的列组,将这两列中的位于第一行的两个乘法a3*b0和a2*b0组成第一个行组,将这两列中的位于第二行的两个乘法a2*b1和a1*b1组成第二个行组,将这两列中的位于第三行的两个乘法a1*b2和a0*b2组成第三个行组,将这两列中的位于第四行的两个乘法a0*b3组成第四个行组。其中,在a*b中,b为乘数,因此,b按位拆分的b0、b1、b2以及b3为这16个乘法中的被乘数,b0的位宽小于b1的位宽,b1的位宽小于b2的位宽,以及b2的位宽小于b3的位宽,且,第二预设顺序是按照乘数的位宽的由小至大的顺序,因此,第二预设顺序的反顺序是是按照乘数的位宽的由大至小的顺序。由于第一个行组中的两个乘法的乘数均为b0,第二个行组中的两个乘法的乘数均为b1,第三个行组中的两个乘法的被乘数均为b3,第一个行组中的乘法的被乘数为b3。因此,先需要先计算第四个行组中的两个乘法,再计算第三个行组中的两个乘法,然后计算第二个行组中的两个乘法,最后计算第一个行组中的乘法。由于第一预设顺序是由第一列至第七列的顺序,也即,第一预设顺序是按照被乘数的位宽由小至大的顺序。因此,先计算第四个行组中的乘法a0*b3。在第三个行组的两个乘法a1*b2和a0*b2中,a0*b2所在的列位于a1*b2所在的列之前,因此,需要先计算a0*b2,再计算a1*b2。在第二个行组的两个乘法a2*b1和a1*b1中,a1*b1所在的列位于a2*b1所在的列之前,因此,需要先计算a1*b1,再计算a2*b1。在第一个行组的两个乘法a3*b0和a2*b0中,a2*b0所在的列位于a3*b0所在的列之前,因此,需要先计算a2*b0,再计算a3*b0。综上,在计算第三列和第四列组成的列组中的乘法的计算顺序为:a0*b3、a0*b2、a1*b2、a1*b1、a2*b1、a2*b0以及a3*b0。其中,在计算这7个乘法时,先从缓存中读取a0和b3,计算a0*b3,再从缓存中读取b2,计算a0*b2,再从缓存中读取a1,计算a1*b2,再从缓存中读取a1,计算a1*b1,再从缓存中读取a2,计算a2*b1,再从缓存中读取b0,计算a2*b0,再从缓存中读取a3,计算a3*b0。除了在计算a0*b3时需要从缓存中读取两次数据,在计算其他6个乘法中的每一个乘法时只需读取一次数据,从而降低了功耗。另外,对于第一列和第二列组成的列组、第五列和第六列组成的列组,同样如此,在此不做详述。在本发明实施例中,按照第一预设顺序依次将相邻的两个列组成列组,任意两个列组中包括的列完全不同;对于每一个列组,将列组中的位于相同行的乘法组成行组;按照第二预设顺序的反顺序依次计算列组每一个行组中的两个乘法,且,在计算行组中的两个乘法时,按照第一预设顺序先计算行组中的位于前一列的乘法再计算行组中的位于后一列的乘法。通过本发明实施例的方法可以减少计算乘法时读取数据的读取次数,进而降低功耗。本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明实施例的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明实施例的一般性原理并包括本发明实施例未公开的本
技术领域:
中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明实施例的真正范围和精神由所附的权利要求指出。应当理解的是,本发明实施例并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明实施例的范围仅由所附的权利要求来限制。当前第1页12