本公开涉及数字处理技术领域,尤其涉及乘累加运算方法及装置。
背景技术:
目前,在系统应用中,几乎所有复杂算法的实现都离不开成累加运算。在可编程逻辑器件中,利用成累加运算单元来实现复杂的数字信号处理,在器件中乘累加运算单元的速度、功耗、位宽等性能决定了对数字信号的处理能力,是可编程逻辑器件中最基本、最核心的功能模块之一。
在传统结构中,乘累加运算装置包括多级运算单元,下一级的运算单元需要等待上一级运算单元计算完成后获取上一级运算单元的计算结果再执行相应的计算,因此,乘累加运算装置无法在每个时钟都进行计算,所以,计算速率降低,性能损失严重。
技术实现要素:
本公开实施例提供乘累加运算方法及装置。所述技术方案如下:
根据本公开实施例的第一方面,提供一种乘累加运算装置,包括:乘积模块、第一累加模块、第二累加模块,其中,所述第二累加模块包括二级流水线加法器;
所述乘积模块,用于获取至少两组目标数据,对每组目标数据执行乘积运算,并输出得到的乘积结果到所述第一累加模块;
所述第一累加模块,用于对所述乘积结果进行累加,并输出得到的第一累加结果;
所述第二累加模块,用于在每个时钟获取一组所述第一累加结果;在奇数时钟时,输出对偶数组的第一累加结果进行累加的第一计算结果;在偶数时钟时,输出对奇数组的第一累加结果进行累加的第二计算结果;并将所述第一计算结果和第二计算结果相加,得到最终成累加结果。
可选的,所述第二累加模块包括:第一选择子模块、第二选择子模块、加法子模块和缓存子模块,其中,所述加法子模块为二级流水线加法器,所述第一累加模块输出的第一累加结果为sum[i],i为1~n,n为大于1的整数;
所述第一选择子模块,用于在第k个时钟时,获取所述第一累加结果sum[i]并输出到所述加法子模块,k为大于1的整数;
所述第二选择子模块,用于获取所述加法子模块输出的第二累加结果acc[j],j为1~n,i=j;在第k个时钟时,将第二累加结果acc[j-2]输出到所述加法子模块;
所述加法子模块,用于对从所述第一选择子模块和第二选择子模块输入的数据进行累加计算,得到所述第二累加结果acc[j];当j等于n-1时,将所述第二累加结果acc[n-1]输出到所述缓存子模块;
所述缓存子模块,用于缓存所述第二累加结果acc[n-1]。
可选的,所述第一选择子模块,用于接收所述第一累加结果sum[i]及所述加法子模块输出的第二累加结果acc[j];当倒数第二个时钟时,将所述第二累加结果acc[n]输出到所述加法子模块,当非倒数第二个时钟时,将所述第一累加结果sum[i]输出到所述加法子模块;
所述第二选择子模块,用于当第一个时钟和第二个时钟时,将0输出到所述加法子模块;当倒数第二个时钟时,从所述缓存子模块获取所述第二累加结果acc[n-1]并输出值所述加法子模块;当不是第一个时钟、第二个时钟或倒数第二个时钟时,将第二累加结果acc[j-2]输出到所述加法子模块;
所述加法子模块,用于当最后一个时钟时,将从所述第一选择子模块获取所述第二累加结果acc[n]以及从所述第二选择模块子获取的所述第二累加结果acc[n-1]进行累加计算,得到最终累加结果;将所述第二累加结果acc[j]输出到所述第一选择子模块和第二选择子模块。
可选的,所述加法子模块,在第一个时钟时,从所述第一选择子模块获取sum[1],从所述第二选择子模块获取0,计算得到acc[1]=sum[1];在第二个时钟时,从所述第一选择子模块获取sum[2],从所述第二选择子模块获取0,计算得到acc[2]=sum[2];
在除第一个时钟外的奇数时钟,即j为奇数且不等于1时,对偶数组的第一累加结果进行累加的第一计算结果为:
当n为偶数时,
当n为奇数时,
在除第二个时钟外的偶数时钟,即j为偶数且不等于2时,对奇数组的第一累加结果进行累加的第二计算结果为:
当n为偶数时,
当n为奇数时,
可选的,所述乘积模块包括至少两个乘法器,所述乘法器为二级流水线乘法器,所述第一累加模块包括加法器,所述加法器为二级流水线加法器。
根据本公开实施例的第二方面,提供一种乘累加运算方法,其特征在于,包括:
获取至少两组目标数据,对每组目标数据执行乘积运算,并输出得到的乘积结果到所述第一累加模块;
对所述乘积结果进行累加计算,并输出得到的第一累加结果;
在每个时钟获取一组所述第一累加结果,在奇数时钟时,采用二级流水线运算方式对输出对偶数组的第一累加结果进行累加的第一计算结果,采用二级流水线运算方式对在偶数时钟时,输出对奇数组的第一累加结果进行累加的第二计算结果;
采用二级流水线运算方式对将所述第一计算结果和第二计算结果相加,得到最终成累加结果。
可选的,所述第一累加结果为sum[i],i为1~n,n为大于1的整数;
所述在每个时钟获取一组所述第一累加结果,在奇数时钟时,采用二级流水线运算方式对输出对偶数组的第一累加结果进行累加的第一计算结果,采用二级流水线运算方式对在偶数时钟时,输出对奇数组的第一累加结果进行累加的第二计算结果,包括:
在第k个时钟时,获取所述第一累加结果sum[i],k为大于1的整数;
获取第二累加结果acc[j-2],j为1~n,i=j;
将所述第一累加结果sum[i]与所述第二累加结果acc[j-2]进行累加计算,得到所述第二累加结果acc[j];
当j等于n-1时,将所述第二累加结果acc[n-1]进行缓存。
可选的,所述在每个时钟获取一组所述第一累加结果,在奇数时钟时,采用二级流水线运算方式对输出对偶数组的第一累加结果进行累加的第一计算结果,采用二级流水线运算方式对在偶数时钟时,输出对奇数组的第一累加结果进行累加的第二计算结果,还包括:
当第一个时钟时,获取所述第一累加结果sum[1]及0,进行累加计算,得到所述第二累加结果acc[1]=sum[1];
当第二个时钟时,获取所述第一累加结果sum[2]及0,进行累加计算,得到所述第二累加结果acc[2]=sum[2];
在除第一个时钟外的奇数时钟,即j为奇数且不等于1时,对偶数组的第一累加结果进行累加的第一计算结果为:
当n为偶数时,
当n为奇数时,
在除第二个时钟外的偶数时钟,即j为偶数且不等于2时,对奇数组的第一累加结果进行累加的第二计算结果为:
当n为偶数时,
当n为奇数时,
当倒数第二个时钟时,获取所述第二累加结果acc[n]及缓存的第二累加结果acc[n-1]并进行相加,得到所述最终累加结果。
可选的,所述对每组目标数据执行乘积运算,包括:
采用二级流水线运算方式对每组目标数据执行乘积运算;
对所述乘积结果进行累加计算,包括:
采用二级流水线运算方式对所述乘积结果进行累加计算。
本公开的实施例提供的技术方案可以包括以下有益效果:
本实施例中,在每一时钟,第一累加模块都可以向第二累加模块输入数据,即每个时钟第二累加模块13都在进行计算,使得整个乘累加运算装置的计算速率提高一倍,对系统性能进行有效的提高,降低了硬件资源的浪费。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
图1是根据一示例性实施例示出的一种乘累加运算装置的框图。
图2是根据一示例性实施例示出的一种乘累加运算装置的结构图。
图3是根据一示例性实施例示出的第二累加模块的框图。
图4是根据另一示例性实施例示出的第二累加模块的框图。
图5是根据一示例性实施例示出的一种乘累加运算方法的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
图1是根据一示例性实施例示出的一种乘累加运算装置的框图,如图1所示,该乘累加运算装置包括:乘积模块11、第一累加模块12、第二累加模块13,其中,第二累加模块12包括二级流水线加法器。
乘积模块11,用于获取至少两组目标数据,对每组目标数据执行乘积运算,并输出得到的乘积结果到第一累加模块;
第一累加模块12,用于对乘积结果进行累加,并输出得到的第一累加结果;
第二累加模块13,用于在每个时钟获取一组第一累加结果;在奇数时钟时,输出对偶数组的第一累加结果进行累加的第一计算结果;在偶数时钟时,输出对奇数组的第一累加结果进行累加的第二计算结果;并将第一计算结果和第二计算结果相加,得到最终成累加结果。
本实施例中,在每一时钟,第一累加模块12都可以向第二累加模块13输入数据,即每个时钟第二累加模块13都在进行计算,使得整个乘累加运算装置的计算速率提高一倍,对系统性能进行有效的提高,降低了硬件资源的浪费。
本实施例中,乘积模块11中包括多个乘法器,该乘法器可以为二级流水线乘法器。第一累加模块12包括多级加法单元,每一级加法单元可包括多个加法器,每个加法器都可以是二级流水线乘法器。
图2是根据一示例性实施例示出的一种乘累加运算装置的结构图,如图2所示,例如,乘积模块11中包括4个乘法器211、212、213和214;第一累加模块12包括2级加法单元,第1级加法单元包括2个加法器221和222,第2级加法单元包括1个加法器231。
以上仅是对乘累加运算装置中的乘积模块和第一累加模块的举例说明,乘积模块中乘法器的个数可以根据需要设置为为2n个,n为大于等于1的整数,第一累加模块中加法单元的级数可以n级,每级加法单元中加法器的个数依次为2n-1、2n-2、……、1个。
图3是根据一示例性实施例示出的第二累加模块的框图,如图3所示,第二累加模块包括:第一选择子模块31、第二选择子模块32、加法子模块33和缓存子模块34,其中,加法子模块33为二级流水线加法器,第一累加模块输出的第一累加结果为sum[i],i为1~n,n为大于1的整数。
第一选择子模块31,用于在第k个时钟时,获取第一累加结果sum[i]并输出到加法子模块33,k为大于1的整数。
第二选择子模块32,用于获取加法子模块33输出的第二累加结果acc[j],j为1~n,i=j;在第k个时钟时,将第二累加结果acc[j-2]输出到加法子模块。
加法子模块33,用于对从第一选择子模块31和第二选择子模块32输入的数据进行累加计算,得到第二累加结果acc[j];当j等于n-1时,将第二累加结果acc[n-1]输出到缓存子模块34。
缓存子模块34,用于缓存第二累加结果acc[n-1]。
其中,第一选择子模块31,用于接收第一累加结果sum[i]及加法子模块33输出的第二累加结果acc[j];当倒数第二个时钟时,将第二累加结果acc[n]输出到加法子模块33,当非倒数第二个时钟时,将第一累加结果sum[i]输出到加法子模块33。
第二选择子模块32,用于当第一个时钟和第二个时钟时,将0输出到加法子模块33;当倒数第二个时钟时,从缓存子模块34获取第二累加结果
acc[n-1]并输出值加法子模块33;当不是第一个时钟、第二个时钟或倒数第二个时钟时,将第二累加结果acc[j-2]输出到加法子模块33。
加法子模块33,用于当最后一个时钟时,将从第一选择子模块31获取第二累加结果acc[n]以及从第二选择模块子32获取的第二累加结果acc[n-1]进行累加计算,得到最终累加结果;将第二累加结果acc[j]输出到第一选择子模块31和第二选择子模块32。
在第一个时钟时,加法子模块33从第一选择子模块获取sum[1],从第二选择子模块获取0,计算得到acc[1]=sum[1];在第二个时钟时,从第一选择子模块获取sum[2],从第二选择子模块获取0,计算得到acc[2]=sum[2]。
在除第一个时钟外的奇数时钟,即j为奇数且不等于1时,对偶数组的第一累加结果进行累加的第一计算结果为:
当n为偶数时,
当n为奇数时,
在除第二个时钟外的偶数时钟,即j为偶数且不等于2时,对奇数组的第一累加结果进行累加的第二计算结果为:
当n为偶数时,
当n为奇数时,
以下以一个具体实例对本公开的实施例进行说明。
图4是根据另一示例性实施例示出的第二累加模块的框图,如图4所示,第二累加模块中的加法子模块33为二级流水线浮点加法器,两级流水线依次用pipeline1和pipeline2表示。对于每一个加法运算,例如32bt的数据的加法运算,在第一时钟,可以由pipeline1执行前16位数据的加法运算,将结果发送给pipeline2,在第二时钟,pipeline2执行后16位数据的加法运算,并将pipeline1的计算结果与自身的计算结果组合后,得到最终的加法运算结果。
第一累加模块每个时钟的输出结果用sum1,sum2,sum3,sum4表示。
第二累加模块每个时钟的输出结果用acc1,acc2,acc3,acc4表示,最终累加结果用acc_final表示。
(1)第一时钟
第一选择子模块31将sum1输出给pipeline1,第二选择子模块32将0输出给pipeline1,pipeline1执行sum1同初值0的加法。
(2)第二时钟
pipeline2获取pipeline1第一时钟的输出结果并继续执行sum1同初值0的加法,输出acc1。
第一选择子模块31将sum2输出给pipeline1,第二选择子模块32将0输出给pipeline1,pipeline1执行sum2同初值0的加法。
(3)第三时钟
第一选择子模块31将sum3输出到pipeline1,第二选择子模块32将第二时钟pipeline2的输出结果acc1发送给pipeline1,pipeline1执行acc1同sum3的加法。
pipeline2获取第二时钟pipeline1的输出结果,并继续执行sum2同初值0的加法,输出acc2。
(4)第四时钟
第一选择子模块31将sum4输出到pipeline1,第二选择子模块32将第三时钟pipeline2的输出结果acc2发送给pipeline1,pipeline1执行acc2同sum4的加法。
pipeline2获取第三时钟pipeline1的输出结果,并继续执行sum3同acc1的加法,输出acc3。
(5)第五时钟
缓存子模块34获取pipeline2第四时钟的输出结果acc3进行缓存。
pipeline1停止工作。
pipeline2获取第四时钟pipeline1的输出结果,并继续执行acc2同sum4的加法,输出acc4。
(6)第六时钟
第一选择子模块31将acc4输出到pipeline1,第二选择子模块32将缓存模块子34缓存的acc3发送给pipeline1,pipeline1执行acc3同acc4的加法。
此时pipeline2停止工作。
(7)第七时钟
pipeline2获取第六时钟pipeline1的计算结果并继续执行acc3同acc4的加法。此时pipeline1停止工作。
(8)第八时钟
pipeline2的输出结果最终的累加结果acc_final。
通过上述计算过程可以看出,在奇数时钟,得到的实际上是偶数组的累加结果,例如,第三时钟,输出的acc2=sum4;第五时钟,输出的acc4=sum2+sum4。在偶数时钟,得到的是奇数组的累加结果,如第二时钟,输出的acc1=sum1;第四时钟,输出的acc3=sum1+sum3。
本实施例的二级流水线设计,在每一时钟,第一累加模块12都可以向第二累加模块13输入数据,即每个时钟第二累加模块13都在进行计算,使得整个乘累加运算装置的计算速率提高一倍,对系统性能进行有效的提高,降低了硬件资源的浪费。
图5是根据一示例性实施例示出的一种乘累加运算方法的框图,如图5所示,该乘累加运算方法包括:
步骤S51,获取至少两组目标数据,对每组目标数据执行乘积运算,并输出得到的乘积结果到第一累加模块;
步骤S52,对乘积结果进行累加计算,并输出得到的第一累加结果;
步骤S53,在每个时钟获取一组第一累加结果,在奇数时钟时,采用二级流水线运算方式对输出对偶数组的第一累加结果进行累加的第一计算结果,采用二级流水线运算方式对在偶数时钟时,输出对奇数组的第一累加结果进行累加的第二计算结果;
步骤S54,采用二级流水线运算方式对将第一计算结果和第二计算结果相加,得到最终成累加结果。
其中,第一累加结果为sum[i],i为1~n,n为大于1的整数。上述步骤S53包括:
在第k个时钟时,获取第一累加结果sum[i],k为大于1的整数;
获取第二累加结果acc[j-2],j为1~n,i=j;
将第一累加结果sum[i]与第二累加结果acc[j-2]进行累加计算,得到第二累加结果acc[j];
当j等于n-1时,将第二累加结果acc[n-1]进行缓存。
上述步骤S53还包括:
当第一个时钟时,获取第一累加结果sum[1]及0,进行累加计算,得到第二累加结果acc[1]=sum[1]。
当第二个时钟时,获取第一累加结果sum[2]及0,进行累加计算,得到第二累加结果acc[2]=sum[2]。
在除第一个时钟外的奇数时钟,即j为奇数且不等于1时,对偶数组的第一累加结果进行累加的第一计算结果为:
当n为偶数时,
当n为奇数时,
在除第二个时钟外的偶数时钟,即j为偶数且不等于2时,对奇数组的第一累加结果进行累加的第二计算结果为:
当n为偶数时,
当n为奇数时,
当倒数第二个时钟时,获取第二累加结果acc[n]及缓存的第二累加结果acc[n-1]并进行相加,得到最终累加结果。
上述步骤51包括:采用二级流水线运算方式对每组目标数据执行乘积运算。
上述步骤52包括:采用二级流水线运算方式对乘积结果进行累加计算。
本领域技术人员在考虑说明书及实践这里公开的公开后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。