最近在作DNN定点化相关的工做,DNN定点化就是把float表示的模型压缩成char表示,虽然会损失精度,可是因为DNN训练的模型值比较接近且范围较小,实际上带来的性能损失很是小。DNN定点化的好处是能够以4倍的效率压缩模型,这个在移动端会具备比较大的优点。
作完定点化以后,在x86服务器上验证没有问题,可是利用NDK移植到arm移动端却一直得不到正确结果,真是一时头大。经过仔细调试,最终发现问题所在—全部值为负的float值定点化成char以后都变为0!在网上搜了好久终于知道这个竟然是arm平台自己的问题。Arm平台下,char默认实际上是unsigned char,正是因为char是无符号的,致使一个不在范围内的数被强转时会产生未定义的行为,在Stack Overflow上有一个很好的解释。
找到问题所在,解决方法就很是简单,强制让arm平台下的char是有符号的,具体就是在编译的时候加-fsigned-char选项。服务器