将 Python/Matlab 移植到 C 和定点 DSP 处理器 - C 也应该是定点的吗?

Porting Python/Matlab to C and to fixed-point DSP processor - should C be in fixed-point too?

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

问题是,这个 C 代码应该写成普通浮点数,还是 立即在 x86 上用定点数写它对未来的 DSP 端口有什么好处吗

如果您有时间并且您的特定算法允许,现在定点进行。跨平台比较时,您将能够对准确性和性能进行同类比较。

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

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

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

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

我现在肯定会推荐在定点中实现你的算法。我用来针对 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))

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