0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在FPGA上优化实现复数浮点计算

FPGA设计论坛 来源:未知 2023-06-10 10:15 次阅读

4e509fec-0733-11ee-962d-dac502259ad0.png

点击上方蓝字关注我们

高性能浮点处理一直与高性能CPU相关联。在过去几年中,GPU也成为功能强大的浮点处理平台,超越了图形,称为GP-GPU(通用图形处理单元)。新创新是在苛刻的应用中实现基于FPGA的浮点处理。本文的重点是FPGA及其浮点性能和设计流程,以及OpenCL的使用,这是高性能浮点计算前沿的编程语言。
各种处理平台的GFLOP指标在不断提高,现在,TFLOP/s这一术语已经使用的非常广泛了。但是,在某些平台上,峰值GFLOP/s,即,TFLOP/s表示的器件性能信息有限。它只表示了每秒能够完成的理论浮点加法或者乘法总数。分析表明,FPGA单精度浮点处理能够超过1 TFLOP/s。
一种不太复杂的常用算法是FFT。使用单精度浮点实现了4096点FFT。它能够在每个时钟周期输入输出四个复数采样。每一个FFT内核运行速度超过80 GFLOP/s,大容量FPGA的资源支持实现7个这类的内核。
但是,如图1所示,这一FPGA的FFT算法GFLOP/s接近400 GFLOP/s。这是“按键式”OpenCL编译结果,不需要FPGA知识。使用逻辑锁定和DSE进行优化,7内核设计接近单内核设计的Fmax,将其GFLOP/s提升至500,超过了10 GFLOP/s每瓦。
这一每瓦GFLOP/s要比CPU或者GPU功效高很多。对比一下GPU,GPU在这些FFT长度上效率并不高,因此,没有进行基准测试。当FFT长度达到几十万个点时,GPU效率才比较高,能够为CPU提供有效的加速功能。

4e595e66-0733-11ee-962d-dac502259ad0.jpg

总之,实际的GFLOP/s一般只达到峰值或者理论GFLOP/s的一小部分。出于这一原因,更好的方法是采用算法来对比性能,这种算法能够合理的表示典型应用的特性。算法越复杂,典型实际应用的基准测试就越具有代表性。
并不是依靠供应商的峰值GFLOP/s指标来确定处理技术,而是使用比较复杂具有代表性的第三方评估。高性能计算理想的算法是Cholesky分解。
这一算法经常用于线性代数,高效的解出多个方程,可以实现矩阵求逆功能。这一算法非常复杂,要获得合理的结果总是要求浮点数值表示。计算需求与N3成正比,N是矩阵维度,因此,一般对处理要求很高。实际GFLOP/s取决于矩阵大小以及所要求的矩阵处理吞吐量。
表1显示了基于Nvidia GPU指标1.35TFLOP/s的基准测试结果,使用了各种库,以及Xilinx Virtex6 XC6VSX475T,其密度达到475K LC,这种FPGA针对DSP处理进行了优化。用于Cholesky基准测试时,这些器件在密度上与
AlteraFPGA相似。

4e83e168-0733-11ee-962d-dac502259ad0.jpg
LAPACK和MAGMA是商用库,而GPU GFLOP/s是指采用田纳西州大学开发的OpenCL实现的。对于小规模矩阵,后者更优化一些。
中等规模的Altera Stratix V FPGA (460kLE)也进行了基准测试,使用了单精度浮点Cholesky算法。如表2所示,在Stratix V FPGA上进行Cholesky算法的性能要比Xilinx结果高很多。

4eb3b88e-0733-11ee-962d-dac502259ad0.jpg


