我在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
显然,这是合理的,因为vrsqrtps
比vsqrtps
快得多。因此,在平方根为倒数的情况下,调用非精确函数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