关于算力
关于算力
算力,即单位时间内完成有效运算的次数,浮点运算中以 FLOPS 为单位,整数或定点运算中以 OPS 和 MACs 为单位。
1GFLOPS = 10\^9FLOPS,1TFLOPS = 10\^12FLOPS。G 表示 giga,T 表示 trillion。10\^6 为百万,10\^9 为十亿,10\^12 为万亿。
一个 MAC 一般算两次运算。
FPGA 上的理论算力估计为:DSP数量*每周期DSP操作数*频率,若 DSP 能在每个周期接收一组新的输入,即做到 1 个 MAC/cycle,则每周期 DSP 操作数为 2。
lantency,延迟,指一个输入到输出一共需要多少周期。II即initiation interval,启动间隔,指多少周期启动一组新的计算。throughtput,吞吐率,指每隔多少周期能处理一个新输入。
更低位宽可以打包,比如一个DSP中算多个小乘法。
roofline模型:性能=min(峰值算力,实际带宽*算术强度),算术强度AI=运算量/访存量,单位为OPS/byte,机器平衡点=峰值算力/峰值带宽,当AI>平衡点才是算力瓶颈,否则就是存储或搬运瓶颈。
关于运算次数的统计,需要规定哪些操作算一次运算,然后统计出来。公认来说,加减法和乘法是算一次运算的。一般会按MAC或FMA统计,MAC和FMA本质上是一个东西,前者强度累加器的语义,后者强调指令融合的语义。统计方式有两种,一是按硬件指令数来,另一种是按数学运算次数来。算法论文中一般以数学运算次数统计,系统/架构/编译器论文中一般以硬件指令数统计,工业性能调优则两者都会用。指令数依赖指令集、编译器、向量化方式等等。
FPGA做固定流水线,没有可编程和指令的概念,用每周期的有效操作数MAC/s、DSP利用率或吞吐率来定量统计。
一般不会浪费DSP做普通加法,因为LUT也能做。
比较、访存、索引、地址计算等这些传统计算的算法开销,是否算作OPS,取决于指标报什么,如果报FLOPS就不算,如果报OPS就可以算,但是要说明清楚包含的范围。
MAC之外的逻辑资源,比如LUT、FF等,没法儿按DSP那样直接折算成算力,更合理的计量方式是,针对某一种算法操作,估算这些资源共同能支撑的最大吞吐。
如果算法固定,数据流固定,目标是极限吞吐率和低延迟,那么固定流水线比可编程设计更直接更高效,固定流水线就是为一个任务定制的最高效率的实现方式。指令和可编程设计要解决的问题是,同一套硬件,如何在不需要重新造电路,不重新布线的情况下,执行不同任务。指令和可编程设计本质上就是让一套硬件能被软件重新定义行为而出现的解决方案。只有跑软核CPU或者做可编程加速器,才有指令的概念。软核处理器用于需要复杂控制但性能要求不高的情况,全用RTL很麻烦,用软核写C更简单。
为编译目标服务的意思是,写代码,由编译器翻译成目标平台能执行的指令。
固定流水线,关注的是,PL kernel的吞吐率、延迟、II、时钟频率、资源利用率、实际有效算力、实际访存带宽、帧率、能效。