应指出,矩阵大小并不相同。田纳西州大学结果是从[512×512]矩阵大小开始的。BDTI基准测试达到了[360×360]矩阵大小。原因是,矩阵规模较小时,GPU效率非常低,因此,在这些应用中,不应该使用它们来加速CPU。在规模较小的矩阵时,FPGA的工作效率非常高。
其次,BDTI基准测试是基于每个Cholesky内核的。每个可参数赋值的Cholesky内核支持选择矩阵大小,矢量大小和通道数量。矢量大小大致决定了FPGA资源。较大的[360×360]矩阵使用了较长的矢量,支持这一FPGA中实现一个内核,达到91GFLOP/s。较小的[60×60]矩阵使用的资源更少,因此,可以实现两个内核,总共是2×39=78GFLOP/s。的[30×30]矩阵支持实现三个内核,总共是3×26=78GFLOP/s。
FPGA看起来更适合解决数据规模较小的问题。原因之一是因为计算负载随N3而增大,数据I/O随N2增大,终,随着数据的增加,GPU的I/O瓶颈不再是问题。另一项考虑是吞吐量。随着矩阵规模的增大,由于每个矩阵的处理量增大,矩阵每秒吞吐量会大幅度下降。在某些点,吞吐量变得非常低,以至于无法满足很多应用的要求。在很多情况下,会分解大规模矩阵,处理每个小的子矩阵,以解决由于庞大的处理负载造成的吞吐量限制问题。
对于FFT,计算负载增加N log2 N,而数据I/O随N增大而增大。对于规模较大的数据,GPU是高效的计算引擎。作为对比,数据长度很短时,FPGA是高效的计算引擎,更适合FFT长度达到数千的很多应用,对于GPU,FFT长度是数十万。
GPU和FPGA设计方法
使用Nvidia的专用CUDA语言或者开放标准OpenCL语言对GPU进行编程。这些语言在能力上非常相似,而的不同在于CUDA只能用在Nvidia GPU上。
FPGA通常使用HDL语言Verilog或者VHDL进行编程。这些语言的版虽然采用了浮点数定义,不用进行综合,但都不太适合支持浮点设计。例如,在System Verilog中,短实数变量与IEEE单精度(浮点)对应,实数变量与IEEE双精度对应。
使用传统的方法,将浮点数据通路综合到FPGA的效率非常低。Xilinx FPGA在Cholesky算法上的性能很低,它使用了Xilinx浮点内核生成功能,这证实了这一点。而Altera采用了两种不同的方法。种使用基于Mathworks的设计输入,称之为DSP Builder模块库。这一工具包含了对定点和浮点数的支持。它支持7种不同精度的浮点,包括IEEE半精度、单精度和双精度。它还支持矢量化,这是高效实现线性代数所需要的。而重要的是,它能够将浮点电路高效的映射到目前的定点FPGA体系结构中,如基准测试所示,规模中等的28 nm FPGA,Cholesky算法接近了100GFLOP/s。作为对比,在不具有综合能力的规模相似的Xilinx FPGA上,实现同样的算法,使用密度相似的FPGA,性能只有20GFLOP/s。
GPU编程人员比较熟悉OpenCL。面向FPGA的OpenCL编译意味着,面向AMD或者Nvidia GPU编写的OpenCL代码可以编译到FPGA中。Altera的OpenCL编译器支持GPU程序使用FPGA,不需要熟练的开发典型的FPGA设计。
使用支持FPGA的OpenCL,相对于GPU有几个关键优势。首先,GPU的I/O是有限制的。所有输入和输出数据必须由主CPU通过PCI
接口进行传输。结果延时会让GPU处理引擎暂停,因此,降低了性能。
FPGA以各种宽带I/O功能而。这些功能支持数据通过千兆以太网和SRIO,或者直接从ADCDAC输入输出FPGA。Altera定义了OpenCL标准的供应商专用扩展,以支持流操作。
即使与I/O瓶颈无关,FPGA的处理延时也要比GPU低很多。众所周知,GPU必须有数千个线程才能高效的工作。这是由于
存储器读取很长的延时,以及GPU大量的处理内核之间的延时。实际上,GPU必须有很多任务才能使得处理内核不会暂停等待数据,否则会导致任务很长的延时。
而FPGA使用了“粗粒度并行”体系结构。它建立了多个经过优化的并行数据通路,每一通路一般在每个时钟周期输出一个结果。数据通路的例化数取决于FPGA资源,但一般要比GPU内核数少很多。但是,每一数据通路例化的吞吐量要比GPU内核高得多。这一方法的主要优势是低延时。降低延时在很多应用中都是关键的性能优势。
FPGA的另一优势是很低的功耗,极大的降低了每瓦GFLOP/s。正如BDTI所测量的,Cholesky等复数浮点算法的每瓦GFLOP/s是每瓦5~6GFLOP/s。一般很难进行GPU能效测量,但是,Cholesky的GPU性能达到50GFLOP/s,典型功耗是200W,得到的结果是0.25每瓦GFLOP/s,单位FLOP/s的功率高20倍。
OpenCL和DSP Builder都依靠“融合数据通路”这种技术(图2),以这种技术实现浮点处理,能够大幅度减少桶形移位电路,从而支持使用FPGA来开发大规模高性能浮点设计。

4ecbad04-0733-11ee-962d-dac502259ad0.jpg
为降低桶形移位频率,综合过程尽可能使用较大的尾数宽度,从而不需要频率归一化和去归一化。27×27和36×36硬核乘法器支持比单精度实现所要求的23位更大的乘法计算,54×54和72×72结构的乘法器支持比52位更大的计算,这通常是双精度实现所要求的。FPGA逻辑已经针对大规模定点加法器电路进行了优化,包括了内置进位超前电路。
当需要进行归一化和去归一化时,另一种可以避免低性能和过度布线的方法是使用乘法器。对于一个24位单精度尾数(包括符号位),24×24乘法器通过乘以2n对输入移位。27×27和36×36硬核乘法器支持单精度扩展尾数,可以用于构建双精度乘法器。
在很多线性代数算法中,矢量点乘(图3)是占用大量FLOP/s的底层运算。单精度实现长度是64的长矢量点乘需要64个浮点乘法器,以及随后由63个浮点加法器构成的加法树。这类实现需要很多桶形移位电路。

