mtune и march при компиляции в образе докера - PullRequest
0 голосов
/ 04 января 2019

При компиляции образа Docker (т.е. в файле Docker), какие march и mtune должны быть установлены в?

Обратите внимание, что речь идет не о компиляции в работающем контейнере, а о компиляции при сборке контейнера (например, создание инструментов из исходного кода при запуске образа).

Например, в настоящее время, когда я запускаю docker build и устанавливаю пакеты R из источника, я получаю множество (может быть g++/gcc/f95 ...):

g++ -std=gnu++14 [...] -O3 -march=native -mtune=native -fPIC [...]

Если я использую native в изображении, созданном Dockerhub, я предполагаю, что при этом будут использоваться спецификации компьютера, используемого Dockerhub, и это повлияет на двоичный файл образа, доступный для загрузки?

Это связано с аналогичным вопросом о виртуальных машинах , но контейнеры не являются виртуальными машинами.

1 Ответ

0 голосов
/ 12 января 2019

Если я использую native в образе, созданном Dockerhub, я предполагаю, что он будет использовать спецификации машины, используемой Dockerhub, и это повлияет на двоичный файл образа, доступный для загрузки?

Это правда. Когда образ докера создается, он выполняется на хост-машине и использует его ресурсы, поэтому -march=native и -mtune=native будут принимать спецификации хост-машины.

Для создания образов докеров, которые могут быть использованы широкой аудиторией, и для того, чтобы заставить их работать как можно на многих (X86) целях, лучше всего использовать общий набор инструкций. Если вам нужно указать march и mtune, возможно, это будет самый безопасный выбор:

-march=x86-64 -mtune=generic

В некоторых случаях возможны некоторые падения производительности по сравнению с -march=native -mtune=native, но, к счастью, в большинстве приложений это изменение может остаться практически незамеченным (конкретные приложения могут пострадать больше, особенно если они зависят от небольшого фрагмента функций ядра). что GCC может хорошо оптимизировать, например, используя наборы векторных команд CPU).

Для справки, проверьте подробное сравнение с Phoronix:
Тесты компилятора GCC на различных уровнях оптимизации с использованием Clear Linux

Он сравнивает около десятка тестов с GCC 6.3, используя различные флаги оптимизации. Тесты выполняются на машине Intel Core-I7 6800K, которая поддерживает современные наборы инструкций Intel, включая SSE, AVX, BMI и т. Д. (Полный список см. здесь ). В частности, -O3 против -O3 -march=native - интересная метрика. Вы могли видеть, что в большинстве тестов преимущество -O3 -march=native над -O3 незначительно по сравнению с незначительным (и в одном случае -O3 выигрывает ...).

В заключение, -march=x86-64 -mtune=generic является достойным выбором для образов Docker и должен обеспечивать хорошую мобильность и, как правило, незначительное снижение производительности.

...