C ++中单精度倒数平方根的快速运算,但精度很低

时间:2018-09-16 14:59:55

标签: c++ performance sqrt

我在C ++中有一行

c[i] = sqrtf(a[i]);

和汇编代码外观

002D11D0  vsqrtps     ymm0,ymmword ptr a (202D3380h)[eax]  

一行

c[i] = 1.0f / sqrtf(a[i]);

我有一个大会

00E71210  vrsqrtps    ymm1,ymm0  
00E71214  vmulps      ymm0,ymm1,ymm0  
00E71218  vmulps      ymm0,ymm0,ymm1  
00E7121C  vsubps      ymm0,ymm0,ymm6  
00E71220  vmulps      ymm0,ymm0,ymm1  
00E71224  vmulps      ymm0,ymm0,ymm7

显然,这是合理的,因为vrsqrtpsvsqrtps快得多。因此,在平方根为倒数的情况下,调用非精确函数vrsqrtps的速度更快,然后进行两次迭代以获得更精确的值。

我的问题是: 是否可以告诉编译器不必要的其他迭代?因此,程序集将无需其他乘法。 〜1.5 * 2 ^ -12的误差对我来说已经足够了,因为我想添加成千上万个这样的结果,其中很多精度也会下降。我更喜欢不将某些汇编代码内联到C ++代码中的方法。

(编辑后)编译器命令行:

/GS /Qpar /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /Ox /Ob2 /sdl /Fd"Release\vc141.pdb" /Zc:inline /fp:fast /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /arch:AVX2 /Gd /Oy- /Oi /MD /Fa"Release\" /EHsc /nologo /Fo"Release\" /Ot /Fp"Release\performancetest.pch" /diagnostics:classic 

0 个答案:

没有答案