【问题标题】:Porting Python/Matlab to C and to fixed-point DSP processor - should C be in fixed-point too?将 Python/Matlab 移植到 C 和定点 DSP 处理器——C 也应该是定点的吗?
【发布时间】:2019-09-12 14:34:43
【问题描述】:

我有一个 Python/Matlab 代码可以进行密集的神经网络计算。这个 Python/Matlab 代码最终将被移植到几个目标(定点)DSP 处理器平台(ARM、Tensillica 等)。作为中间步骤,Python/Matlab 代码应首先移植到 x86 平台上的 C 语言,从而成为“参考”代码的变体。

问题是,这个 C 代码是否应该以普通浮点编写,或者,它是否会为未来的 DSP 端口立即在 x86 上以定点编写它带来任何好处

【问题讨论】:

  • 我会说最好坚持使用固定点,这样您就可以解决任何缩放/范围问题,因为如果您从固定 -> 浮动,无论如何您都必须这样做-> 固定
  • 如何在 C 中获得定点数?
  • @JL2210 您将小数位数保留在脑海中。我认为有些人已经编写了库,但您并不真正需要它们。

标签: c neural-network deep-learning signal-processing fixed-point


【解决方案1】:

我肯定会建议现在在定点中实现您的算法。我用来针对 Python 浮点参考实现测试定点实现的一种工具是 ctypes,它可以直接从 Python 代码中调用 C 函数以进行直接比较。

例如,要使用 ctypes,您必须将定点 C 函数编译为共享对象

gcc -shared -std-gnu11 -g -o $(BIN_DIR)/libfm.so src/fxpt_atan2.c

然后在你的 Python 文件中

import scipy as sp
import ctypes as ct

# Bind functions in shared object so they can be called in Python.
fm = ct.CDLL('../build/x86/bin/libfm.so')

# Create floating point reference.
N = 1024
n = sp.arange(N)
x = sp.exp(2*sp.pi*1j*n/N)
phi = sp.arctan2(sp.imag(x), sp.real(x))

# Quantize input and process with fixed-point implementation.
x_q, scale = quantize(x, normalize='pow2')
phi_q = sp.zeros(len(x), dtype=sp.int16)
for n in range(len(x)):
    # Call ctypes bound function from shared object.
    x_re_q = ct.c_int16(int(sp.real(x_q[n])))
    x_im_q = ct.c_int16(int(sp.imag(x_q[n])))
    phi_q[n] = fm.fxpt_atan2(x_im_q, x_re_q)

# Compare floating point reference and fixed-point implementation.
print(sp.allclose(phi, phi_q/scale*sp.pi, rtol=1e-3))

【讨论】:

  • ctypes 看起来很有趣。您实际上是如何比较这两个输出的?
  • 在生成参考数据并调用固定品脱实现的 Python 文件中,您可以使用 numpy.allclose 检查定点输出是否等于给定容差内的参考。跨度>
【解决方案2】:

如果你有时间并且你的特定算法允许的话,现在就在固定点上做。在跨平台进行比较时,您将能够在准确性和性能方面进行全面比较。

我还考虑降低比特率以适应最终平台。因此,如果您将使用 16 位 ADC 等,我会让您的函数现在接受并使用 16 位整数。如果这是未知的,那么最好坚持 32。

请注意,您可能能够将大部分 C 代码直接复制到您的最终平台。所以现在投入时间是有意义的(如果你的时间线允许的话)。

【讨论】:

    【解决方案3】:

    我不知道您的动态范围要求,但如果 32 位定点足够,那么我会同意所有建议直接解决这个问题。 此外,fstop_22 对 ctype 的推荐非常好。 最后,我不知道您对定点编程有多熟悉,但如果可能,我总是尝试使用Q Format。 Q8.24 始终是一个很好的起点,因为它为您的数字增长提供了空间。

    【讨论】:

      【解决方案4】:

      我不知道您使用的是哪种 Matlab/Python 库,但它们很可能会支持某种定点配置。例如,tensorflow 通过quantize 支持这一点。所以我不知道让代码端以定点表示运行有多难,但我想说花一些时间在上面是完全值得的。您还可以探索fixed point training,这是一种在训练阶段考虑在内的技术,稍后您将使用定点表示。有一些关于这方面的论文。

      但是回答您的问题,如果之前未测试其性能,我绝不会在定点 16 位 DSP 中部署模型,并且您可以轻松地预先“假装”您在 Matlab/Python 中使用定点进行测试。此外,这可以帮助您在将代码移植到 C 时做出一些决定(即为小数部分保留多少位?),或者您可以使用不同类型的量化技术并选择影响最小的一种一个巨大的数据集,stochastic rounding 可能也是一个可以派上用场的概念。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-28
        • 2011-10-10
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        • 2016-04-24
        相关资源
        最近更新 更多