在C/C++算法设计中使用任意位宽

开发定点(fixed-point)算法时,通常需要在设计功能性、数字精度建模、及验证(仿真)速度之间取得一个平衡。现在,一种新的数据类可使此过程简单化,由此得到更简单精确的建模精度、更好的数字求精、及更快的验证周期,而ANSI C/C++正是开发这种数字求精算法的最佳语言。

某此算法天生就适用于操作整数,或那些理想中的实数(如数字滤波器的系数),它们也可能会使用浮点或定点类型。一般而言,在算法开发的早期阶段,会经常用到C语言的float或double浮点类型,因为它们可提供一个非常大的动态数据范围,且对大多数程序来说都是适用的。见图1:

使用C内置的float类型来建模一个FIR滤波器

算法可进行数字求精,以便使用定点算术来降低最终硬件或软件实现的复杂性。在硬件方面,将整数或定点算术限制为最小位宽,可在本质上满足性能、空间、能耗的需要;如果实现中用到了DSP处理器,那么把算法限制为整数或定点算术,就可为特定程序使用尽可能便宜的处理器。

定点算术的建模可通过C语言内置的浮点或整数类型来完成,这做的话,需要显式编码并受限于C中浮点数及整数可表示的最大数:64位整数或53位尾数;这些都会给操作数的位宽带来更多的限制,例如,2个33位的数相乘,会超过64位C整数可表示的范围。图2演示了一个FIR滤波器的例子,但temp变量限制为15位的定点精度,其中10位用于整数位。在这个实现中,LSB的右部位被舍弃(量化模型的截断),而MSB的左部位也被舍弃(包装的溢出模型),应该意识到,使用float(或double)的模型在精度上是受限的,且不能再次合成(synthesis)。同样,由于有取整模型的严格位精度定义有先,又由于内置浮点类型的取整将会先被应用,所以对除法这样的操作来说,就非常难实现了。

使用float建模定点行为

当许多算法都能依赖本地C数据类型的精度来编写时,对支持任意长度的整数及定点算法,大家就会抱有极大的期望,而硬件描述语言(HDL)如VHDL,走的也是同一条路。随着C/C++越来越多地被用于高级合成与验证工具(High-Level Synthesis and Verification tools),也证明了这种语言本质上有一个足以满足当前及未来程序需要的数据类型库。任意长度类型的支持,也可使数据类型的行为有一个统一的定义,而统一的语义则避免了人工实现上的一些限制。

算法C数据类型

算法C数据类型是一种基于类的C++库,其实现了任意长度的整数及定点类型,而这些可自由访问的类型有一系列好处,包括统一及良好定义的语义,还有媲美C/C++内置数据类型的运行时速度,对比SystemC中相应的类型,其运行速度也超过10倍以上。这些数据类型能用于任何符合C++或SystemC规范标准的程序中,并拥有高度可合成的语义。

语义

语义的统一性与一致性是避免在算法中,发生功能性错误的关键,以下的例子,也说明了这点:

时间: 2016-10-07

在C/C++算法设计中使用任意位宽的相关文章

AIDA64中查看显卡位宽的方法

  一.如何安装AIDA64: 双击下载的安装包,会弹出用户帐户控制对话框"你要允许以下程序对此计算机进行更改吗?"点击"是"."选择安装期间要使用的语言",这里我们选择"中文(简体)", 点击"确定",按照安装向导的提示完成后续安装工作;如图所示: 二.如何使用AIDA64软件的功能: 1.双击"AIDA64"图标,运行该程序后,点击"显示设备"---"图

面试之如何回答关于算法设计的问题?

转自:http://blog.csdn.net/xdhehao/article/details/12522449                                                                                          程序员面试之道(<程序员面试笔试宝典>)之如何回答算法设计?                                程序员面试中,很多算法设计问题,都是历年来各家企业的"炒现饭"

基因表达式编程的任务指派问题求解算法设计与实现

