从两输入查找表的完整真值表出发,解释配置怎样改变逻辑与连接;明确功能模型、映射结果与真实性能证据的不同层级。
换一个程序,与换一条数据通路
CPU可以换程序,FPGA也可以改变计算功能,它们的区别不能简单说成“一个可变,一个不可变”。关键在于可改变的层次:是在相对固定的指令执行结构上换指令序列,还是配置逻辑资源、操作选择与连接方式,使数据经过不同的计算结构。
可重构计算利用可配置资源组织计算。FPGA是重要实例,粗粒度可重构阵列(CGRA)则常以字级功能单元与互连为配置对象。两者粒度、存储与调度方式不同,不能互相代称。
这里的改变不意味着芯片制造后的晶体管任意移动;配置是在已有物理资源与可用连接之内选择。AMD 7系列UG474文档展示可编程互连如何连接逻辑块、DSP与块RAM等资源。[1]
用一个两输入查找表看见配置
构造一个两输入查找表,输入a、b各为0或1,地址约定为2a+b。表中只有4个位,分别给出输入00、01、10、11时的输出。
| 输入ab | AND配置 | XOR配置 |
|---|---|---|
| 00 | 0 | 0 |
| 01 | 0 | 1 |
| 10 | 0 | 1 |
| 11 | 1 | 0 |
按上述地址顺序,写入[0,0,0,1]实现AND,写入[0,1,1,0]实现XOR。输入仍是a、b,改变的是表所定义的逻辑函数。这个模型只有组合逻辑,没有时钟、寄存器、布线延迟或配置接口。
它解释了查找表的基本思想,不对应某块真实器件的配置位排列。实际FPGA的LUT规模、分割方式、存储模式和连接规则,应按目标系列文档核对,不能把这4个位直接当成可下载bitstream。
不只改变操作,还要安排数据怎么走
设想先执行y=a×b+c,再执行z=y-d。空间映射可以把乘法、加法和减法放到不同单元,并安排中间结果的通路;也可能复用少量单元在多个周期内完成。选择由资源、依赖与输入输出带宽共同约束。
可配置的操作不等于任意连接。两个节点分别能放进阵列,不保证它们之间有满足要求的路由;单个节点的延迟满足,也不保证整条路径时序收敛。存储端口、缓冲容量与同步同样可能限制合法性。
Intel的FPGA编程指南把FPGA编译与CPU/GPU指令路径作了区分,说明器件映像与模拟器映像等产物不同。[2] 这些产物的区别也意味着,模拟执行成功不能代替实际实现与设备执行。
配置发生在什么时候,会付出什么成本
有些任务在开始运行前整体配置;有些架构允许运行中切换上下文或局部配置。动态部分重构并不意味着相关数据路径无条件不停顿,必须处理接口隔离、状态、配置完成与恢复。
假设配置一次花100个时间单位,通用路径每次10,可重构路径每次6,忽略其余成本且配置只做一次,则100+6N<10N要求N>25。第25次只是持平;若每次都重新配置,就可能一直更差。
这只是串行成本的假设算例,不是器件测量。真实系统还要计编译、装载、搬运、同步、缓存与资源竞争;有重叠时不能把各阶段简单相加。收益必须与同一任务、同一精度及可用基线比较。
资源都够,为什么映射仍然可能不合法
构造一个极小阵列,只有P0和P1两个计算单元,每周期各执行一个操作,二者有一条单向连接P0→P1。任务是先算m=a×b,再算y=m+c。假设P0能乘、P1能加,且乘法结果下一周期可用,那么m放P0、y放P1是一个候选安排。
若把两者交换,算术资源数量仍够,但P1不能乘,首先违反操作能力;即使改成两者都会乘加,若中间结果需要P1→P0而阵列没有反向路径,也仍不合法。资源总数只是必要条件之一,不能替代操作支持、连接方向和时间约束。
若增加第三个操作z=m+d,P1可能要在不同周期复用。此时还要问m是否被保留、扇出或重读是否允许、两个消费者是否争用输入端口。计算图上两条边存在,不意味着物理结构能在同一周期同时传输它们。
这个两单元模型完全是本文构造,不代表某款CGRA。它揭示的检查次序可以复用:覆盖全部操作→满足数据依赖→满足资源与端口占用→找到合法路由→确认状态生命周期。每一项都应能给出失败原因。
延迟、启动间隔与吞吐,为何要分别报告
设一条理想流水线有乘法和加法两级,每级延迟1周期,级间寄存,输入输出都不阻塞。第一项结果在2周期后出现;填满后可以每周期产生一项,即启动间隔II=1。处理N项的理想周期数为2+(N-1),不是2N。
另一种实现只用一个能乘或加的单元,按顺序为每项做两步。忽略额外开销时,单项延迟也可能是2周期,但每项占用2个操作槽,吞吐上限不同。相同单项延迟,不等于相同稳态吞吐。
实际系统还要考虑时钟频率、访存、背压与依赖。若前一项输出参与后一项计算,递归依赖可能限制II;若输入每两周期才到一项,计算流水再深也不能凭空得到每周期一项的端到端吞吐。
在每次启动处理一项、不受输入输出和其他瓶颈限制的稳态模型里,吞吐上限可写为 f_clk/II。[3] 构造方案 A 的时钟为 100MHz、II=1,上限是每秒 1 亿项;方案 B 为 300MHz、II=2,上限反而是每秒 1.5 亿项。可见 II 更小并不自动代表每秒结果更多。这里的频率是假设,不能在布局布线之前当成已经达到的器件频率;真实端到端吞吐仍要受访存、背压、批量和计时边界约束。
综合报告给出的延迟与II,需要与约束和仿真条件一起读;设备测量又需要明确计时边界。本文只有理想离散时序推导,没有获得任何器件的频率、面积或能效。
配置灵活性为何会转化为软件问题
更多操作选择、路由和存储布局,增加了可能的实现方案,也扩大搜索空间。编译器不仅要找一个合法方案,还要在有限编译时间内找到足够好的方案,并对失败给出可解释诊断。
合法性检查与性能估计可以分离。检查器能拒绝容量超限或不存在的路由,却未必知道两个合法方案谁更快;成本模型可以排序候选,也不能替代正确性验证。把一个预测分数高的候选当作“验证通过”,混淆了两种责任。
若某种自由度只在极少数负载改善结果,却显著增加搜索与回归成本,它未必提升系统总价值。反例也应保留:关键工作流可能确实需要这项自由度,此时不能只为简化软件就删掉能力。决定需要工作负载证据与维护成本,而非抽象地追求最多可配置项。
可重构计算的核心问题由此从“能不能变”推进为“哪些变化值得支持,工具能否稳定利用,验证能否覆盖”。这是评估硬件与编译协同的起点。
从资源下界看II:先问理论上能否达到
继续用离散时序模型。若每个输入需要2次乘法,阵列只有1个每周期可接收一次新乘法的单元,忽略依赖与通信,资源就要求平均至少每2周期接收一个输入,即II≥2。增加加法单元不能解除这个乘法资源下界。
若增加第二个乘法单元,资源下界可能降到1,但路由、存储端口或循环依赖仍可能保持更大II。下界是必要条件,不是可实现调度;找到满足它的候选,还需逐周期检查占用与依赖。
另一方面,一个乘法单元若本身是多级流水、每周期可接收新输入,其“延迟3周期”不等于每3周期只能启动一次。把延迟与发射能力混用,会错误估算资源下界。架构模型必须同时记录操作延迟、启动能力、端口与数据可用时刻。
这类简单下界有筛选价值:若候选声称低于已明确的资源或依赖限制,应先检查模型或报告口径;若仅达到下界,也不能跳到真实性能结论,因为频率与外部系统尚未纳入。
验证应分成哪些层级
第一层是功能模型:输入与输出符合定义。第二层是映射合法性:资源、容量、连接与依赖满足目标约束。第三层是实现:综合、布局布线与时序结果。第四层才是设备执行的正确性、延迟、吞吐与能耗等测量。
本文的两输入表可以穷举全部4种输入,检查AND和XOR的函数值;它仍然不证明任何硬件配置文件正确,也没有资源利用率或芯片性能结果。证据等级要跟着实际完成的层级走。
最强反例是:许多任务变化快、规模小,重构成本可能超过计算节省。这个反例不否定可重构性本身,而是限制其适用域。下一篇将同一任务放到固定功能、可编程与可重构三个层次下比较。
来源、证据与阅读路线
- AMD 7 Series FPGAs CLB User Guide,UG474 v1.9,2025-04-01,Interconnect Resources
- Intel oneAPI Programming Guide 2023.2,FPGA Flow;本文只引用该固定历史版本的流程定义
- AMD Vitis High-Level Synthesis User Guide,UG1399 v2021.2,Performance Metrics Example:延迟与启动间隔的周期定义;本文频率数字为构造算例
证据范围:LUT真值、启动间隔与配置摊销按明确模型核对;频率为假设,没有完成器件映射、时序收敛或芯片性能测量。
写下你的评论
要发表评论,您必须先登录。