Быстрый взаимный квадратный корень одинарной точности в C ++ с очень низкой точностью - PullRequest
0 голосов
/ 16 сентября 2018

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