标签: 可重构计算与软硬件协同

  • 固定功能、可编程与可重构:三种计算方式如何区分

    作者:lihao技术文章发布:可重构计算与软硬件协同 · 第 02 期

    以8位函数为共同任务,比较改变参数、改变指令与改变数据通路;从语义、合法性和总成本评价方案,避免把芯片标签当成性能结论。

    先问“什么可以改变”,再看芯片名字

    固定功能电路也可能允许修改系数;可编程处理器也有固定硬件;可重构器件里又可能嵌入CPU和固定DSP。若直接把ASIC、CPU、FPGA各贴上一个绝对标签,会漏掉混合系统。

    更有用的区分是:任务改变时,用户可以在哪一层做选择?固定功能主要在预先设计的操作范围内换参数;指令可编程在已有执行结构上换程序;可重构在既有资源范围内改变逻辑、操作与连接。三者描述的是可变能力,不是性能名次。

    固定一个小到能穷举的共同任务

    约定输入x为0到255的整数,输出为f(x)=(3x+1) mod 256。模256意味着只保留对应8位无符号结果;例如x=255时,766除以256余254。若任务改为饱和算术,结果就不同,必须另立契约。

    固定功能方案可以把这个函数直接做成专用逻辑,可能允许或不允许改系数;可编程方案用读取、乘法或移位加法、加一与输出等指令实现;可重构方案把对应操作或等价逻辑映射到资源,并配置连接。

    三条路径若都输出相同256项表,说明在这组有限输入下功能等价。它不能说明延迟相同,也不能说明系统对输入节拍、握手与错误的处理相同。功能关系只是契约的一部分。

    任务变化时,分别要改什么

    若新函数变为g(x)=(5x+2) mod 256,专用电路若没有设计系数接口,可能需要改硬件;若本来允许a、b参数,则可能只改参数。不能因为名字叫固定功能,就忽略其实际配置范围。

    可编程处理器通常可以换指令或常数;可重构实现可能调整逻辑、连接、流水与资源复用。若在FPGA里放一个软核CPU,运行时只是换它的程序,那么这次任务变化发生在指令层,并不等于每次都重构了整个数据通路。

    Intel对CPU、GPU与FPGA的架构介绍有助于识别指令执行与空间数据流的典型差异。[1] 但其中厂商的优势描述不能脱离负载、器件和实现条件变成普遍结论。

    比较方案时,别跳过总成本

    维度 需要核对的问题
    功能与数值 位宽、舍入、溢出与边界输入是否一致
    资源与合法性 操作、容量、连接与时序能否实现
    启动与变化 编译、配置、装载和缓存失效花多少
    运行 端到端延迟、吞吐、搬运与同步
    生命周期 设计、验证、升级、维护与生产规模

    固定功能可能为稳定任务优化,也可能因新需求而不适用;可编程路径覆盖广,但具体效率取决于指令与存储体系;可重构路径提供结构选择,也增加映射搜索、配置与验证工作。必须用真实候选比较,不能只比较三类抽象名称。

    若只执行几次小任务,准备开销可能主导;若有长时间稳定数据流,流水与数据驻留可能更重要。即使局部算术更快,主机搬运和排队也可能吃掉收益。没有端到端测量,就不应给出加速倍数。

    把功能检查与性能检查分开

    本例可枚举全部256个x,比较3x+1与x+(x<<1)+1在模256下是否一致。这是在数学整数模型下检查两种表达,尚未验证某种语言中的移位边界或真实电路。

    进一步落到硬件,需要明确目标、工具版本、综合约束与接口,再取得映射合法性和设备结果。模拟器通过、综合通过、时序通过和板上执行通过,各自支持不同结论;不能互相替代。[2]

    本篇没有执行FPGA综合、布局布线或板卡实验。穷举表覆盖的是规定的8位函数,既没有测功耗,也没有证明哪种硬件在真实产品中更优。

    把功能等价写成可检查的有限命题

    对本篇函数,参考定义是f(x)=(3x+1) mod256,候选形式为h(x)=(x+(x<<1)+1) mod256。对整数x,x<<1在这个数学记号下表示2x,因此两式代数上相同;枚举0至255又能独立检查实现这两式的教学脚本是否一致。

    这里特意把数学模型和语言执行分开。如果在某种语言中使用有符号类型,移位、溢出或整数提升的规则可能改变实际行为;如果硬件在每一步饱和而不是最终取模,等价关系也不成立。证明必须指明运算语义,而不是仅比较操作符的外形。

    再把功能提升到流接口,需要规定输入有效时刻、输出对应关系和复位。两套电路在每个x的算术结果相同,却可能因为一套丢掉背压下的输入而在系统上不等价。接口协议不是额外装饰,而是可观察行为的一部分。

    所以“256个值都对”能证明的,是该有限输入域、该纯函数定义下的结果一致。时序、状态与协议需要另一个明确定义的验证空间。

    同一负载下,准备成本怎样改变选择

    构造两个候选,全部时间单位相同且假定串行。通用方案准备2、每次计算10;可重构方案准备102、每次计算6。执行N次的总成本分别为2+10N和102+6N,后者在N>25时才更低。

    如果每次更换输入形状都要重新准备,N应该按同一配置可复用的次数计算,不能拿全年请求总量摊销一次配置。若准备阶段可与其他工作重叠,也应在真实依赖图上计算关键路径,而不是把所有时间盲目相加。

    再设可重构方案每次额外搬运5,成本变成102+11N,在这个假设下无论N多大,都不会优于通用方案。局部算术从10降到6,仍不足以支持端到端收益。这是一个明确反例,说明比较必须包括边界成本。

    这些数是用于检验推理的构造条件,没有预测某种器件的实际表现。真实选择还应覆盖冷启动、稳态、尾部时延、失败率和维护投入。某项平均收益若依赖极高复用而应用请求恰好不满足,结论就应撤回。

    混合系统的边界,可能比单元内部更重要

    当CPU调度、固定引擎和可重构区域共同处理任务时,数据由谁拥有、何时可复用、缓存何时可见、错误由谁观察,都需要约定。加速器返回一个句柄,不等于结果已经可以被下游读取。

    设CPU提交配置与输入后立即重用输入缓冲,而设备尚未完成读取,算术单元即使完全正确也可能得到错误数据。反过来,CPU等待过于保守,又可能消除原本可重叠的执行。正确同步与高效同步需要一起设计,但验证责任不能被性能目标替代。

    这一层也决定软件复用程度。共同的函数语义可能可复用,布局、路由、事件与装载产物却未必相同。一个通用接口若把全部特殊情形都藏在实现中,用户就难以理解失败与成本;若暴露每个细节,又会增加使用负担。

    评估时可以把契约拆成语义、资源和部署三类,再逐项列出支持与不支持。这样,“可编程”与“可重构”才成为具体能力描述,而不是对兼容性或性能的空泛保证。

    成本相同之外,还要比较能否持续演进

    一个实现对当前f(x)很高效,若下个月需要修改数值格式、增加状态或接入新接口,成本可能完全不同。固定功能的设计与制造成本、可编程软件的升级成本、可重构映射的验证成本,应按预期变化与产量分别计算,而不是只看一次运行。

    构造一个决策:工作负载长期稳定且产量很高,专门化投入可能被摊销;变化频繁且数量有限时,可编程或可重构方案可能减少重新设计成本。但如果可重构工具每次都需大量人工收敛时序,所谓更新灵活性也可能被软件工作抵消。

    因此可以要求第二个独立任务作为复用检验:沿用同一功能检查框架、错误分类与部署流程时,究竟保留了多少,哪些部分仍需重写。复用声明应同时列出不能复用之处,不能只统计共用代码行。

    这种生命周期比较不会给出跨任务永远正确的赢家。它把“灵活”转成可问责的变化成本,把“专用高效”转成限定负载下的收益,也使硬件选择与工程交付建立真实联系。

    选择可变层次,而不是选择一句口号

    最强反例是一个混合SoC:CPU负责控制,固定引擎处理成熟任务,可重构区域处理变化的数据通路。它没有服从三选一,却可能更符合需求;代价是跨单元接口、内存一致性与调试更复杂。

    实际选择应从变化频率、输入分布、可承担的准备时间与维护成本出发,再验证候选。判断“可重构改变了什么”,最终要落到资源和契约,而不是“硬件更灵活所以一定更快”。

    来源、证据与阅读路线

    1. Intel:Compare Benefits of CPUs, GPUs, and FPGAs for oneAPI Workloads,架构差异;不采用无条件性能外推
    2. Intel oneAPI Programming Guide 2023.2,FPGA Flow,不同产物与验证阶段

    证据范围:有限位宽算术等价与成本算例已核对;三种实现的真实吞吐、能耗与开发成本仍须在相同任务和目标系统中验证。

    版本1.2 · 2026-10-18:完成事实、条件与引用复核,逐篇明确证据方法;有实质缺口处补齐推导、反例或原题。原网址与首次发布日期保留。

  • 可重构计算到底是什么?“可重构”究竟改变了什么

    作者:lihao技术文章发布:可重构计算与软硬件协同 · 第 01 期

    从两输入查找表的完整真值表出发,解释配置怎样改变逻辑与连接;明确功能模型、映射结果与真实性能证据的不同层级。

    换一个程序,与换一条数据通路

    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的函数值;它仍然不证明任何硬件配置文件正确,也没有资源利用率或芯片性能结果。证据等级要跟着实际完成的层级走。

    最强反例是:许多任务变化快、规模小,重构成本可能超过计算节省。这个反例不否定可重构性本身,而是限制其适用域。下一篇将同一任务放到固定功能、可编程与可重构三个层次下比较。

    来源、证据与阅读路线

    1. AMD 7 Series FPGAs CLB User Guide,UG474 v1.9,2025-04-01,Interconnect Resources
    2. Intel oneAPI Programming Guide 2023.2,FPGA Flow;本文只引用该固定历史版本的流程定义
    3. AMD Vitis High-Level Synthesis User Guide,UG1399 v2021.2,Performance Metrics Example:延迟与启动间隔的周期定义;本文频率数字为构造算例

    证据范围:LUT真值、启动间隔与配置摊销按明确模型核对;频率为假设,没有完成器件映射、时序收敛或芯片性能测量。

    版本1.2 · 2026-10-18:完成事实、条件与引用复核,逐篇明确证据方法;有实质缺口处补齐推导、反例或原题。原网址与首次发布日期保留。