朱明放1,2,叶飞跃1,2,丁小未2  (1.江苏理工学院云计算与智能信息处理常州市重点实验室,江苏常州,213001: 2.江苏理工学院计算机学院,江苏常州,213001) 摘要:任务指派问题是典型的组合优化问题,得到了广泛的研究.基于基因表达式编程的思想,设计了任务指派问题求解的算法,并用C#实现了该算法.结合人力资源任务分配的实例进行了实验分析和研究,获得了人员与岗位配置的最优解.实验表明算法设计是正确性和有效性,因而为企业人员安排提供参考依据. 关键词:TAP问题:基因表达式编程:逆串算

黄金分割的金苹果——浅谈apple设计中的黄金分割

你研究或者不研究,美就在那里,不偏不移:你发现或者不发现,黄金分割就在那里,不多不少.了解他,发现美,也给自己增加精彩,好作品不会没有依据. 掀开面纱 0.618或者1.618,这个数字是否觉得似曾相识.这其实是一个数学比例关系(说到数学,不要先着急晕哦,知道咱们做设计得对计算都不敏感,呵呵),即把一条线段分为两部分,此时短段与长段之比恰恰等于长段与整条线之比,其数值比为1:1.618或0.618:1. 这就是黄金分割律,由公元前六世纪古希腊数学家毕达哥拉斯所发现,后来古希腊美学家柏拉图将此称为

编码-四元式划分基本块算法设计求救!

问题描述 四元式划分基本块算法设计求救! 哪位大神能搞定请联系我!qq363166167 课设内容和要求: 内容:1.设计一个演示窗口,包括基本的操作按钮和显示窗口: 2.设计构造基本块划分算法: 3.输入语句序列(四元式): 4.输出程序流程图: 要求:1.建立合理的数据结构模型,存储输入四元式和程序流程图: 2.设计实现方案和算法: 3.编码工具自行选择: 4.软件操作界面友好,具有简单的错误处理功能: 5.必须独立完成课设的设计.编码.调试: 6.写出规范的课程设计报告.

动态规划法求文本串的最优分行问题河海大学考博计算机算法设计与分析真题着急求解中

问题描述 动态规划法求文本串的最优分行问题河海大学考博计算机算法设计与分析真题着急求解中 列表并至少给出4步典型过程,求文本串"Do you like those people who always think of money and cannot remember the past."在列宽为15,惩罚函数为行空余空间的平方(最后一行不计惩罚)时的最优分行方案.不需要给出具体的实现代码.用动态规划算法给出列表

数据结构算法设计: 请设计一个算法,统计一个循环单链表L中的结点个数。

问题描述 数据结构算法设计: 请设计一个算法,统计一个循环单链表L中的结点个数. 算法设计: 请设计一个算法,统计一个循环单链表L中的结点个数. 解决方案 int n = 0; while (L != NULL) { L = L->next; n++; } 解决方案二: /* counts the nodes in the list / int fuc(struct list head) { void *tmp; int i; if(!head) return -1; for(i = 1, tm

将源目录中的文件按照前缀分发到不同目录中的算法设计及C代码实现

一.需求描述 在Linux系统的某个源目录中有一批后缀相同的文件,编写程序将这些文件按照前缀分发到不同的目录中. 例如,源目录SourceDir中存放有三个后缀相同的文件File1_1.txt.File2_1.txt和File3_1.txt,按照前缀File1_.File2_和File3_将它们分别移动(分发)到目录FileDir1.FileDir2和FileDir3中. 二.算法设计 基于需求,可以采用如图1所示的程序流程: 图1 程序总体流程 三.特殊流程考虑 在编写程序的过程中,对于某些特

《算法设计与分析》一一2.1 数学运算背后的算法操作

2.1 数学运算背后的算法操作 虽然我们已经熟知很多数学概念与性质,但是从算法设计与分析的角度来看,还需要进一步将这些数学的概念与算法的运作联系起来.下面就从这一角度来讨论几组算法设计与分析中常用的数学概念与性质.2.1.1 取整x和x 我们熟知取整函数的定义:下取整函数x表示不超过x的最大整数:上取整函数x表示不小于x的最小整数.需要取整函数的本质原因在于算法分析中涉及的一些量往往是某种离散对象的个数,它必然是正整数.例如,算法的代价是关键操作的个数,问题的规模经常表示为输入元素的个数.输入数