4ef37bae-0733-11ee-962d-dac502259ad0.jpg


相反,可以对64个乘法器的输出进行去归一化,成为公共指数,是64位指数。可以使用定点加法器电路对这些64路输出求和,在加法树的进行终的归一化。如图3所示,这一本地模块浮点处理过程省掉了每一加法器所需要的临时归一化和去归一化。即使是IEEE754浮点,指数基本决定了终的指数,因此,这种改变只是在计算早期进行指数调整。
但是,进行信号处理时,在计算尽可能以高精度来截断结果才能获得结果。这种方法进位额外的尾数,补偿了单精度浮点处理所需要的早期去归一化次优方法,一般从27位到36位。采用浮点乘法器进行尾数扩展,因此,在每一步不需要对乘积进行归一化。
注意,这一方法每个时钟周期也会产生一个结果。GPU体系结构可以并行产生所有浮点乘法,但是不能高效的并行进行加法。之所以这样是因为不同的内核必须通过本地存储器传输数据,彼此实现通信,因此,不能灵活的连接FPGA体系结构。
这一方法产生的结果要比传统IEEE754浮点结果得多,如表3的测量结果所示。BDTI的基准测试获得了相似的结果。

4f16de3c-0733-11ee-962d-dac502259ad0.jpg


使用Cholesky分解算法,实现大规模矩阵求逆,获得了表3的结果。以三种不同的方法实现了相同的算法——在Matlab/Simulink中,使用了IEEE754单精度浮点,在RTL单精度浮点处理中,使用融合数据通路方法,在Matlab中也使用了双精度浮点。双精度实现要比单精度实现精度高十亿倍(109)。
表3对比了Matlab单精度;RTL单精度和Matlab双精度存在误差,确认了融合数据通路方法的完整性。采用了这一方法来获得输出矩阵中所有复数元素的归一化误差以及矩阵元素的误差。使用Frobenius范数计算了总误差和范数:

4f5407c6-0733-11ee-962d-dac502259ad0.jpg


请注意,由于范数包括了所有元素的误差,因此,它要比每一误差大很多。
而且,DSP Builder模块库和OpenCL工具流程都针对下一代FPGA体系结构,支持并优化目前的设计。由于体系结构创新和工艺技术创新,性能可以达到100峰值GFLOPs/W。
总结
高性能计算应用现在有新的处理平台选择。对于特殊类型的浮点算法,FPGA能够提供低延时和较高的GFLOP/s。在几乎所有应用中,FPGA都能够实现优异的每瓦GFLOP/s。随着下一代高性能计算优化FPGA的推出,这种优势会更明显。
Altera的OpenCL编译器为GPU编程人员提供了几乎无缝的方法来评估这一新处理体系结构的指标。Altera OpenCL符合1.2规范,提供全面的数据库支持。它解决了传统FPGA遇到的时序收敛、DDR存储器管理以及PCIe主
处理器接口等难题。
对于非GPU开发人员,Altera提供DSP Builder模块库工具流程,支持开发人员开发高Fmax定点或者浮点DSP设计,同时保持了基于Mathworks的仿真和开发环境的优点。要求高效能工作流程的FPGA开发人员多年以来一直使用这一产品,与经验丰富的FPGA开发人员相比,所实现的Fmax性能相同。

4f756010-0733-11ee-962d-dac502259ad0.png

有你想看的精彩 基于FPGA的USB3.0 HUB设计方案基于FPGA的DDR3多端口读写存储管理系统设计基于FPGA的无线通信安全协议

4f88b57a-0733-11ee-962d-dac502259ad0.jpg

扫码加微信邀请您加入FPGA学习交流群

4f978b54-0733-11ee-962d-dac502259ad0.jpg4fb3e7ea-0733-11ee-962d-dac502259ad0.png

欢迎加入至芯科技FPGA微信学习交流群,这里有一群优秀的FPGA工程师、学生、老师、这里FPGA技术交流学习氛围浓厚、相互分享、相互帮助、叫上小伙伴一起加入吧!

点个在看你最好看


原文标题:在FPGA上优化实现复数浮点计算

文章出处:【微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21324

    浏览量

    593215

