Altifigence Academy

13 / 20 · 概念

分块与边界填充

将较大矩阵映射到较小网格,并处理零填充与输出掩码。

先对输出空间分块

N×N 网格通过 ceil(M/N)×ceil(P/N) 个空间分块处理较大的 M×P 结果。基础设计在每个分块中保留完整归约 K,并在输出分块之间清零。封装逻辑存储分块原点 r0,c0;本地 PE(i,j) 对应全局 C(r0+i,c0+j)。输入错位由本地坐标决定。

设 N=2、M=P=K=3。A=[[1,2,3],[4,5,6],[7,8,9]],B=[[1,0,2],[0,1,0],[2,0,1]]。乘积为 [[7,2,5],[16,5,14],[25,8,23]]。四个分块原点为 (0,0)、(0,2)、(2,0) 和 (2,2)。

填充操作数,屏蔽存储

将超范围的 A 行和 B 列作为有效零令牌提供。每个 PE 仍使用 K 项,保持简单的完成约定。如果把填充项改为无效,则某些 count 可能永远小于 K。应独立屏蔽结果存储,防止写入真实矩阵范围之外。

最后一个分块使用 A=[[7,8,9],[0,0,0]] 和 B=[[2,0],[0,0],[1,0]]。本地结果为 [[23,0],[0,0]],但只有左上值可写入 C(2,2)。数值为零不能使超范围地址变得安全。

每个分块需要五个推进时钟沿,四个顺序分块共二十个,不包含清零、加载和输出传送。网格执行四十八次含填充的 MAC;只有二十七次属于真实的 3×3 乘积。

归约分块需要保留和

拆分 K 需要合并同一输出的部分和。C(0,0)=1×1+2×0+3×2=7,在 K=2+1 时分成部分和一和六。如果在这两次归约之间清除最终累加器,就只剩六。应保留累加器,或在其他位置合并宽部分和。先量化每个部分和再合并,可能不同于对完整和只量化一次。

综合项目先采用空间分块和完整 K。测试单元素边界、尺寸可被 N 整除的情况、只有一个真实输出的最终分块、有效填充零和输出掩码。参考记分板以全局坐标为键,确保改变分块顺序不会改变预期结果。

自己试试

3×3 示例中,(0,2) 分块的输出掩码和本地结果是什么?将 K 拆成 2+1 时,C(0,2) 的部分和是多少?

阅读解释

本地结果为 [[5,0],[14,0]],掩码为 [[1,0],[1,0]]。C(0,2)=1×2+2×0+3×1 的部分和为二和三,总和五。

你的选择适用于此浏览器,可随时在页脚更改。