Любопытная новость: в Америке агентство по защите окружающей среды поймало "Фольксваген" на том, что они ставили в дизельные машины специальную программу. Эта программа определяла, когда машина проходит тест выхлопа (следила за работой двигателя, положением руля, итд.), и тогда включала режим очистки на максимум. А при обычной езде режим другой, и уровень загрязнения превышает разрешенный в 40 раз.
Теперь их обязали заменить 500 тысяч проданных за последние 7 лет автомобилей нескольких марок, и еще видимо оштрафуют на какие-то миллиарды.
Подробности напр. в: "Репутация Volkswagen задымилась".
ygam напомнил в одном из обсуждений, что это похоже на историю пятилетней давности уже из компьютерной индустрии. Тогда Интел поймали на том, что их компилятор выдает особо оптимизированный код, только когда его запускают на процессоре Интела, а на AMD генерирует код помедленней. То есть так: он смотрит на прошитое в процессоре имя вендора, и если это GenuineIntel, то делает всякие разные оптимизации в зависимости от того, что CPU реально поддерживает. А если нет, он никаких оптимизаций не делает, и для нового AMD выдает такой же код, как для древнего Pentium III.
Причем любопытно, что это так и не изменилось с тех пор. Вроде бы Интел заставили заплатить штраф и документировать это поведение компилятора, но он продолжает так себя вести. Год назад в реддите было обсуждение, и кто-то залез в свежую версию компилятора и проверил:

(это код, который ищет фразу GenuineIntel, и в зависимости от того, находит или нет, продолжает запускать разные процедуры оптимизации; если не находит, то оптимизации реально никакой нет)
Теперь их обязали заменить 500 тысяч проданных за последние 7 лет автомобилей нескольких марок, и еще видимо оштрафуют на какие-то миллиарды.
Подробности напр. в: "Репутация Volkswagen задымилась".
Причем любопытно, что это так и не изменилось с тех пор. Вроде бы Интел заставили заплатить штраф и документировать это поведение компилятора, но он продолжает так себя вести. Год назад в реддите было обсуждение, и кто-то залез в свежую версию компилятора и проверил:

(это код, который ищет фразу GenuineIntel, и в зависимости от того, находит или нет, продолжает запускать разные процедуры оптимизации; если не находит, то оптимизации реально никакой нет)
no subject
Date: 2015-09-21 05:13 pm (UTC)2. Раз "компилятор выдаёт особо оптимизированный код [...] в зависимости от того, что CPU реально поддерживает", значит речь идёт не о коммерческой разработке ПО (разработчику важно чтобы его программа работала на процессоре заказчика/потребителя, а не на его собственном, а программа, идеально оптимизированная под особенности одного процессора может вообще не заработать на другом похожем), а о ситуации "написали программу, тут же и запустили" (какие-нибудь научные расчёты с самописными программами например). А это во-первых не такое уж частое применение, а во-вторых - пусть АМД выкатят свой компилятор, оптимизированный под АМД, и проблема решится (или станет симметричной).
no subject
Date: 2015-09-21 05:29 pm (UTC)На AMD ICC-бинарники не используют SSE, хотя процессор их поддерживает:
https://github.com/jimenezrick/patch-AuthenticAMD
https://en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Criticism
the Intel CPU dispatcher does not only check which instruction set is supported by the CPU, it also checks the vendor ID string. If the vendor string is "GenuineIntel" then it uses the optimal code path. If the CPU is not from Intel then, in most cases, it will run the slowest possible version of the code, even if the CPU is fully compatible with a better version.
no subject
Date: 2015-09-21 05:30 pm (UTC)2. Режим компилятора "определить текущий процессор и оптимизировать под него" вполне оправдан для людей, которые сами написали программу и тут же её исполняют.
При этом необходим и режим с ручным указанием целевой платформы, т.к. нередко сборка программы производится дома, а запуск - на мощной машине на работе.
no subject
Date: 2015-09-21 05:45 pm (UTC)По факту, правда, там получается просто выбор ветки кода в зависимости от поддерживаемого набора инструкций, и для АМД не нужна какая-то особая оптимизация, достаточно той, что уже есть. Ну... пусть АМД выкатит свой компилятор, с блэкджеком и оптимизатором - кому надо, будут пользоваться.
2. Тут выше делают разумное предположение, что в посте немного перепутаны слова. И это не компилятор делает разный код в зависимости от CPU. А это код, который делает компилятор (неважно на каком CPU), будучи запущен на АМД выбирает для выполнения ветку, оптмизированную под "самый старый из поддерживаемых процессоров" (т.е. НЕ оптимизированную под АМД), а будучи запущен под интел - выбирает оптимальную ветку.
Вот это - ударит по всем пользователям АМД, а не только по узкому слою разработчиков.
no subject
Date: 2015-09-24 01:35 am (UTC)no subject
Date: 2015-09-24 05:53 am (UTC)Мне вот сейчас стало интересно, а как подобное реализуется в динамически линкуемых библиотеках? В "экзешнике"-то мы один раз выбрали нужную ветку кода при запуске, и так по ней и побежали. А dll могут дёргать часто, если выбирать при каждом вызове - это потери времени, если не выбирать - выполнение неоптимального кода...
no subject
Date: 2015-09-30 06:41 pm (UTC)