原文标题:在FPGA上优化实现复数浮点计算

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    优秀的Verilog/FPGA开源项目-浮点运算器(FPU)介绍

    浮点运算器(英文:floating point unit,简称FPU)是计算机系统的一部分,它是专门用来进行浮点数运算的(CPU中也叫ALU)。
    的头像 发表于 04-26 11:27 133次阅读
    优秀的Verilog/<b class='flag-5'>FPGA</b>开源项目-<b class='flag-5'>浮点</b>运算器(FPU)介绍

    中高端FPGA如何选择

    DDR4/5和GDDR6,目前的Virtex Ultrascale+的FPGA中,都没有的。 4.专为AI优化计算引擎
    发表于 04-24 15:09

    verilog语音实现浮点运算

    Verilog可以通过使用IEEE标准的浮点数表示来实现浮点运算。下面是一个基本的Verilog模块示例,展示了如何进行加法、乘法和除法等常见的浮点运算操作: module
    发表于 03-25 21:49

    XMC7100D进行2维浮点fft运算,如何优化?

    1000次的时间是20秒。 IDE:MTB3.0 makefile 设置:COMPONENTS+= CMSIS_NN CMSIS_DSP VFP_SELECT=hardfp 主频的不同对于浮点计算为何影响甚小,是否还有优化的空
    发表于 02-02 07:53

    浮点LMS算法的FPGA实现

    运算的运算步骤远比定点运算繁琐,运算速度慢且所需硬件资源大大增加,因此基于浮点运算的LMS算法的硬件实现一直以来是学者们研究的难点和热点。 本文正是基于这种高效结构的多输入FPA,在FPGA上成功
    的头像 发表于 12-21 16:40 307次阅读

    复数中i在Python中如何定义

    与实数进行运算。复数由实数和虚数部分组成,实数部分可以是任意实数,而虚数部分必须以1j作为后缀。例如,1 + 2j表示实部为1,虚部为2的复数。 要定义和使用复数,你可以直接使用虚数单位'i',或者使用cmath模块中的函数来进
    的头像 发表于 11-22 09:40 1156次阅读

    Python中如何表达复数

    在Python中,可以使用complex类型来表示和操作复数复数是由一个实部和一个虚部组成的数,可以使用下列格式来表示:real + imag*j,其中real是实部,imag
    的头像 发表于 11-21 16:50 1038次阅读

    FPGA浮点IP内核究竟有哪些优势呢?

    最近出现的 FPGA设计工具和 IP有效减少了计算占用的资源,大大简化了浮点数据通路的实现。而且,与数字信号处理器不同
    发表于 09-25 14:42 407次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>浮点</b>IP内核究竟有哪些优势呢?

    为什么研究浮点加法运算,对FPGA实现方法很有必要?

    浮点加法器是现代信号处理系统中最重要的部件之一。FPGA是当前数字电路研究开发的一种重要实现形式,它与全定制ASIC电路相比,具有开发周期短、成本低等优点。 但多数FPGA不支持
    的头像 发表于 09-22 10:40 439次阅读
    为什么研究<b class='flag-5'>浮点</b>加法运算,对<b class='flag-5'>FPGA</b><b class='flag-5'>实现</b>方法很有必要?

    MATLAB编程优化中的应用介绍

    线性的,需要特殊的技术,而这些技术通常不是任何核心课程的一部分。所有的书都假设读者熟悉编程语言,传统是FoRTRAN,最近是C。另一个经常提出的假设是,优化技术将在基础计算环境中实现
    发表于 09-21 07:07

    基于FPGA计算的理论与实践

    说明了现场可编程门阵列的内部工作原理,其由嵌入通用路由结构中的逻辑块组成。这逻辑门阵列是FPGA中的G和A。逻辑块包含用于执行简单组合逻辑的处理元件以及触发器用于实现时序逻辑。因为逻辑单元通常只是
    发表于 09-21 06:04

    扩充浮点运算集是否需要自己FPGA板子设置一个定点数转为浮点数的部分?

    扩充浮点运算集的时候,是否需要自己FPGA板子设置一个定点数转为浮点数的部分?
    发表于 08-11 09:13

    浮点加法是如何计算

    嗨!我试着写点关于浮点数的东西,我发现自己对这个 64 位浮点数的计算方法很好奇:     >>> 0.1 + 0.2 0.30000000000000004 我意识到我并没有完全理解它是如何
    的头像 发表于 05-26 15:26 687次阅读

    FPGA常用运算模块-复数乘法器

    本文是本系列的第五篇,本文主要介绍FPGA常用运算模块-复数乘法器,xilinx提供了相关的IP以便于用户进行开发使用。
    的头像 发表于 05-22 16:23 1407次阅读
    <b class='flag-5'>FPGA</b>常用运算模块-<b class='flag-5'>复数</b>乘法器

    FPGA高级设计之实现功耗优化

    点击上方 蓝字 关注我们   FPGA 高级设计之实现功耗优化 与ASICs(Application Specific Integrated Circuits)比较,相似的逻辑功能,用FPGA
    的头像 发表于 05-19 13:50 890次阅读