Могу ли я использовать встроенные функции SIMD для программного обеспечения, работающего в облаке? - PullRequest
0 голосов
/ 16 февраля 2019

Просто учитывая, что нужно сделать при переносе некоторого программного обеспечения в облако.Программное обеспечение использует множество встроенных функций SIMD (от Intel), начиная с SSE3 и заканчивая AVX.Хорошо работает на локальном сервере.Мне интересно, какие изменения нужно сделать, чтобы перенести их в облако.Конечно, желательно иметь возможность использовать функции SIMD с минимальными изменениями.Тем не менее, кажется невозможным предсказать, какой тип процессора будет использоваться, когда он работает в облаке.И я сомневаюсь, что можно использовать низкоуровневые функции конкретного процессора, когда программа работает на виртуальной машине или контейнере.

1 Ответ

0 голосов
/ 16 февраля 2019

Да, проще использовать SIMD на облачных серверах, чем в приложении, которое вы собираетесь распространять на рабочие столы людей, потому что у вас обычно есть больше контроля над тем, на каком оборудовании будет работать ваш код.(В зависимости от того, какой облачный хостинг вы можете точно знать, например, работает ли он на вашем текущем частном сервере.)


Внутри виртуальной машины машинный код в ваших скомпилированных исполняемых файлах по-прежнему работает изначальнона (обычно) процессорах x86 , обычно на Intel Xeon, но, возможно, на серверах AMD.

Некоторые программы для виртуальных машин могут быть настроены так, чтобы не предоставлять AVX, но на любом облачном хосте x86 будет SSE4.2 поне менее .SSE2 является базовым для x86-64, поэтому не раскрывать это не вариант.Процессоры, настолько старые, что у них есть только SSE4.1 или SSSE3, вероятно, уже давно уйдут в отставку, поскольку не стоят той энергии, которая требуется для их запуска.

Главное, чего не хватает в большинстве виртуальных машин / облачном хостингеэто счетчики производительности HW. Таким образом, вам будет сложно выполнить профилирование для настройки облачного сервера с Linux perf record или perf stat для любого события, например, отсутствия кеша или даже циклов.perf может иметь некоторую выборку на основе времени, а другие инструменты профилирования предназначены для выборки на основе времени вместо счетчиков производительности HW.


Например, вычислительные серверы Google Cloud позволяют выбирать, какое оборудованиеваши экземпляры будут работать, например, Haswell или Skylake-X.С любым из них у вас есть AVX2 и FMA доступны.(И BMI2, popcnt и т. Д.).С Skylake-X у вас также есть AVX512BW / AVX512DQ / несколько других разновидностей AVX512.Скомпилируйте с clang / gcc -O3 -march=skylake-avx512 или -march=haswell в зависимости от ситуации.

Если можно предположить, что AVX + FMA важен для вашего программного обеспечения, я предполагаю, что другие облачные хосты имеют аналогичные механизмы, позволяющие вам выбирать как минимумминимальный базовый набор расширений ISA.Я ожидаю, что очень легко найти как минимум AVX и, вероятно, также легко найти Haswell как минимум.(AVX2 + FMA + BMI1 / BMI2).-march=haswell - полезная базовая цель компиляции.

Виртуальные машины поддерживают миграцию виртуальных машин между физическими машинами, но они никогда не будут мигрировать на хост, на котором отсутствуют некоторые функции, с которых начинал гость.(Это одна из причин не проходить через AVX или рекламировать более свежую версию SSE или AVX, как у CPU.)

AVX и AVX512 добавляют новое архитектурное состояние (новые / более широкие регистры) и поэтому требуютновая поддержка сохранения / восстановления для переключателей контекста.Без правильных битов, установленных OS / VM в управляющих регистрах, инструкции AVX будут ошибочными.Таким образом, виртуальная машина может полностью запретить гостю использовать AVX.Но так как SSE2 должен быть включен, они не могут помешать вам использовать SSE4.2, если HW поддерживает его.Гостевая виртуальная машина может быть настроена так, что CPUID только рекламирует SSE2, но не выше, но они не могут сделать ошибку инструкций SSE4.2, пока работают инструкции SSE2.То же самое для AVX2 + FMA: если включен AVX1, только базовый ЦП, который действительно не поддерживает AVX2 или FMA, может сделать их неисправными, а не искусственный предел CPUID.Но отсутствие рекламы FMA может означать, что ваша виртуальная машина может в любой момент перейти на HW, который ее не поддерживает.


Intel по-прежнему производит процессоры без AVX в линейке Silvermont / Goldmont.Некоторые из них используются на серверах с низким энергопотреблением, но я думаю, что это редко встречается в большинстве облачных сред.(Intel также продает процессоры Skylake Celeron / Pentium без AVX, но вы не найдете их на облачных хостах.)

Кроме этого, Sandybridge был новинкой примерно в 2011 году, и AMD представила Bulldozer примерно в то же время.Поэтому любые основные процессоры, которым физически не хватает поддержки AVX, очень устарели и не имеют пропускной способности памяти и мощности процессора, которые бы стоили затрат на электроэнергию для большинства хостеров.

...