本任务沿循环变换学习路线完成三份交付:带位置见证的依赖图、交换后的真实循环、含尾块的真实分块循环。参考程序见可下载核验器,只使用Python标准库,输出JSON,不写入相邻文件。
模型使用有限矩形循环、数学整数和普通数组槽位。数组下标是循环坐标的仿射式,右侧先读完再写一次;程序没有I/O、异常、调用、并发和数据依赖控制。需要保持的是全部最终存储内容。证书针对具体尺寸、视图、源体及目标IR,改变其中任一项就重新验证。
任务一:为同一个程序建立完整约束
令A、B、C属于三个不同存储对象,分别按行优先布局:
源循环按i、j、k嵌套,范围分别为
用循环数组依赖分析列出30个实例的读写槽。对每个固定(i,j),k=0和k=1之间有RAW、WAR、WAW三条带类型边,15个槽合计45条。共享的A、B只是读取,不在不同C槽之间制造写冲突。
交付: 给出 (源实例,目标实例,类型,对象与槽) 的边表。单独展示
任务二:交付交换后的程序与rank证据
用循环交换把内两层改成i、k、j,保持表达式与坐标名含义不变。实际目标为
for i in range(0,3):
for k in range(0,2):
for j in range(0,5):
C[i,j] := C[i,j] + A[i,k]*B[k,j]
参考程序使用i0、i1、i2代表i、j、k,interchange(p,(0,2,1))返回这份For结构,format_ir打印它。validate从实际IR枚举实例,不信一个另写的调度说明;每批emit在生成记录前受源实例总数T限制,过量立即拒绝,再核覆盖与边方向。
源的前十个实例映到目标位置的rank为
每对k=0、1仍前向。运行目标,完整结果必须是
交付: 真实IR、30项rank、45边全前向判断及全部C。解释C[1,3]的12+36=48;再把初始C设成1到15,结果应逐槽加上该初值。这一迁移检查的是“累加”接口,不能在交换时插入清零。
任务三:交付真正带尾块的六层程序
用循环分块取块宽(2,3,2),输出ti、tj、tk、i、j、k六层循环。三个块内上界分别是min(ti+2,3)、min(tj+3,5)、min(tk+2,2),不能漏掉裁边。
四个非空块依次有12、8、6、4次更新,共30次、15个不同C槽。分块后的rank前20项是
其余十项为20到29。检查全部实例恰一次、45边全前向,并实际运行得到任务二的同一完整矩阵。商余分解证明每点属于唯一块;距离逐分量非负再证明任意正块宽都保持本例依赖。这是两项不同的责任。
交付: 六层IR、四块更新数、30项rank与最终全部存储。设某维长度为0,验证没有赋值且初始存储不变;设块宽超过该维长度,验证只有一个裁边块。参考程序拒绝0或布尔值块宽。空域仍可能执行外层控制,不能把T=0当成解释器零成本。
任务四:用负距离区分两种失败
重新取3×5零数组A,仅执行
for i in range(1,3):
for j in range(1,4):
A[i,j] := A[i-1,j+1] + 1
按原坐标
| 版本 | 六格终值 | 首条拒绝见证 |
|---|---|---|
| 源i、j | 1,1,1,2,2,1 | 接受 |
| 交换j、i | 1,1,1,1,1,1 | (1,2)→(2,1),目标2→1 |
| 相对起点的2×2分块 | 1,1,1,2,1,1 | (1,3)→(2,2),目标4→3 |
两条见证都是RAW、距离(1,-1)。交换和分块倒置的首条边不同,所以不能只抄同一条“负距离”答案。下载输出坐标减去了源起点(1,1),分别显示(0,1)→(1,0)与(0,2)→(1,1)。存储见证分别为对象a的槽7、槽8。
结构迁移: 把行块宽改为1,说明为什么不再越过未完成的整行;再取整个列宽为一个块,解释为何恢复原次序。最后改成只从上一行同列读取,距离变为(1,0),用逐分量非负定理说明任意正块宽都合法。需要给出调度解释或证明,不以几个初值恰好相等代替。
任务五:改视图,必须重建约束
回到矩阵累加,但让A共享C对象的前6槽:A视图为 (c,0,(3,2),(2,1)),C视图仍为 (c,0,(3,5),(5,1))。初始C为1到15,B仍为1到10。表达式没有改,位置关系已经改变。
构图现在有101条带类型边。i、k、j将新RAW边
交付: 两条逆边、新图边数和真实不同终值。解释同一个变量名A为何不代表独立存储,以及为何只对零初值测试可能掩盖不合法重排。旧rank数组即使长度仍为30,也不能代替对新视图重新构图。
复算与验收
保存参考程序后运行:
python foundation-loop-transform-check.py
python -O foundation-loop-transform-check.py
两种模式应输出相同JSON。输出含三份主IR、各自的完整rank、完整C、四块计数、负距离反例和别名反例;主自查还遍历80种小尺寸、每种6种交换和27种块宽,共2640项变换。拒绝分支使用显式检查,不依赖可被-O关闭的assert。
这些有限运行帮助发现实现偏差,接受可靠性的依据仍是位置模型、全实例覆盖与相邻交换证明。它不认证未建模的浮点重结合、异常、数据依赖地址或缓存性能。核验费用计源展开、全对构图、IR语法、实际控制分派和界求值;运行费用还计复制全部内存与输出轨迹。最终交付应把三个“通过”分清:点没丢、边没倒、程序真的按所交IR运行。