“取循环数组依赖分析中的有限矩形域 $D=\prod {r=0}^{d 1}[0,n r)\cap\mathbb Z^d$。循环体是固定编号的整数数组赋值,所有地址只由坐标决定,位置已经检查合…”
形式陈述
一行代码的多次执行是不同节点
固定深度
某个长度为零时
每条赋值读取由整数常量、加法、乘法和数组读取组成的表达式,先算完右侧,再向一个数组位置写入结果。数组下标是坐标的整数仿射式,例如
名字相同与位置相同
数组可以有共享存储的视图。参考程序用视图四元组
描述对象身份
每个被访问的下标先满足
对实例
三类有向边
对源次序中
RAW保留后者可能需要的新值;WAR保留前者应读到的旧值;WAW保留最终由谁写入。读与读不产生冲突。同一对实例可以有多类边,参考程序分别输出。本页保存全部冲突对,包括可由其他边传递得到的边,不要求中间没有覆盖写入;这是一份便于核验的保守顺序约束,不是最小的最后写入图。
保持定理。 若目标恰执行同一批实例各一次,实例的赋值内容不变,并保持每条上述边的先后,则对该尺寸及视图下的每个合法整数初始内存,目标与源的最终全部存储内容相同。构边对声明的读写冲突是精确的;保持边是语义等价的充分条件,而非必要条件。
直觉
不止“谁把值传给谁”
看两条语句:B[0]:=A[0],随后 A[0]:=0。第二条没有使用第一条产生的值,只有定义到使用的图可能漏掉它们的联系。但若交换执行,B读到的就变成0。这里需要的是WAR边:先让读者取走旧值,再允许覆盖。
另一个例子是 A[0]:=1,随后 A[0]:=2。两条都不读取A,却由最后一次写决定结果,因此需要WAW边。这些边约束的是对同一存储槽的作用次序,不是表达式的语法相似性。
矩阵累加中的三个标签
计算 C[i,j]:=C[i,j]+A[i,k]*B[k,j]。固定
当A、B、C分别属于不同对象时,不同 C[i,j] 并不意味着所有实例都访问同一槽;必须代入迭代坐标。
例子与边界
实际构出45条边
取
例如实例
别名会改变整个判断
仍取相同形状,改让A视图指向C对象的前6个槽,A的形状为3×2、步长为(2,1),C仍为3×5、步长为(5,1)。A[0,0]与C[0,0]现在是同一位置。初始C取1到15,B取1到10。
源中的
冲突不等于不可证明交换
若两条赋值都写 A[0]:=0,交换后最终内容仍相同,但本分析仍给WAW边。它只使用读写位置,没有使用两个表达式同值这个更强事实。类似地,数学整数上的某些归约可借助结合律、交换律得到更宽松变换;那需要另一份证明,不能直接删掉本图中的边。
如果下标写成 A[B[i]],本页的静态位置模型不再适用。仅记录一次测试运行的地址,会把“此次没有冲突”错误推广到其他初始B。允许这种语法需要可靠别名分析、运行时检查或更强的语义验证;本参考程序拒绝不属于仿射坐标索引的表达式。
推论与应用
为什么保持边能保持所有内存值
先看没有冲突的两个实例。它们写不同槽,任一写位置都不属于另一实例的读集合,所以先执行谁都不改变另一方的读取值;两次写入也互不覆盖。地址已经固定且合法,两者始终可执行。这正好满足动作独立与交换的使能和结果条件。
再把源序列逐步改成目标序列。从目标第一个尚未对齐的实例x开始,在当前序列中找到x,把它向左越过前面的实例,直到目标位置。每个被越过的y,在源相对次序中先于x,而目标把x排在y前;若它们有冲突,就存在y→x边,违反目标已通过的条件。因此每一次相邻交换都是上段的无冲突交换,保持整个内存。
有限序列至多作有限次交换,最终恰得到目标。逐次保持终态即证明定理。证明不枚举内存值,因而覆盖任意大小的整数;它依赖的是每次交换都读取同样的值。若引入可见读写事件、异常或资源耗尽,观察契约改变,必须重新论证。
算法不变量与真实成本
analyze先按源次序列出身份,计算每个写位置与读取集合,再按编号对
设A为输入语法及视图表长度,F为全部实例展开、坐标和仿射地址求值的工作总量,e为带类型边数。以存储身份及槽地址为常数字、散列表查询为期望常数,实际构图时间为
每对只做两次读集合成员查询和一次位置比较,至多输出三条边。F包含维数与每条仿射式的系数遍历,不能把长下标式视为常数。脚本用计数器式坐标枚举,空域不会先把其他巨大range复制成数组。空间计输入、坐标身份、读集合及边;保守写为
共同终点任务继续把边交给交换和分块。迁移练习:先令A视图与C分离,再改成上述共享前6槽;不执行数值运算,仅根据位置计算,指出首次被i、k、j倒置的边及两个目标编号。答案为
参考资料
[1] Seth Copen Goldstein,CMU15-411/611,Loop Optimization–2: Locality,2025-04-01,PDF7–14页:实例、循环携带依赖及地址等式。本文的显式视图、全部冲突对枚举和成本为独立教学实现。
[2] Michael E. Wolf、Monica S. Lam,A Data Locality Optimizing Algorithm,PLDI1991,§2.1,PDF4–5页(印刷33–34页):迭代词典序、距离向量与依赖保持。本文另以逐次交换证明所用有限模型,不实现文中的完整局部性搜索。