一. 设计题目
分布式存储器构型阵列处理机实现基于快速数论变换的卷积计算
二. 设计内容
1. 多项式卷积
若有两个多项式 P ( x ) = ∑ i = 0 m a i x i P(x) = \sum_{i=0}^{m} a_i x^i P(x)=∑i=0maixi 和 Q ( x ) = ∑ j = 0 n b j x j Q(x) = \sum_{j=0}^{n} b_j x^j Q(x)=∑j=0nbjxj,它们的卷积 R ( x ) R(x) R(x) 表示为:
R ( x ) = P ( x ) ∗ Q ( x ) = ∑ k = 0 m + n c k x k R(x) = P(x) \ast Q(x) = \sum_{k=0}^{m+n} c_k x^k R(x)=P(x)∗Q(x)=k=0∑m+nckxk
其中 c k c_k ck 的计算公式为:
c k = ∑ i = 0 k a i b k − i c_k = \sum_{i=0}^{k} a_i b_{k-i} ck=i=0∑kaibk−i
2. 快速傅里叶变换
(1) 算法流程
在计算多项式卷积时,直接计算卷积的时间复杂度为 O ( n 2 ) O(n^2) O(n2),其中 n n n 是多项式的最高次数。这种方法在处理高次多项式时非常耗时。为了提高计算效率,我们可以使用快速傅里叶变换(FFT),其时间复杂度为 O ( n log n ) O(n \log n) O(nlogn)。
首先,我们将两个多项式 P ( x ) P(x) P(x) 和 Q ( x ) Q(x) Q(x) 转换为点值表示。这意味着我们选择一些点,将多项式在这些点上的值计算出来。通过 FFT,可以快速完成这一转换。
最后,通过逆快速傅里叶变换(IFFT),将卷积多项式的点值表示转换回系数表示,从而得到最终的结果。
图 1 求卷积流程
(2) 单位根
单位根是指复平面上模为1的复数,它们在复平面上均匀分布在单位圆上。这些单位根在复平面上的表示如下:
ω n k = cos 2 π k N + i sin 2 π k N \omega_n^k = \cos \frac{2\pi k}{N} + i \sin \frac{2\pi k}{N} ωnk=cosN2πk+isinN2πk
其中 i i i 是虚数单位, ω n k \omega_n^k ωnk 代表了 n n n 等分圆的圆周上,均匀分布的第 k k k 个点。
其重要性质包括:
- 周期性: ω n k + n = ω n k \omega_n^{k+n} = \omega_n^k ωnk+n=ωnk
- 对称性: ω n k + n / 2 = ω n k \omega_n^{k+n/2} = \omega_n^k ωnk+n/2=ωnk
- 折半性: ω n 2 k = ω n / 2 k \omega_{n}^{2k} = \omega_{n/2}^k ωn2k=ωn/2k
(3) FFT正变换
设有一个长度为 n n n 的序列 A ( x ) = { a 0 , a 1 , . . . , a n − 1 } A(x) = \{a_0, a_1, ... ,a_{n-1}\} A(x)={a0,a1,...,an−1},由系数求点值如下:
将序列
A
A
A 拆分为两个长度为
n
2
\frac{n}{2}
2n 的子序列,一个包含所有偶数索引的元素,另一个包含所有奇数索引的元素。
A
1
=
(
a
0
,
a
2
,
a
4
,
…
,
a
n
−
2
)
A_1 = \left( a_0, a_2, a_4,\ldots, a_{n-2} \right)
A1=(a0,a2,a4,…,an−2)
A
2
=
(
a
1
,
a
3
,
a
5
,
…
,
a
n
−
1
)
A_2 = \left( a_1, a_3, a_5, \ldots, a_{n-1} \right)
A2=(a1,a3,a5,…,an−1)
原序列可转换为以下表达式
A
(
x
)
=
A
1
(
x
2
)
+
x
A
2
(
x
2
)
A(x) = A_1(x^2) + xA_2(x^2)
A(x)=A1(x2)+xA2(x2)
代入
ω
n
k
(
k
<
n
2
)
\omega_n^k \ (k < \frac{n}{2})
ωnk (k<2n)
A
(
ω
n
k
)
=
A
1
(
ω
n
2
k
)
+
ω
n
k
A
2
(
ω
n
2
k
)
=
A
1
(
ω
n
2
k
)
+
ω
n
k
A
2
(
ω
n
2
k
)
(折半性)
\begin{align*} A(\omega_n^k) = A_1(\omega_n^{2k}) + \omega_n^kA_2(\omega_n^{2k})\\ = A_1(\omega_{\frac{n}{2}}^k) + \omega_n^kA_2(\omega_{\frac{n}{2}}^k) \ \ \ \ \text{(折半性)} \end{align*}
A(ωnk)=A1(ωn2k)+ωnkA2(ωn2k)=A1(ω2nk)+ωnkA2(ω2nk) (折半性)
代入
ω
n
k
+
n
2
(
k
<
n
2
)
\omega_n^{k+\frac{n}{2}} \ (k < \frac{n}{2})
ωnk+2n (k<2n)
A
(
ω
n
k
+
n
2
)
=
A
1
(
ω
n
2
k
+
n
)
+
ω
n
k
+
n
2
A
2
(
ω
n
2
k
+
n
)
=
A
1
(
ω
n
2
k
)
+
ω
n
k
+
n
2
A
2
(
ω
n
2
k
)
(周期性)
=
A
1
(
ω
n
2
k
)
−
ω
n
k
A
2
(
ω
n
2
k
)
(对称性)
=
A
1
(
ω
n
2
k
)
−
ω
n
k
A
2
(
ω
n
2
k
)
(折半性)
\begin{align*} A(\omega_n^{k+\frac{n}{2}}) = A_1(\omega_n^{2k+n}) + \omega_n^{k+\frac{n}{2}}A_2(\omega_n^{2k+n})\\ = A_1(\omega_n^{2k}) + \omega_n^{k+\frac{n}{2}}A_2(\omega_n^{2k}) \text{(周期性)}\\ = A_1(\omega_n^{2k}) - \omega_n^kA_2(\omega_n^{2k}) \ \ \ \ \text{(对称性)}\\ = A_1(\omega_{\frac{n}{2}}^k) - \omega_n^kA_2(\omega_{\frac{n}{2}}^k) \ \ \ \ \text{(折半性)} \end{align*}
A(ωnk+2n)=A1(ωn2k+n)+ωnk+2nA2(ωn2k+n)=A1(ωn2k)+ωnk+2nA2(ωn2k)(周期性)=A1(ωn2k)−ωnkA2(ωn2k) (对称性)=A1(ω2nk)−ωnkA2(ω2nk) (折半性)
结论:
两种情况只差在后项的正负
通过推导,将 A ( ω n k ) A(\omega_n^k) A(ωnk) 的计算转化为可以二分递推的式子。
(4) FFT逆变换
用正变换所求系数构造多项式,再带入单位根的倒数,可得公式区别仅差虚部变负。
(5) FFT的迭代实现
当 n = 8 n=8 n=8 时,我们按公式不断取序列的奇偶项:
- step 1: 0 1 2 3 4 5 6 7
- step 2: 0 2 4 6|1 3 5 7
- step 3: 0 4|2 6|1 3|5 7
- step 4: 0|4|2|6|1|3|5|7
最后序列为原序列的蝴蝶变换
通过直接得到最后序列,再自底向上从小到大合并,实现迭代。
3.快速数论变换(NTT)
设 p p p 是一个素数,且 n n n 是 p − 1 p−1 p−1 的约数, g g g 是 p p p 的一个原根。我们使用整数单位根 ω = g ( p − 1 ) / n m o d p \omega = g^{(p−1)/n} \mod p ω=g(p−1)/nmodp 代替复数单位根,同样具有上面提到的三个重要性质。这样所有运算都在模 p p p 的整数域中进行。
三.设计方案
1. 互连网络
设计采用多级混洗交换网络
图 2 多级混洗交换网络
蝴蝶变换的实现
由于冲突,需要两次交换完成,单元控制节点为不同状态
图 3 第一次变换
图 4 第二次交换
自底向上合并的实现
由公式
A
(
ω
k
n
)
=
A
1
(
ω
k
n
/
2
)
+
ω
k
n
A
2
(
ω
k
n
/
2
)
A(\omega^n_k) = A_1(\omega^{n/2}_k) + \omega^n_k A_2(\omega^{n/2}_k)
A(ωkn)=A1(ωkn/2)+ωknA2(ωkn/2)
A
(
ω
k
n
+
n
/
2
)
=
A
1
(
ω
k
n
/
2
)
−
ω
k
n
A
2
(
ω
k
n
/
2
)
A(\omega^n_k + n/2) = A_1(\omega^{n/2}_k) - \omega^n_k A_2(\omega^{n/2}_k)
A(ωkn+n/2)=A1(ωkn/2)−ωknA2(ωkn/2)
由于阵列处理机处理单元独立,不能随机访问。
下层具有
A
1
(
ω
k
n
/
2
)
A_1(\omega^{n/2}_k)
A1(ωkn/2) 的单元没有
A
2
(
ω
k
n
/
2
)
A_2(\omega^{n/2}_k)
A2(ωkn/2),反之同样。
就算
k
k
k 号单元同时具有
A
1
(
ω
k
n
/
2
)
A_1(\omega^{n/2}_k)
A1(ωkn/2) 和
A
2
(
ω
k
n
/
2
)
A_2(\omega^{n/2}_k)
A2(ωkn/2),也不知道是做和还是做差。
接下来分析互连网络需要传递什么值、传到什么位置,以及中间过程。设蝴蝶变换后新序列为 A 0 = { a 0 , a 4 , a 2 , a 6 , a 1 , a 5 , a 3 , a 7 } A_0 = \{a_0, a_4, a_2, a_6, a_1, a_5, a_3, a_7\} A0={a0,a4,a2,a6,a1,a5,a3,a7},给出每层所做运算表达式:
第 1 层(合并相邻的两个元素,步长为 1)
A 1 [ 0 ] = A 0 [ 0 ] + ω 8 0 ⋅ A 0 [ 1 ] 和 A 1 [ 1 ] = A 0 [ 0 ] − ω 8 0 ⋅ A 0 [ 1 ] A 1 [ 2 ] = A 0 [ 2 ] + ω 8 0 ⋅ A 0 [ 3 ] 和 A 1 [ 3 ] = A 0 [ 2 ] − ω 8 0 ⋅ A 0 [ 3 ] A 1 [ 4 ] = A 0 [ 4 ] + ω 8 0 ⋅ A 0 [ 5 ] 和 A 1 [ 5 ] = A 0 [ 4 ] − ω 8 0 ⋅ A 0 [ 5 ] A 1 [ 6 ] = A 0 [ 6 ] + ω 8 0 ⋅ A 0 [ 7 ] 和 A 1 [ 7 ] = A 0 [ 6 ] − ω 8 0 ⋅ A 0 [ 7 ] \begin{align*} A_1[0] = A_0[0] + \omega_8^0 \cdot A_0[1] \quad \text{和} \quad A_1[1] = A_0[0] - \omega_8^0 \cdot A_0[1]\\ A_1[2] = A_0[2] + \omega_8^0 \cdot A_0[3] \quad \text{和} \quad A_1[3] = A_0[2] - \omega_8^0 \cdot A_0[3]\\ A_1[4] = A_0[4] + \omega_8^0 \cdot A_0[5] \quad \text{和} \quad A_1[5] = A_0[4] - \omega_8^0 \cdot A_0[5]\\ A_1[6] = A_0[6] + \omega_8^0 \cdot A_0[7] \quad \text{和} \quad A_1[7] = A_0[6] - \omega_8^0 \cdot A_0[7] \end{align*} A1[0]=A0[0]+ω80⋅A0[1]和A1[1]=A0[0]−ω80⋅A0[1]A1[2]=A0[2]+ω80⋅A0[3]和A1[3]=A0[2]−ω80⋅A0[3]A1[4]=A0[4]+ω80⋅A0[5]和A1[5]=A0[4]−ω80⋅A0[5]A1[6]=A0[6]+ω80⋅A0[7]和A1[7]=A0[6]−ω80⋅A0[7]
第 2 层(合并相邻的两个元素,步长为 2)
A 2 [ 0 ] = A 1 [ 0 ] + ω 8 0 ⋅ A 1 [ 2 ] 和 A 2 [ 2 ] = A 1 [ 0 ] − ω 8 0 ⋅ A 1 [ 2 ] A 2 [ 1 ] = A 1 [ 1 ] + ω 8 1 ⋅ A 1 [ 3 ] 和 A 2 [ 3 ] = A 1 [ 1 ] − ω 8 1 ⋅ A 1 [ 3 ] A 2 [ 4 ] = A 1 [ 4 ] + ω 8 0 ⋅ A 1 [ 6 ] 和 A 2 [ 6 ] = A 1 [ 4 ] − ω 8 0 ⋅ A 1 [ 6 ] A 2 [ 5 ] = A 1 [ 5 ] + ω 8 1 ⋅ A 1 [ 7 ] 和 A 2 [ 7 ] = A 1 [ 5 ] − ω 8 1 ⋅ A 1 [ 7 ] \begin{align*} A_2[0] = A_1[0] + \omega_8^0 \cdot A_1[2] \quad \text{和} \quad A_2[2] = A_1[0] - \omega_8^0 \cdot A_1[2]\\ A_2[1] = A_1[1] + \omega_8^1 \cdot A_1[3] \quad \text{和} \quad A_2[3] = A_1[1] - \omega_8^1 \cdot A_1[3]\\ A_2[4] = A_1[4] + \omega_8^0 \cdot A_1[6] \quad \text{和} \quad A_2[6] = A_1[4] - \omega_8^0 \cdot A_1[6]\\ A_2[5] = A_1[5] + \omega_8^1 \cdot A_1[7] \quad \text{和} \quad A_2[7] = A_1[5] - \omega_8^1 \cdot A_1[7] \end{align*} A2[0]=A1[0]+ω80⋅A1[2]和A2[2]=A1[0]−ω80⋅A1[2]A2[1]=A1[1]+ω81⋅A1[3]和A2[3]=A1[1]−ω81⋅A1[3]A2[4]=A1[4]+ω80⋅A1[6]和A2[6]=A1[4]−ω80⋅A1[6]A2[5]=A1[5]+ω81⋅A1[7]和A2[7]=A1[5]−ω81⋅A1[7]
第 3 层(合并相邻的两个元素,步长为 4)
A 3 [ 0 ] = A 2 [ 0 ] + ω 8 0 ⋅ A 2 [ 4 ] 和 A 3 [ 4 ] = A 2 [ 0 ] − ω 8 0 ⋅ A 2 [ 4 ] A 3 [ 1 ] = A 2 [ 1 ] + ω 8 1 ⋅ A 2 [ 5 ] 和 A 3 [ 5 ] = A 2 [ 1 ] − ω 8 1 ⋅ A 2 [ 5 ] A 3 [ 2 ] = A 2 [ 2 ] + ω 8 2 ⋅ A 2 [ 6 ] 和 A 3 [ 6 ] = A 2 [ 2 ] − ω 8 2 ⋅ A 2 [ 6 ] A 3 [ 3 ] = A 2 [ 3 ] + ω 8 3 ⋅ A 2 [ 7 ] 和 A 3 [ 7 ] = A 2 [ 3 ] − ω 8 3 ⋅ A 2 [ 7 ] \begin{align*} A_3[0] = A_2[0] + \omega_8^0 \cdot A_2[4] \quad \text{和} \quad A_3[4] = A_2[0] - \omega_8^0 \cdot A_2[4]\\ A_3[1] = A_2[1] + \omega_8^1 \cdot A_2[5] \quad \text{和} \quad A_3[5] = A_2[1] - \omega_8^1 \cdot A_2[5]\\ A_3[2] = A_2[2] + \omega_8^2 \cdot A_2[6] \quad \text{和} \quad A_3[6] = A_2[2] - \omega_8^2 \cdot A_2[6]\\ A_3[3] = A_2[3] + \omega_8^3 \cdot A_2[7] \quad \text{和} \quad A_3[7] = A_2[3] - \omega_8^3 \cdot A_2[7] \end{align*} A3[0]=A2[0]+ω80⋅A2[4]和A3[4]=A2[0]−ω80⋅A2[4]A3[1]=A2[1]+ω81⋅A2[5]和A3[5]=A2[1]−ω81⋅A2[5]A3[2]=A2[2]+ω82⋅A2[6]和A3[6]=A2[2]−ω82⋅A2[6]A3[3]=A2[3]+ω83⋅A2[7]和A3[7]=A2[3]−ω83⋅A2[7]
结论 1:
- 步长是 2 的次方(由于折半性,二分递归)。
- 需要传递的位置与当前位置相差步长,即某位二进制取反。
- 将使用相同两个参数的公式一组,索引较大的数做减法,较小的数做加法。
结论 2:
再由混洗交换网络公式及结论 1 得:
S
h
u
f
f
l
e
(
P
n
−
1
P
n
−
2
…
P
1
P
0
)
=
P
n
−
2
…
P
1
P
0
P
n
−
1
\mathrm{Shuffle}\left(P_{n-1}P_{n-2}\ldots P_1P_0\right) = P_{n-2}\ldots P_1P_0P_{n-1}
Shuffle(Pn−1Pn−2…P1P0)=Pn−2…P1P0Pn−1
可以发现 Shuffle 是在做循环左移。
- 每级对应二进制每位。
- 该级节点由直连变为交换,是在做二进制取反。
- 取反后,下播的数最终一定会送到索引较大的位置(相对于上播的数)。
综上,给出做自底向上合并时的互连网络控制,以中间第 1 级为例
图 5 级控制
在交换时,下播打上标记,这样 PE(处理单元)发现自己取的数有标记,执行减法,否则执行加法。
由于是在模
p
p
p 意义下,标记设计为加上模数。
处理单元PE
处理单元的作用设计为:
- 具备译码功能的小控制器,根据指令自动识别是否接受互连网络的数据。
- 互联网络与 PEM 的桥梁。
- 进行算术运算和逻辑运算。
- 直接控制 PEM 是否存数,以及存到哪一寄存器。
对于每个PE,设计其计算公式如下:
A k = ( − 1 ) f ⋅ x ⋅ r f + y ⋅ r f m o d p A_k = (-1)^f \cdot x \cdot r^f + y \cdot r^f \mod p Ak=(−1)f⋅x⋅rf+y⋅rfmodp
其中:
- f = [ y < p ] f = [y < p] f=[y<p],即是否有标记
- x x x 代表PE原本存的数,即上次计算结果
- y y y 代表互连网络传来的数
这样,每个PE只需执行相同操作,计算相同公式就可以完成快速数论变换。
存储器模块PEM
只能存取数。
系统控制器SC
进行资源管理。
主存CUM采用分段式存储,SC内存储了段基址和栈指针,再传入偏移量可以计算真实地址,返回给CU。
控制部件 CU
处理单元的作用设计为:
- 控制所有其他部件。
- 数据总线连接所有 PEM。
- 控制总线连接所有 PE。
- 和主存 CUM 在一体,存取主存。
四.指令设计
1. 指令格式
操作码 (6位) 地址码 (26位) \begin{array}{|c|c|} \hline \text{操作码 (6位)} & \text{地址码 (26位)} \\ \hline \end{array} 操作码 (6位)地址码 (26位)
零地址指令
down
一地址指令
call
ret
jmp
je
rec
二地址指令
push
load
movc
三地址指令
chac
cmp
optc
五地址指令
chau
2. 指令设计
设计原则
- 尽量短
- 有足够的操作码位数
- 指令编码有唯一的解释
- 指令字长是字节的整数倍
寻址方式
- 基址寻址: EA = A + ( B ) \text{EA} = A + (B) EA=A+(B)
- 立即数寻址:指令中直接给出立即数
操作功能
push
:把指定内存地址的内容压到栈中。load
:把指定内存地址的内容存入指定编号的PEM。call
:调用函数。ret
:返回出函数。movc
:PEM内寄存器/内存之间传送数据。chau
:分别设置交换网络某一级的四个节点的状态。chac
:分别设置交换网络某一级的状态。cmp
:把指定内存地址的内容和一个立即数比较。je
:判断是否成立并跳转到相应的指令地址。jmp
:无条件跳转。opt
:把PEM指定位置的两个数做指定的运算。rec
:接收互连网络传来的数。
3. 详细设计
指令 | 描述 |
---|---|
LOAD | 对应SC的块号(SC对应块号中存着基地址) 内存偏移量(16位) |
PUSH | 内存偏移量(16位) PEM内存位置(4位) |
CALL | 函数(4位) |
RET | 栈中存在的此函数的参数的个数(4位) |
MOVC | PEM内存位置(4位) PEM内存位置(4位) |
CHAU | 网络某一级(2位) 状态(3位) 状态(3位) 状态(3位) 状态(3位) |
CHAC | 第一级状态(3位) 第二级状态(3位) 第三级状态(3位) |
CMP | 对应SC的块号 内存偏移量(16位) 立即数 |
JE | 内存偏移量(16位) |
JMP | 内存偏移量(16位) |
OPT | 操作(4位) PEM内存位置(4位) PEM内存位置(4位) |
REC | 接收状态(8位) |
4. 全部指令
五. 器件设计
1. 器件连线:
(1) 纸上设计
在纸上设计连线图时确定了各个器件的位置和布局,根据硬件设计的要求和引脚的功能,逐一连接了相应的引脚。
(2) 软件连线
2. 引脚设计:
(1) SC
SC_R = 0 无操作
SC_R = 1 if(in_index值为15) 则out_put <- sc[in_index] - in_offset
else out_put <= sc[in_index] + in_offset
inc_esp = 00 无操作
inc_esp = 01 sc[15]+=1
inc_esp = 10 sc[15]-=1
inc_esp = 11 sc[15]-=in_offset
(2) PE
PEM_R 和 PEM_W 均为对PEM的控制线
con 和 PE_R 均为CU对PE的控制线;con负责传给PE具体指令;PE_R = 0, PE不译码;PE_R = 1, PE译码。
(3) PEM
PEM_R = 0,out_pe <- PEM[7]
PEM_R = 1,out_pe <- PEM[IN_CU]
PEM_W = 00,无操作
PEM_W = 01,PEM[IN_CU] <- IN_PE
PEM_W = 11,PEM[8] <- IN_CU
(4) 互联网络中的结点
state = 000,out_1 <- in_1,out_2 <- in_2
state = 001,out_1 <- in_2,out_2 <- in_1
state = 010,out_1 <- in_2,out_2 <- in_1(赋予特殊标记)
(5) CU,如图 7
out_esp,out_stk0…out_stk6为测试接口
除in或out开头的输入输出接口外,均为控制线
3. 指令分析:
(1) PUSH
- IR中的num和offset字段数据流向SC,并将SC_R置为1,P1收到来自SC的计算结果
- 将SC[15]加1,同时15和0流向SC,SC_R置为,P2收到来自SC的计算结果
- M[P2] <- M[P1]。
(2) LOAD
- 15和0流向SC,并将SC_R置为1,P1收到来自SC的计算结果
- P1的数据流入PEM[8]
(3) CALL
- 让SC[15]中的数据加1,15和0流向SC,SC_R置为1,计算出栈顶
- 将PC放入栈顶
- IR中的num字段和0流入SC,SC_R置为1,计算出的值赋给PC
(4) RET
- 计算出栈顶
- 栈顶的地址赋给PC,然后栈顶减1
- 栈顶减去参数个数
(5) MOVC
- 位置1从数据线流向各个PEM
- PE向PEM传达读的控制信号,使PEM对应地址的数据流向PE的0号单元
- 位置2从数据线流向各个PEM
- PE向PEM传达写的控制信号,使PE的0号单元对应的数据流向PEM的对应地址
(6) CHAU
- CU根据级数字段判断哪一级的状态要改变
- a,b,c,d字段通过控制线流向各个结点
(7) CHAD
- CU按照指令字段,以一级为单位,改变结点状态
- a,b,c字段通过控制线流向各个结点
(8) CMP
- 字段号和偏移量通过CU流向SC,SC的计算结果流回CU
- 根据计算结果,进行判断
(9) je
- 若flag为0,无操作;若flag为1,字段号和偏移量通过CU流向SC,SC的计算结果流回CU
- (若flag为1)PC被修改为SC的计算结果
(10) jmp
- 字段号和偏移量通过CU流向SC,SC的计算结果流回CU
- PC被修改为SC的计算结果
(11) OPTC
- 位置1从数据线流向各个PEM,让PE译码的控制信号通过译码控制线流入PE
- PE对PEM发送读的控制信号
- PEM[位置1]的数据流入PE的0号单元
- 位置2从数据线流向各个PEM,让PE译码的控制信号通过译码控制线流入PE
- PE对PEM发送读的控制信号
- PEM[位置2]的数据流入PE的1号单元
- 计算结果被放在输出接口
- PE对PEM发送写的控制信号,计算结果被写入PEM[8]
(12) REC
接收状态字段流入PE,PE得知自己是否应该让PEM接收来自互联网络的数据
4. 微指令构造:
微指令(左)
微指令(右),如图 9
5. ASM图绘制
六.正确性验证
验证程序经过评测平台洛谷的正确性验证,加入了打印中间结果代码
数据来源同样来自洛谷
由于pe只有8个,所以最高只能算到7次多项式
1.第一次正变换
2.第二次正变换
3.第三次逆变换及最后同乘上模意义下的n逆
七.设计总结
实验设计基于对快速数论变换的深入理解。快速数论变换是一种离散傅里叶变换的离散域等价形式,特别适用于整数域的卷积计算。然而,本次实验也存在一定的局限性。首先,在实际实现中,分布式存储器构型的阵列处理机在数据通信和同步方面可能会引入额外的开销。尽管并行计算能够显著提升计算效率,但在处理单元之间的数据传输和结果合并过程中,可能会遇到通信瓶颈。此外,数论变换对模数选择和原根选择有严格要求,不如快速数论变换在实数域中运算通用。
未来的改进方向主要包括几个方面。首先,可以加入IO系统,完善阵列处理设计。其次,设计浮点数运算及三角函数,改为用快速傅里叶变换实现,提高通用性。除此之外,增加处理单元个数,在CU中加入操作系统,自动分配指定活跃的PE进行运算,实现负载平衡。
总之,在本次实验中,我设计并实现了一个能计算卷积的阵列处理机。这一方法可以充分利用分布式存储器和并行计算的优势,以提升多项式卷积计算的效率。