之前服务器环境使用的是NVIDIA的Tesla P4的环境,程序运行没有问题,但是换成Tesla M40,程序就算就出现较大的偏差。
大致原因是M40是单精度的浮点数的运算,P4是双精度,在双精度上的计算结果用在单精度上运行,运算精度不一样,所以计算偏差比较大,导致的结果不一致。特别是乘除法的矩阵运算,结果运算偏差会很大。
解决方式是模型训练时,指明单精度运算做训练:
如:
grayPix = (0.3f * r) + (0.59f * g) + (0.11f * b);
改写为:
grayPix = __fadd_rn(__fadd_rn(__fmul_rn(0.3f, r),__fmul_rn(0.59f, g)), __fmul_rn(0.11f, b));
参考: