衡量一款 ASIC 芯片可以从 PPA 三个角度进行。

PPA 指的是: Power/Performance/Area,功耗 / 性能 / 面积。

衡量 FPGA 设计同样可以参照 PPA,但又有所不同。

除非是专门针对功耗的优化,一般设计优化主要考虑的是 LUT / FF 等芯片资源使用情况(面积)以及应用的工作频率以及延迟(性能)。

就加速器而言,还会有一项指标:加速比。加速比参考对象一般是使用冯诺依曼架构的通用 CPU 或者 GPU。

SM3 性能指标

具体到 SM3 加速器的性能指标,我们可以将指标设定为消息吞吐量消息处理延迟以及相比于通用处理器运行高效 SM3 软件算法时的加速比

消息吞吐量 = 消息比特长度 / 消息处理时间 (bit/s 或 bps)消息处理延迟 = T 消息完成时间 - T 消息开始处理时间加速比 = T 加速器上消息运算时间 / T 处理器软件消息运算时间

以本系列上一篇文章中提及的设计为例,假设其工作在 125 Mhz 的时钟下,假设处理一个消息的时钟周期为 64 个,那么系统的吞吐为

512b / (8ns * 64) = 1000Mbps

减少消息处理延迟

实际上基于 FPGA 的 SM3 设计本身就有低延迟的优势。相较于 CPU 或者 GPU 架构,基于指令集以及缓存机制的冯诺依曼架构,无指令的 FPGA 可以直接对输入消息进行处理并输出,系统的延时只会用于处理消息而不是用于指令或者缓存系统。FPGA 处理一个消息块的延迟可以低于 us 级别。

在设计中可以在延迟,吞吐,面积之间权衡。

比如在上一篇的开源实现中,消息填充模块以 512b 消息块为单位,在填充完成后,再将整个消息块输出。这样做减少了处理的复杂度,减少了逻辑面积。但在缓存块的过程中,会使系统增加 512/32 = 16 个周期延迟。

我们会在后续的文章中进一步讨论延迟相关的设计。

提升消息吞吐量

吞吐量是处理系统的关键指标,具体到 SM3 算法中,提高吞吐量有两种主要的途径

  • 优化算法硬件实现架构

我们可以根据算法的特点,通过优化实现架构来提高算法加速器的吞吐。一般架构的更改提高吞吐量是以增大面积作为代价。有以下两种主流的方法

1.实现流水线结构

部署 64 个实现单元,每个周期输入一个消息块。每个时钟周期, 64 个处理单元都处于工作状态。并能在每个周期输出一个消息块的哈希杂凑值,这样一来吞吐量会到一个大得恐怖的量级,那么代价是什么呢?电路的面积会非常大,其实功耗也会非常高。

2.逻辑展开

标准中,每一个消息块需要进行 64 轮迭代,每轮迭代处理一组输入。相邻轮迭代的输入之间没有依赖关系。所以可以通过复制一组处理逻辑,在每轮迭代中处理两组输入,将一个消息块的迭代周期降到 32 个,从而提升吞吐量。

理论上也可以把 64 轮逻辑全部展开到一个周期.... -_-||

  • 提高系统工作频率

想要提高系统的工作频率,关键在于找出设计中的关键路径,并想办法缩短。关键路径指的是设计中两个触发器之间最长的组合逻辑路径。关键路径的长度决定了系统的工作频率。系统的工作周期不能小于关键路径。

优化关键路径的方法有几种:

通过寄存器进行调整,比如插入寄存器到组合逻辑之间,打断组合逻辑;比如平衡多个寄存器之间组合逻辑路径,减少关键路径长度等。

但这些方法的使用在 SM3 这样的周期迭代应用中受限。SM3 需要进行 64 轮迭代,每个周期迭代一次。如果在其中插入寄存器,会使处理周期增加。增加延迟的同时,增加的处理周期可能会抵消降低关键路径长度带来的吞吐提升。

调整综合和布局布线策略,优先对关键路径进行优化;这类和工具相关的优化作者也有使用,但对其中的原理和窍门还不太了解,将在后续的文章中讨论。

对关键路径上的组合进行优化,比如针对 SM3 算法的计算特点,优化算法运算微架构,如使用 CSA 替换路径中的加法器,减少一级加法器从而缩短路径;常量 Tj 在每轮迭代时循环移位,可以用 ROM 存储常量 Tj 每轮循环移位后的值,每轮迭代时使用查表法更新常量,减少循环移位带来的延迟,

结语

本文讨论了 SM3 加速器的性能指标以及提升吞吐等性能的策略。

后续文章中将详细讨论如何通过优化算法实现架构和提高工作频率等方法来提升吞吐。在下一篇文章中将讨论如何使用 CSA 加法器降低关键路径延迟,从而提升频率和吞吐。

