У меня есть строка в 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