![]() |
Страницы (3): [1] 2 3 » Показать все 43 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Почему MSVC2010 генерирует такой дерьмовый код? (https://hlfx.ru/forum/showthread.php?threadid=4598)
Почему MSVC2010 генерирует такой дерьмовый код?
Сегодня с удивлением заметил проблему: колоссальное падение производительности при попытке вычислить максимальное значение. Код вот такой:
float f = somestuff; |
f = max( f, 0 ); |
#ifndef max |
#define max(a,b) (((a) > (b)) ? (a) : (b)) |
#endif |
code:
fld DWORD PTR _dp$68919[ebp] fcom ST(1) fnstsw ax test ah, 65 ; 00000041H jne SHORT $LN26@Mathlib_In@6 fstp DWORD PTR tv194[ebp] jmp SHORT $LN21@Mathlib_In@6 $LN26@Mathlib_In@6: fstp ST(0) fst DWORD PTR tv194[ebp] $LN21@Mathlib_In@6: fld DWORD PTR tv194[ebp]
code:
fldz fxch %st(1) fcomi %st(1), %st fcmovb %st(1), %st fstp %st(1)
__________________
А если заменить ассемблерной вставкой и забыть про это?
Skaarj раз этот код такой, то и весь остальной такой же. Не на ассемблере же теперь писать. Проще компилировать через minGW, но это может не вариант.
Попробую посмотреть позже как на vs2013.
Можно полный пример кода? Чтобы функцию оптимизацией не откинуло.
1 | void Mathlib_Internal_TransformVectorsLV_SingleBone( int count, const float *inputVectors, const vmd_matrix_t *inputMatrices, const float *lightDir, float *outputVectors ) |
2 | { |
3 | for ( ; count > 0; --count, inputVectors += 4, outputVectors += 4 ) { |
4 | outputVectors[0] = inputVectors[0] * inputMatrices[0][0][0] + inputVectors[1] * inputMatrices[0][0][1] + inputVectors[2] * inputMatrices[0][0][2] + inputMatrices[0][0][3]; |
5 | outputVectors[1] = inputVectors[0] * inputMatrices[0][1][0] + inputVectors[1] * inputMatrices[0][1][1] + inputVectors[2] * inputMatrices[0][1][2] + inputMatrices[0][1][3]; |
6 | outputVectors[2] = inputVectors[0] * inputMatrices[0][2][0] + inputVectors[1] * inputMatrices[0][2][1] + inputVectors[2] * inputMatrices[0][2][2] + inputMatrices[0][2][3]; |
7 | float dp = outputVectors[0] * lightDir[0] + outputVectors[1] * lightDir[1] + outputVectors[2] * lightDir[2] - 0.5f; |
8 | outputVectors[3] = max( dp, 0.0f ); |
9 | } |
10 | } |
__________________
XaeroX
Вроде получил код с простым примером.
Platform Toolset v120
оптимизация /O2
code:
012D101F movss xmm0,dword ptr [f] 012D1024 xorps xmm1,xmm1 012D1027 add esp,8 012D102A comiss xmm0,xmm1 012D102D ja main+37h (012D1037h) 012D102F movaps xmm0,xmm1 012D1032 movss dword ptr [f],xmm0
__________________
XaeroX
Достать у MS старые версии VS не так-то просто.
>>И отключи /arch:SSE
Где отключить?
Платформа x64?
Platform Toolset v100; /O2
code:
00007FF6830D1025 movss xmm0,dword ptr [f] 00007FF6830D102B xorps xmm1,xmm1 00007FF6830D102E comiss xmm0,xmm1 00007FF6830D1031 ja main+3Ch (07FF6830D103Ch) 00007FF6830D1033 movaps xmm0,xmm1 00007FF6830D1036 movss dword ptr [f],xmm0
code:
00371013 fldz 00371015 fcom dword ptr [f] 00371018 add esp,8 0037101B fnstsw ax 0037101D test ah,5 00371020 jnp main+27h (0371027h) 00371022 fstp dword ptr [f] 00371025 jmp main+29h (0371029h) 00371027 fstp st(0)
Ну получше, по крайней мере есть fldz.
Но всё равно не так красиво, как в MinGW/GCC.
Это ты 2013-й студией компилил с тулсетом v100?
__________________
XaeroX
Да. 2013 студия с тулсетом от visual studio 2010 express.
Как я понял с этой express нельзя на x64 компилировать. По крайней мере, мне написало, что тулсет не установлен.
Хорошо хоть community edition теперь сделали, где, вроде, ничего не урезано и можно vs assist поставить.
Меня 2010 студия во всём устраивала. До вчерашнего дня, пока не обнаружился этот досадный баг. Который, по всей видимости, частично и в 2013 остался - раз код по-прежнему недостаточно оптимален.
Переходить на MinGW не вариант, там своих проблем хватает. В целом микрософтовский компилятор мне показался надёжнее. Но вот как это говно забороть-то?
__________________
XaeroX
Могу попробовать ещё на vs 2015. Для сравнения, так сказать. Исправились ли они или ошибки тащат в следующие релизы.
И в саппорт, наверное, им надо репортнуть. Может что скажут.
__________________
XaeroX
v140 x86 /O2
code:
012810C3 movss xmm0,dword ptr [esp+40h] 012810C9 xorps xmm1,xmm1 012810CC add esp,8 012810CF comiss xmm0,xmm1 012810D2 ja main+3Dh (012810DDh) 012810D4 movaps xmm0,xmm1 012810D7 movss dword ptr [esp+38h],xmm0
ComradeAndrew
Опять ты SSE-код показываешь. Да знаю я, знаю, что под SSE нормально всё. В 2010 тоже нормально под х64. Меня интересует исключительно FPU-код, совместимый.
__________________
XaeroX а где отключать-то?
Временная зона GMT. Текущее время 11:19. | Страницы (3): [1] 2 3 » Показать все 43 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024