指令流水 一个时钟周期 出一个结果_以SM3算法为例,构建一个软硬协作算法加速器:性能分析与优化...相关推荐

  1. c++用一级运算比较大小_以SM3算法为例,构建一个软硬协作算法加速器:设计面向SM3优化的运算结构...

    本文书接上文,来讨论如何具体地针对 SM3 算法的特点,优化计算架构,如通过 CSA 加法器来优化加法关键路径等方法,提升系统频率,提高系统吞吐性能. SM3 中的运算 在分析关键关键路径之前,首先分 ...

  2. python 按钮更改输入框的值_利用 50 行 Python 代码构建一个在线文本生成器!

    本指南将引导你学习构建一个自动完成任意输入文本的Web应用程序. 作者 | Dev Sharma译者 | 苏本如,责编 | 郭芮出品 | CSDN(ID:CSDNnews) 以下为译文: 在本文中,我 ...

  3. oracle 10g 速度慢,让Oracle跑得更快—Oracle 10g性能分析与优化思路_数据库教程

    资源名称:让Oracle跑得更快-Oracle 10g性能分析与优化思路 内容简介: 在这本书里读者将会学到作者在性能优化方面的一些思路和思考,一些故障处理的方法和原则,这些东西是作者在实践中长期积累 ...

  4. 由浅入深探究mysql索引结构原理_性能分析与优化_由浅入深探究mysql索引结构原理、性能分析与优化...

    由浅入深探究mysql索引结构原理.性能分析与优化 第一部分:基础知识第二部分:MYISAM和INNODB索引结构1, 简单介绍B-tree B+ tree树 2, MyisAM索引结构 3, Ann ...

  5. python pygame模块怎么写游戏_使用 Python 和 Pygame 模块构建一个游戏框架

    这系列的第一篇通过创建一个简单的骰子游戏来探究 Python.现在是来从零制作你自己的游戏的时间. 在我的这系列的第一篇文章 中, 我已经讲解如何使用 Python 创建一个简单的.基于文本的骰子游戏 ...

  6. python实现目标检测_由浅入深:教你如何构建一个行人目标检测模型(Python)

    摘要: 零基础也能构建一个目标检测(对象检测)模型?小编教你使用Image AI库从头开始构建一个行人检测模型. 当我们看到一张图片时,我们的大脑会立即识别图片中所包含的物体.而对于机器来说,识别这些 ...

  7. cad2008加载 et拓展工具_译文:8个值得推荐的用于前端开发的性能分析工具「渡一教育」...

    原文链接:https://blog.bitsrc.io/performance-analysis-tools-for-front-end-development-a7b3c1488876,作者:Mah ...

  8. element下拉列表触发_记一次vue长列表的内存性能分析和优化

    好久没写东西,博客又长草了,这段时间身心放松了好久,都没什么主题可以写了 上周接到一个需求,优化vue的一个长列表页面,忙活了很久也到尾声了,内存使用和卡顿都做了一点点优化,还算有点收获 写的有点啰嗦 ...

  9. java 写tb级文件_三管齐下!TB 级文件的上传性能瞬间被优化 100 倍!

    作者 | 中华石杉 责编 | 伍杏玲 本文经授权转载石杉的架构笔记(ID:shishan100) 这篇文章我们来看看,世界上最优秀的分布式文件系统HDFS,是如何对超大文件的上传做性能优化的? 首先, ...

  10. mysql分页总页数算法解析_详解MySQL的limit用法和分页查询语句的性能分析

    limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMIT ...

最新文章

  1. 这70个Java必背英语单词不会,就别说你是Java程序员!
  2. openshift django目录结果
  3. MatLab基础操作
  4. JavaScript内存释放笔记
  5. powerbi的功能介绍_PowerBI 8月更新,这几个实用功能,你应该会用到
  6. C# Repeater绑定显示数组
  7. linux命令行提示符居中,linux命令行学习(54):修改提示符
  8. mysql优化插入速度的方法_优化MySQL插入方法的五个妙招
  9. flux_Flux建筑模式简介
  10. python3x_Python3x 基本知识点
  11. Android p Sign Tool
  12. SpringBoot+SpringCloud —— 使用Feign消费服务
  13. SQL语言基础【DDL、DML、DCL、DQL】
  14. 冯泽来学分块(二分查找)
  15. citrix4.5无法进入发布程序界面The supplied credentials could not be validated
  16. 微信小程序60s倒计时
  17. 系统间通讯实现数据信息实时同步解决方案
  18. WebView加载失败或网络异常时,替换WebView的错误界面;
  19. pycharm远程连接服务器中的docker容器的配置
  20. flex实现自定义鼠标

热门文章

  1. 用REDIS实现分布式缓存
  2. 学习开发自己的composer包,并使用GitHub实时更新到Packagist
  3. Windows Phone笔记(3)触摸简介
  4. 年度总结——文字留住岁月,情感点缀年华
  5. 查看安装的react-native和react版本
  6. 跨域调用报表展现页面的flash打印方法
  7. zabbix如何监控WEB应用性能
  8. Java并发,并行,同步,互斥
  9. Lync Server 2013与OWA的集成
  10. lwip之数据收发流程_1