用于高级综合的任意精度浮点库
Posted
技术标签:
【中文标题】用于高级综合的任意精度浮点库【英文标题】:Arbitrary Precision Floating Point library for High Level Synthesis 【发布时间】:2015-07-14 07:56:58 【问题描述】:我正在尝试在 C++ 中创建一个基于模板的任意精度浮点库,它支持可以指定为模板参数的变量指数和变量尾数。我已经开发了一个基于模板的定点库。我想要的实现类型是:
template<int EXPONENT_BITS, int MANTISSA_BITS>
struct fp_float
<some_data_type_to_store_exponent_and_mantissa_values>;
;
我无法找到合适的数据类型来存储指数,因此我使用的位数不会超过代码所需的位数。我曾想过在n = 8, 16, 32, 64
处使用intn_t
,但如果我声明fp_float<3,11>
,它将为EXPONENT
使用8
位,为MANTISSA
使用16
位。
因此,它使整个库变得毫无用处,因为它使用的资源超出了指定精度应有的资源。
我想知道是否有任何其他任意精度的数据类型可以满足我的目的。
我确实遇到了一些任意精度的库,但这些库有一些代码结构,无法使用高级综合合成到硬件描述中(这就是我制作这个库的原因)。
【问题讨论】:
@Bathsheba :我确实经历过Boost
、MPFR
、ttmath
和GMP
并尝试将它们合成到硬件描述中,但它们都使用了几种代码实现Vivado 等高级综合工具支持。我必须使库合成兼容的事实是我构建它的原因。
【参考方案1】:
这对您来说是一个有效的解决方案吗? base_int_t 是一种特征类型,它为您提供了在后续位域定义中使用的基本类型。下面的代码缺少 N > 2 的特化
// gives an integer type fitting in N bytes
template <int N>
struct base_int_t
typedef int type;
;
// specializations
template <>
struct base_int_t<1>
typedef unsigned char type;
;
template <>
struct base_int_t<2>
typedef unsigned short type;
;
// add suitable definitions for N = 3,4...8. For N = 3 and 4 type is unsigned int
template <int EXP_BITS, int MANTISSA_BITS>
struct fp_float
// template argument is the number of bytes required
typedef typename base_int_t<(EXP_BITS + MANTISSA_BITS + 7) / 8>::type type;
type mantissa : MANTISSA_BITS;
type exponent : EXP_BITS;
;
typedef fp_float<3, 11> fp_3_11_t;
fp_3_11_t fp;
【讨论】:
是的,这很有帮助。 ,但是一旦我过了 16 ,它又又有了自己的缺点。但它绝对是低位宽的好方法。【参考方案2】:您可以使用 Mentor Graphics 的 ac_datatypes 中的 ac_int。
https://www.mentor.com/hls-lp/downloads/ac-datatypes
它在模拟和 HLS 中是免费且可用的。
【讨论】:
以上是关于用于高级综合的任意精度浮点库的主要内容,如果未能解决你的问题,请参考以下文章