MegaGovnoCoder
То есть тебя ни разу не смущает тот факт, что в 1998 году компилятор умел оптимизировать под "отходы" (а на тот момент - широко распространённые процессоры), но в 2015 году внезапно "позабыл", как это делать?
Конкретно я предпочитаю FPU по следующим причинам:
1) Использование SSE подразумевает векторизацию, которую компилятор иногда делает неправильно. Я сталкивался с функциями, которые неправильно оптимизируются с включённым SSE - вплоть до того, что функции начинают работать принципиально неверно. Нет никакого желания жонглировать с версиями компиляторов и тулсетов в поисках таких трудноидентифицируемых багов.
2) Регистры FPU 80-битные, по дефолту расчёты идут двойной точности (53 бита) для 32-битных floatов, что минимизирует ошибки округления. В SSE числа с плавающей точкой занимают 32 бита даже во внутреннем представлении, что ведёт к серьёзным ошибкам. В частности, почти неизбежно приходится переписывать алгоритм на использование эпсилонов, в то время как на FPU довольно безопасно сравнивать числа напрямую (за исключением режима одинарной точности, но его нужно выставлять вручную, по дефолту он не включен).
3) Сопроцессор имеет большое число математических команд - например, вычисление тригонометрии - чего нет в наборах инструкций SSE. В последнем случае необходимые подпрограммы пишутся специально, и как правило, имеют невысокую точность. Эти подпрограммы, как и принято в SSE, заточены под векторизацию, т.е. вычисление четырёх синусов/косинусов за раз, что в условиях убогой векторизации в компиляторах совершенно бесполезно.
4) Выигрыш от использования скалярных операций SSE почти нулевой, если FPU код написан также грамотно - зато точность расчётов ниже. Кривой FPU-код, описанный в первом посте темы - либо баг компилятора, либо сознательный маркетинговый ход с целью популяризовать новые тулсеты. Как я писал выше, у GCC таких проблем нет.
5) SSE нет на мобильных процессорах, а FPU есть, поэтому для получения сравнимых и воспроизводимых результатов на всех платформах последний предпочтителен.
Там же, где я чётко вижу векторизацию, я использую SSE самостоятельно, без сомнительных "услуг" компилятора. И это действительно даёт заметный прирост в тест-кейсах.
Ну и, конечно же, вопрос самоконтроля: если движок выдаёт картинку уровня, скажем, дум3, а дум3 запускается на celeron 466, то по какому праву твой движок не будет на нём запускаться?
Для тех кто удивляется, почему я не спешу уходить с шестой студии и WinXP.
Добавлено 15-06-2016 в 20:30:
Цитата:
~ X ~ писал: Я, конечно, не стану Дядей Мишей и на ВС6 не пересяду после такого
А после вышеприведённого?
Добавлено 15-06-2016 в 20:33:
ЗЫ. SSE для игровых движков практически бесполезен. Куда лучше перенести расчёты на GPU. Ну может быть в физике есть определенный прирост, если модель симуляции достаточно сложная. Или скажем в кодировании DXT - тут да, спорить трудно.