diff --git a/README.md b/README.md index 361ad1a..5c2ee31 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ 主要就是约束方程了: $$ -min\{ \sum_{i \le i \lt j \le n} X_i^T C_{ij} X_j + \sum_{i=1}^n s_i X_i \} +min\{ \sum_{i \le i \lt j \le n} X_i^T C_{ij} X_j + \sum_{i=1}^n X_i^T \vec{cost(t_i)} \} $$ - $X_i = (x_{i, sp}, x_{i, r_1}, x_{i, r_2}, ..., x_{i, r_K})^T$ @@ -18,8 +18,29 @@ $$ - i === j? (不一定,比方说在传参的时候,i 可以放到 a0, 但是 j 是不能放到 a0 的) - 但是我有一种想法: 就是我认为还是要把 32 个寄存器全部摆上台面的,如果不能用,我认为可以相应的可以设置为 $\infin$ ,这显然可能会变成一个 稀疏矩阵,然后是不是可以进行 凸优化啥的。如果 i!=j 并且有: $R_i$ ^ $R_j \ne \phi$ 那这可能需要对齐,可能有点麻烦 - 如果 i === j,那么可以做一件事情:将 $c_{ij}$ 的对角线设置为 负数。对角线意味着: virtual reg $t_i$ 和 $t_j$ 是可接合的,可以分配到 同一个 physical reg 的,负数的 语义 是:鼓励接合(代价总是越小越好) -- $s_i = (\vec{cost(i)}, \vec0, ..., \vec0)$ - - $\vec{cost(t_i)}$ : $t_i$(virtual reg) 溢出的代价。如果每个 $t_i$ 都选择了 spill ,那么相当于是: $\forall t_i, X_i = (1, 0, ..., 0)$,那么 $\sum_{i=1}^n s_i X_i = \sum_{i=1}^n cost(t_i)$ +- $\vec{cost(t_i)}$ : $t_i$(virtual reg) 溢出的代价。如果每个 $t_i$ 都选择了 spill ,那么相当于是: $\forall t_i, X_i = (1, 0, ..., 0)$,那么 $\sum_{i=1}^n s_i X_i = \sum_{i=1}^n cost(t_i)$ + +## 启发式 规约求解 + +### reduce 1 + +如果只有 $K^2$ 的完全图,有两个节点 X 和 Y , +那么上面的约束方程可以写成: + +$$ +min\{ X^T C Y + X^T \vec{cost(x)} + Y^T \vec{cost(y)} \} +$$ + +最终经过一通数学计算可以得到: +(如何求解? 一个关键步骤是: 令 某一串式子 = 0 ) + +$$ +Y^T ( \vec{cost(y)} + ( ... min\{ X + C_{,k} \}_{ 1 \le k \le i } ... )_{i} ) +$$ + +### reduce 2 + +### reduce N ## 伪代码