当编译器或汇编优化器正在处理软件流水线并且失败时,可能会出现以下消息:
- 地址增量过大。必须调整地址寄存器的偏移量,因为该偏移量超出了 C6000 的偏移寻址模式的范围。必须最小化地址寄存器偏移量。
- 不能分配机器寄存器。找到了软件流水线调度,但其不能为该调度分配机器寄存器。简化循环可能会有所帮助。
显示在给定的 ii 中找到的调度的寄存器使用情况。在编写线性汇编时可以使用此信息,以平衡寄存器文件两侧的寄存器压力。例如:
ii = 11 Cannot allocate machine registers
Regs Live Always : 3/0 (A/B-side)
Max Regs Live : 20/14
Max Condo Regs Live : 2/1
- 寄存器始终活跃中在整个循环体的持续时间内必须分配给寄存器的值的数量。这意味着,这些值必须始终被分配给寄存器,用于为循环找到的任何给定调度。
- 最大寄存器活跃中循环中任何给定周期内必须分配给寄存器的最大值的数量。这表示所找到的调度所需的最大寄存器数。
- 最大条件寄存器活跃中。循环内核中任何给定周期内必须分配给条件寄存器的最大寄存器数量。
- 周期数太高。从未收益有了编译器为循环找到的调度,使用非软件流水线版本会更有效。
- 没有找到调试编译器无法在给定的 ii(迭代间隔)中找到软件流水线的调度。应简化循环和/或消除循环携带依赖项。
- 并行迭代> 最小或最大循环计数.找到了软件流水线调度,但该调度的并行迭代次数多于最小或最大循环行程计数。必须启用冗余循环或传递行程信息。
- 超出推测阀值有必要大胆地加载超出当前由 --speculate_loads 选项指定的阈值。必须按照位于汇编文件中的软件流水线反馈中的建议增大 --speculate_loads 阈值。
- 寄存器活跃太久寄存器必须具有能存在(活跃)超过 ii 个周期的值。可以插入 MV 指令来分割太长的寄存器寿命。
如果正在使用汇编优化器,则在此失败消息之后会列出用于定义和使用活跃太久的寄存器的指令所在的 .sa 文件行号。例如:
ii = 9 Register is live too long
|10| -> |17|
这表示定义寄存器值的指令位于 .sa 文件中的第 10 行,使用寄存器值的指令位于第 17 行。
- 太多的谓词活跃在一侧上C6000 具有可用于条件指令的谓词或条件寄存器。有六个谓词寄存器。A 侧有三个,B 侧有三个。有时,特定的分区和调度组合需要的寄存器不止这些。
- N次迭代并行下找到的调试(这不是失败消息。)在并行执行 N 个迭代的情况下,找到软件流水线调度。
- 循环中使用的行程变量-不能调整循环计数循环行程计数器在循环中除了作为循环行程计数器之外还有其他用途。
- 对不规则循环的不安全调试“不规则”循环是具有已知迭代次数的非倒计数循环,例如 while 循环。不规则循环可能要求转换指令执行的次数多于循环所要求的次数。此错误表示编译器无法找到一个具有可以安全地过度执行、使用谓词进行保护或在循环后撤消其影响的指令的调度。尝试将循环重写为倒计数循环。还可以尝试增加 --speculate_loads (-mh) 选项。