Здравствуйте, Ruzzz, Вы писали:
R>Возможно ли отключить генерацию AVX(2) кода оставив только SSE(N) в VC++ 2015?
Я думал что её надо специально включать ключом /arch:AVX2.
А тут такой подарок. Давно пора, только новое и модное, ибо нефиг. Покупайте новое железо.
Ждёмс когда же уже результат не будет пускаться на win7 и на процессорах старше 2лет.
Может стоит задуматься об использованием других компиляторов.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Ruzzz, Вы писали:
R>>Возможно ли отключить генерацию AVX(2) кода оставив только SSE(N) в VC++ 2015? _>Я думал что её надо специально включать ключом /arch:AVX2. _>А тут такой подарок. Давно пора, только новое и модное, ибо нефиг. Покупайте новое железо. _>Ждёмс когда же уже результат не будет пускаться на win7 и на процессорах старше 2лет. _>Может стоит задуматься об использованием других компиляторов.
Мля нашел, к проекту подключено несколько статических lib.
И одну я сам же когда-то скомпилировал с ключом /arch:AVX
Просто кинул старые lib'ы не проверив.
Либы все скомпилированы с /mt ключом
На старом компе Unhandled exception at ...: 0xC000001D: Illegal Instruction.
Нахожу внутри вызова:
Код одной из библиотек lib ->
std::basic_ostream<...>::operator<<(int) ->
std::num_put<...>::do_put(std::ostreambuf_iterator<...>, std::ios_base&, char, long)
Инструкцию vmovups xmm0, xmmword ptr [r8]
Проверяю и перекомпилирую эту lib без /arch:AVX
В этом же месте и сгенерированный ASM и IDA показывает: movups xmm0, xmmword ptr [r8]
Включаю генерацию ASM для exe проекта, везде movups
А в результате в exe опять vmovups
Оказалось что одна из lib была /mt /arch:AVX
Жаль что компоновщик не умеет подсказывать в этой ситуации.
Интересно на основе чего он делает вывод кукую версию использовать?
Знает ли он что там код с AVX?
Здравствуйте, Ruzzz, Вы писали:
R>Жаль что компоновщик не умеет подсказывать в этой ситуации.
Я вот собираю 64-битную lib , меняю заголовок на x86 и подсовываю в сборку.
Получаю 64-битный код в бинарнике 32-бит
R>Интересно на основе чего он делает вывод кукую версию использовать?
Какую указываем, такую и используем.
Нужно собрать несколько разных версий и придумать наименования.
А потом на основе флагов компиляции выбирать нужное имя.
К примеру как делается в Boost: http://www.boost.org/doc/libs/1_56_0/boost/config/auto_link.hpp
R>Знает ли он что там код с AVX?
Ему всё равно что там внутри.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, Ruzzz, Вы писали:
R>>Интересно на основе чего он делает вывод кукую версию использовать? _NN>Какую указываем, такую и используем. _NN>Нужно собрать несколько разных версий и придумать наименования. _NN>А потом на основе флагов компиляции выбирать нужное имя. _NN>К примеру как делается в Boost: http://www.boost.org/doc/libs/1_56_0/boost/config/auto_link.hpp
Это очень удобно когда у вас постоянно растёт количество архитектур
libX-i386
libX-i686
libX-x86-SSE2
libX-x86-SSE4
libX-x86-AVX
libX-x86-AVX2
libX-AMD64-FMA
libX-AMD64-SSE4
libX-AMD64-AVX
libX-AMD64-AVX2
libX-AMD64-AVX512
libX-IA64
libX-ARMthumb
libX-ARM
libX-ARMv7
libX-ARMhf
libX-ARM64
libX-MIPS
libX-MIPS64
libX-SHA
libX-PPC
libX-PPC64
...
И собирать дольше и либы здоровее (занимают уже не гигабайты а десятки гиг)
Ах да забыл
libX-(OSes)*(CPU_ARCHes)*(COMPILERER_VERSIONs)*(RELEASE|DEBUG)
R>>Знает ли он что там код с AVX? _NN>Ему всё равно что там внутри.
Особенно удобно с динамическим либами.
Здравствуйте, kov_serg, Вы писали:
R>>>Интересно на основе чего он делает вывод кукую версию использовать? _NN>>Какую указываем, такую и используем. _NN>>Нужно собрать несколько разных версий и придумать наименования. _NN>>А потом на основе флагов компиляции выбирать нужное имя. _NN>>К примеру как делается в Boost: http://www.boost.org/doc/libs/1_56_0/boost/config/auto_link.hpp _>Это очень удобно когда у вас постоянно растёт количество архитектур
Это плата за компиляцию заранее.
Переходите на платформы с JIT компиляцией.
Или храните промежуточный код и транслируйте уже на конечной машине
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, kov_serg, Вы писали:
R>>>>Интересно на основе чего он делает вывод кукую версию использовать? _NN>>>Какую указываем, такую и используем. _NN>>>Нужно собрать несколько разных версий и придумать наименования. _NN>>>А потом на основе флагов компиляции выбирать нужное имя. _NN>>>К примеру как делается в Boost: http://www.boost.org/doc/libs/1_56_0/boost/config/auto_link.hpp _>>Это очень удобно когда у вас постоянно растёт количество архитектур _NN>Это плата за компиляцию заранее.
Это не плата это не желание замечать проблему.
_NN>Переходите на платформы с JIT компиляцией.
На java приходится платить за высокий уровень абстракций. Размеры war файлов просто доставляют. _NN>Или храните промежуточный код и транслируйте уже на конечной машине
Еще интерпретируемые скрипты есть. Пиковая вычислительная мощность в большинстве задач не требуется.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Ruzzz, Вы писали:
R>>Возможно ли отключить генерацию AVX(2) кода оставив только SSE(N) в VC++ 2015? _>Я думал что её надо специально включать ключом /arch:AVX2. _>А тут такой подарок. Давно пора, только новое и модное, ибо нефиг. Покупайте новое железо.
У меня на новом лаптопе процессор 4405U из линии Skylake, но AVX в нём нет. Так что новизна не поможет.
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, kov_serg, Вы писали:
_>>Здравствуйте, Ruzzz, Вы писали:
R>>>Возможно ли отключить генерацию AVX(2) кода оставив только SSE(N) в VC++ 2015? _>>Я думал что её надо специально включать ключом /arch:AVX2. _>>А тут такой подарок. Давно пора, только новое и модное, ибо нефиг. Покупайте новое железо.
N>У меня на новом лаптопе процессор 4405U из линии Skylake, но AVX в нём нет. Так что новизна не поможет.
Нет проблем. по мнению маркетологов "выжнедебил" вам срочно надо что-то по новее хотябы древний i7-6950, но "нормальные пацаны" берут E7-8890 v4 иначе комп будет "тупить"
Здравствуйте, kov_serg, Вы писали:
_>>>Это очень удобно когда у вас постоянно растёт количество архитектур _NN>>Это плата за компиляцию заранее. _>Это не плата это не желание замечать проблему.
Именно плата.
Никто не мешает скомпилировать функцию в нужных вариантах и динамически выбирать нужную реализацию, таким образом получая один библиотечный файл.
Или собрать несколько динамических модулей (dll) и выбирать во время выполнения нужную реализацию.
Единственная проблема, что тогда практически мы отказываемся от части оптимизаций компилятора.
В любом случае если нужна совместимость с более старым железом нужно чем-то жертвовать.