5

我有以下数据:

A = [a0 a1 a2 a3 a4 a5 .... a24]
B = [b0 b1 b2 b3 b4 b5 .... b24]

然后我想乘以如下:

C = A * B' = [a0b0 a1b1 a2b2 ... a24b24]

这显然涉及 25 次乘法。

但是,在我的场景中,每次“循环迭代”只有 5 个新值移入 A(并且 5 个旧值移出 A)。有没有什么快速的方法来利用数据正在通过 A 移动而不是全新的事实?理想情况下,我想最小化乘法运算的数量(以可能更多的加法/减法/累加为代价)。我最初认为收缩阵列可能会有所帮助,但它没有(我认为!?)

更新 1:Note B 长期固定,但可以重新编程。

更新 2: A 的移位如下: a[24] <= a[19], a[23] <= a[18]... a[1] <= new01, a[0] <=新00。依此类推每个时钟周期

非常感谢!

4

3 回答 3

2

有没有什么快速的方法来利用数据正在通过 A 移动而不是全新的事实?

尽管您所做的只是向 A 移动和添加新元素,但 C 中的乘积通常都会有所不同,因为其中一个操作数通常会在每次迭代后发生变化。如果您有关于 A 或 B 的元素结构方式的其他信息,您可能会使用该结构来减少乘法次数。除非考虑任何此类结构因素,否则您必须在每个循环中计算所有 25 个产品。

理想情况下,我想最小化乘法运算的数量(以可能更多的加法/减法/累加为代价)。

理论上,您可以通过移动和添加数组元素来模拟乘法,将乘法次数减少到 0。在实践中,这将比硬件乘法慢,所以你最好只使用任何可用的基于硬件的乘法,除非你没有提到一些额外的相关约束。

于 2013-04-11T17:41:59.040 回答
1

在前5 个数据集上,您最多可以保存 50 个乘法。但在那之后,它是一条平坦的乘法之路。因为对于前 5 组之后的每一组,您都需要乘以新的数据集。

我假设所有数组都初始化为零。考虑到整体的乘法量,我认为节省的 50 个没有任何用处。

但是我仍然会提示您如何保存这 50 个,也许您可​​以找到它的扩展名?

第一个数据集到达:将第一个数据集a与每个数据集相乘b全部保存,只a复制a[0]到。这里有 25 个乘法a[4]c

a[0]第二个数据集到达:仅乘以a[4](具有新数据)与b[0]分别b[4]。保存a[0]a[4],复制a[0->9]c这里有5个乘法

a[0]第3个数据集到a[9]了:这次乘以和复制b[0]到对应。这里有 10 个乘法b[9]a[0->14]c

a[0]第 4 个数据集:与a[14]对应的 b副本相乘。这里有 15 个乘法a[0->19]c

第5个数据集:与对应a[0]的副本 相乘。这里有 20 个乘法a[19]ba[0->24]c

节省的乘法总数:50次乘法。

第 6 个数据集:通常的数据乘法。每个 25 个。这是因为对于数组中的每个集合,a都有一个新的数据集可用,因此乘法是不可避免的。

于 2013-04-11T18:53:54.600 回答
0

您能否添加另一个数组 D 来标记 A 中已更改/未更改的值。每次检查此数组以决定是否进行新的乘法运算。

于 2013-04-11T16:18:26.620 回答