The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]

09.10.2018 08:53  Влияние несущественных изменений кода на производительность при использовании GCC

Nadav Amit, разработчик ядра Linux из компании VMware, поделился результатом исследования особенностей оптимизации в GCC небольших функций ядра. Исследование было проведено после того, как разработчик столкнулся с непонятным феноменом - внесение несущественных изменений в код ядра, приводило к небольшому, но заметному снижению производительности в тестах. Примечательно, что подобные вносимые изменения были оптимизациями и теоретически должны были увеличить производительность, но на деле производительность падала.

Дело оказалось в том, что GCC принимает решение об использовании inline-развёртывания функций в зависимости от результатов косвенной оценки размера результирующего кода (даже если функция определена с ключевым словом "inline"). Компилятор не учитывает фактический размер результирующего кода, а пытается прогнозировать его. Для ассемблерных вставок прогнозирование делается на основе числа переводов строк ("\n") и разделителей (";") в исходном тексте.

Логика подобного расчёта связана с допуском, что одна строка представляет собой одну ассемблерную инструкцию. Но при этом не учитываются ситуации, когда в ассемблерных вставках применяется большое число директив для вычислений, несколько строк которых в результате приводят к генерации лишь одной небольшой инструкции. Подобная особенность может приводить к таким казусам как снижение производительности при добавлении несущественных макросов. Некоторые разработчики отмечают влияние на inline-развёртывание в новых версиях GCC даже замены символов табуляции на пробелы.

Разница в производительности особенно бросается в глаза для функций с ассемблерными вставками, для которых добавляется излишняя обёртка вместо прямой подстановки нескольких указанных в функции инструкций. В ядре Linux проблему представляют компактные функции с макросами WARN(), для которых оказалось, что не выполняется ожидаемая inline-оптимизация.

Автор исследования делает вывод, что требуется создание новых средств для контроля за поведением расширенных возможностей компилятора и анализа эффективности результирующих исполняемых файлов. В настоящее время единственным способом убедиться, что код сгенерирован именно так как рассчитывал разработчик остаётся ручное инспектирование итоговых машинных инструкций.

  1. Главная ссылка к новости (https://news.ycombinator.com/i...)
  2. OpenNews: Оптимизация кода компилятором может привести к появлению проблем безопасности в приложениях
  3. OpenNews: Линус Торвальдс выступил с резкой критикой GCC 4.9.0
  4. OpenNews: В DNS-сервере BIND устранен серьёзный сбой, возникший из-за изменений в оптимизаторе GCC
  5. OpenNews: Разработчики Mozilla столкнулись с проблемой производительности в GCC 4.5
  6. OpenNews: Обзор проблем в коде на C/C++, вызванных неопределённым поведением компилятора
Лицензия: CC-BY
Тип: Тема для размышления
Ключевые слова: gcc, optimization
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение Ajax/Линейный | Раскрыть все сообщения | RSS
 
  • 1.1, Аноним (1), 11:13, 09/10/2018 [ответить] [показать ветку] [···]     [к модератору]
  • –7 +/
    GCC теперь Apple пишет Мы знаем лучше что вам надо ... весь текст скрыт [показать]
     
     
  • 2.5, пох (?), 11:30, 09/10/2018 [^] [ответить]    [к модератору]  
  • +8 +/
    inline _всегда_ был _хинтом_ компилятору, что вот это вот имеет смысл попробовать сделать inline, а не директивным указанием. Точно так же как пресловутый register в определении переменных.

    > GCC теперь Apple пишет? "Мы знаем лучше что вам надо"?

    apple занят, он пишет llvm, и у него все хорошо с инлайнами (кроме несовместимости очень старого gcc кода). Проблема гнутых обезьянок в том, что они как раз не знают лучше, и добавили нечеловеческой логики в это незнание.

     
     
  • 3.69, Аноним (-), 10:10, 12/10/2018 [^] [ответить]     [к модератору]  
  • +/
    Register так вообще считается deprecated, в плюсах им вообще пользоваться не сле... весь текст скрыт [показать]
     
     
  • 4.74, пох (?), 10:24, 12/10/2018 [^] [ответить]     [к модератору]  
  • +/
    смотря на какой архитектуре в остальных случаях компилятор и сам догадается, ч... весь текст скрыт [показать]
     
  • 4.77, Аноним (77), 12:07, 12/10/2018 [^] [ответить]     [к модератору]  
  • +/
    я проверял, у меня он догадывался на простом счётчике для перебора массива тольк... весь текст скрыт [показать]
     
  • 4.78, Аноним (78), 14:04, 12/10/2018 [^] [ответить]     [к модератору]  
  • +/
    Да-да Давеча вот такое видел от GCC 8 warning ISO C 17 does not allow 8216... весь текст скрыт [показать]
     
  • 2.14, Аноним (14), 12:47, 09/10/2018 [^] [ответить]    [к модератору]  
  • +2 +/
    Это зачатки ИИ :-) , в среднем хорошо но в отдельных местах...
     
     
  • 3.56, Аноним (56), 11:36, 10/10/2018 [^] [ответить]    [к модератору]  
  • +/
    ... и если приблизить, то мы увидим 12 новых if.
     
  • 1.3, eganru (?), 11:14, 09/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    можно делать __attribute__((always_inline)), если требуется всегда inline.

    [i]настоящее время единственным способом убедиться, что код сгенерирован именно так как рассчитывал разработчик остаётся ручное инспектирование итоговых машинных инструкций. [/i] - единственный способ понять, правильно ли сгенерировалось - посмотреть асм листинг. по моему опыту значительная часть разработчиков не будут читать листинг.

     
     
  • 2.10, Аноним (10), 11:51, 09/10/2018 [^] [ответить]    [к модератору]  
  • –3 +/
    автор статьи там написал, почему always_inline - не решение проблемы. Но вы, конечно, ее не читали
     
     
  • 3.29, eganru (?), 14:24, 09/10/2018 [^] [ответить]     [к модератору]  
  • +2 +/
    читал Вы не читали или не разобрались в сути вопроса случаи там рассмотренные ... весь текст скрыт [показать]
     
  • 3.33, Аноним (78), 15:01, 09/10/2018 [^] [ответить]    [к модератору]  
  • +/
    А вы так усердно читали, что мысленно вписали в статью того, чего там нет. :)
     
  • 1.4, Аноним (4), 11:21, 09/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +16 +/
    Нужно новое ключевое слово really_inline.
     
     
  • 2.7, eganru (?), 11:32, 09/10/2018 [^] [ответить]    [к модератору]  
  • –2 +/
    [i]Нужно новое ключевое слово really_inline.[/i] - кому нужно-то? Вы можете сделать inline силой с помощью атрибута. только в 9 случаях из 10 это не нужно.
     
  • 2.8, Аноним (8), 11:38, 09/10/2018 [^] [ответить]    [к модератору]  
  • +/
    __attribute__((always_inline))
     
     
  • 3.12, Аноним (4), 12:19, 09/10/2018 [^] [ответить]    [к модератору]  
  • +/
    Нестандартненько.
     
  • 2.24, Аноним (24), 14:00, 09/10/2018 [^] [ответить]    [к модератору]  
  • +4 +/
    в_натуре(__inline__)

    :)

     
     
  • 3.54, Аноним (54), 09:50, 10/10/2018 [^] [ответить]    [к модератору]  
  • –1 +/
    без_базара(--inline__)
     
  • 1.6, пох (?), 11:32, 09/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +32 +/
    "примечательно", что этот пакистанец, кажется, на самом деле тестировал свои оптимизации на предмет реально ли они оптимизируют.
    Вот это - действительно неожиданный ход.

     
     
  • 2.66, J.L. (?), 12:36, 11/10/2018 [^] [ответить]     [к модератору]  
  • +/
    теперь я знаю чем пакистан от индии отличаются, раньше я их не различал... весь текст скрыт [показать]
     
     
  • 3.67, Аноним (78), 14:44, 11/10/2018 [^] [ответить]    [к модератору]  
  • +/
    > теперь я знаю чем пакистан от индии отличаются, раньше я их не
    > различал

    Индусы рисуют красную точку на лбу, а паки проверяют оптимизацию компилятора.

     
  • 3.75, пох (?), 10:28, 12/10/2018 [^] [ответить]     [к модератору]  
  • +/
    в Индии помимо Кумаров тоже встречаются всякие Джавахарлалы, первые делают тупен... весь текст скрыт [показать]
     
  • 2.68, voleg (?), 22:49, 11/10/2018 [^] [ответить]    [к модератору]  
  • +/
    Израиль не Пакистан. А мужичек сам в штатах.
     
  • 1.9, ыы (?), 11:43, 09/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +13 +/
    "
    Влияние числа переводов строк и разделителей в исходном тексте программ на быстродействие скомпилированного кода
    "

    Эпично.


     
     
  • 2.15, Аноним (14), 12:49, 09/10/2018 [^] [ответить]    [к модератору]  
  • +1 +/
    ИИ в компиляторах...
     
  • 2.22, Аноним84701 (ok), 13:41, 09/10/2018 [^] [ответить]    [к модератору]  
  • +7 +/
    > Эпично.

    Вы явно недооцениваете "взрывно-поджигательный" потенциал предложения:
    > "влияние на inline-развёртывание в новых версиях GCC даже замены символов табуляции на пробелы."
    > identical functions that used spaces instead of tabs could run significantly slower because they weren't inlined.

    в любом сра^W обсуждении на опеннете новости о  питоне (или чем-то питоноподобном), где примерно 2/3 комментариев рассматривают (не)допустимость ущемления прав разработчика на свободное оформление кода, глубинную (не)правильность влияния пробелов на семантику ЯП (и общее  влияние на интеллект, сексуальные пристрастия или некоторые анатомические детали, вроде кривизны или места крепления верхних конечностей).

     
     
  • 3.44, Аноним (44), 18:19, 09/10/2018 [^] [ответить]    [к модератору]  
  • +/
    > глубинную (не)правильность влияния пробелов на семантику ЯП

    На семантику оно и не влияет.

     
     
  • 4.49, Аноним84701 (ok), 21:04, 09/10/2018 [^] [ответить]     [к модератору]  
  • +1 +/
    Даже если бы и не влияло что не так 0 -- таки уп0pно обуждают Из недавнего ... весь текст скрыт [показать]
     
     
  • 5.82, Аноним (44), 19:10, 15/10/2018 [^] [ответить]    [к модератору]  
  • +/
    При чем здесь питон? Речь про C/C++.
     
  • 3.52, Акакжев (?), 06:43, 10/10/2018 [^] [ответить]     [к модератору]  
  • +/
    private windows media avi verinfo 16 verinfo h CODE ... весь текст скрыт [показать]
     
  • 1.11, IRASoldier (?), 12:18, 09/10/2018 [ответить] [показать ветку] [···]     [к модератору]  
  • –8 +/
    Мне вот интересно, какому умному человеку пришло в голову внести в gcc т н GN... весь текст скрыт [показать]
     
     
  • 2.18, Акакжев (?), 13:05, 09/10/2018 [^] [ответить]    [к модератору]  
  • +1 +/
    Тому, кто потом в Комитете принимает решения по следующему Стандарту, куда расширения языка постепенно включаются.
     
     
  • 3.20, IRASoldier (?), 13:24, 09/10/2018 [^] [ответить]    [к модератору]  
  • –2 +/
    Приведенный пример с массивами - это не расширение языка, это радикальное изменение.
     
  • 2.23, анонимный анонимус2 (?), 13:45, 09/10/2018 [^] [ответить]    [к модератору]  
  • +1 +/
    Это расширение только для С++, для С99 это стандарт.
     
     
  • 3.27, IRASoldier (?), 14:10, 09/10/2018 [^] [ответить]    [к модератору]  
  • –2 +/
    А в C11 опять VLA не одобряэ... Путаники-с.
     
  • 2.26, Alex (??), 14:05, 09/10/2018 [^] [ответить]    [к модератору]  
  • +4 +/
    не статического массива а массива на стеке, дятел. Разница в том что это довольно просто реализовать, удобно, и не ломает язык. И да, это входит в c99 сейчас, наверняка войдет и в c++2x
     
     
  • 3.28, IRASoldier (?), 14:15, 09/10/2018 [^] [ответить]     [к модератору]  
  • –6 +/
    От дятла слышу Всю жизнь использовали в повседневной речи - статический и про... весь текст скрыт [показать]
     
     
  • 4.30, Аноним (30), 14:26, 09/10/2018 [^] [ответить]    [к модератору]  
  • +2 +/
    ПОловина софта не проверяет даже malloс на NULL...
     
  • 4.34, Аноним (34), 15:12, 09/10/2018 [^] [ответить]    [к модератору]  
  • +3 +/
    Любое использование стека может привести к UB. На деле, кому надо обрабатывают SIGSEGV, а остальным плевать
     
  • 4.35, Аноним (78), 15:12, 09/10/2018 [^] [ответить]     [к модератору]  
  • +5 +/
    Это справедливо также если размер массива определяется во время компиляции Комп... весь текст скрыт [показать]
     
  • 4.37, Акакжев (?), 15:20, 09/10/2018 [^] [ответить]    [к модератору]  
  • +6 +/
    > Всю жизнь использовали в повседневной речи - "статический" и продолжают использовать.

    "Объекты c [I]static storage duration[/I] инициализируются до [I]program startup[/I]."

     
  • 4.38, Омоним (?), 16:23, 09/10/2018 [^] [ответить]     [к модератору]  
  • +5 +/
    Игнорируя, что в общепринятом смысле динамичность статичность относятся не к... весь текст скрыт [показать]
     
     
  • 5.47, IRASoldier (?), 19:46, 09/10/2018 [^] [ответить]    [к модератору]  
  • –2 +/
    Не "игнорируя", а просто используя в определенном, заранее подразумеваемом контексте.
     
     
  • 6.48, Аноним (44), 19:52, 09/10/2018 [^] [ответить]    [к модератору]  
  • +2 +/
    Кем подразумеваемом? В каком контексте? "Статический массив" - вполне допустимое выражение, которое значит совсем не то, что "массив на стеке".
     
  • 3.81, 0xd34df00d (??), 03:28, 13/10/2018 [^] [ответить]    [к модератору]  
  • –1 +/
    > наверняка войдет и в c++2x

    Оно не войдет в C++ никогда, ибо ломает систему типов рядом с темплейтами.

     
  • 2.70, Аноним (-), 10:13, 12/10/2018 [^] [ответить]     [к модератору]  
  • +/
    Вообще-то это часть стандарта C с 99 года аж Туда же и всякие variable args... весь текст скрыт [показать]
     
     
  • 3.76, Andrey Mitrofanov (?), 10:32, 12/10/2018 [^] [ответить]     [к модератору]  
  • +/
    Некоторые уже напользовались -- избавиться никак не могут Старик Крупский, вот... весь текст скрыт [показать]
     
  • 1.13, Аноним (13), 12:23, 09/10/2018 [ответить] [показать ветку] [···]     [к модератору]  
  • +1 +/
    Ну так одно другому не мешает и бенмарки неплохо бы иметь А то выйдет новая-кле... весь текст скрыт [показать]
     
  • 1.16, Акакжев (?), 12:53, 09/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • –1 +/
    Теория:

    -O turns on the following optimization flags:
    ...
    -fomit-frame-pointer

    Практика:

    0xffffffff817929e0 <+0>: push   %rbp
    ...
    0xffffffff817929ee <+14>: pop    %rbp
    0xffffffff817929ef <+15>: retq  

     
     
  • 2.21, Аноним (21), 13:34, 09/10/2018 [^] [ответить]     [к модератору]  
  • –1 +/
    Данной оптимизация отключена, поскольку обратная опция находится в зависимостях ... весь текст скрыт [показать]
     
     
  • 3.31, Акакжев (?), 14:37, 09/10/2018 [^] [ответить]     [к модератору]  
  • +/
    По поводу других в документации сказано Omit the frame pointer in functions ... весь текст скрыт [показать]
     
  • 3.59, Himik (ok), 19:26, 10/10/2018 [^] [ответить]    [к модератору]  
  • –1 +/
    push %rbp и pop %rbp не имеют ни какого отношения к стеку, это просто сохранение регистра для использования в вычислениях функции. Раньше rbp использовался для буфера в стеке, теперь нет.
     
     
  • 4.64, Акакжев (?), 08:32, 11/10/2018 [^] [ответить]     [к модератору]  
  • +/
    Вот подпрограмма целиком CODE 0xffffffff817929e0 0 push rbp 0xffffffff... весь текст скрыт [показать]
     
  • 1.19, z (??), 13:11, 09/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • –5 +/
    И эти люди ещё ругают MSVC за изначальный отказ от inline-инструкций в x86_64 как класса =)
     
     
  • 2.71, Аноним (-), 10:17, 12/10/2018 [^] [ответить]     [к модератору]  
  • +/
    Дык msvc и C99 не особо поддерживает Там народ недавно нашел брутальные факапы ... весь текст скрыт [показать]
     
  • 1.32, Анониметс (?), 14:39, 09/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • –4 +/
    Кто все эти люди, что это за язык? Ни одного слова не понял ни из комментов, ни из статьи. Чьто это? Где я?)
     
     
  • 2.36, Аноним (78), 15:15, 09/10/2018 [^] [ответить]    [к модератору]  
  • –1 +/
    Это GCC, братан
     
  • 2.39, Аноним (39), 16:40, 09/10/2018 [^] [ответить]    [к модератору]  
  • –1 +/
    Ну раз речь о ядре Линукса, то догадайся)
     
     
  • 3.41, Аноним84701 (ok), 17:03, 09/10/2018 [^] [ответить]     [к модератору]  
  • +1 +/
    Кто ж его знает -- может у него сейчас 2088, ядро в третий раз переписали, в GCC... весь текст скрыт [показать]
     
  • 2.42, Аноним (42), 17:06, 09/10/2018 [^] [ответить]    [к модератору]  
  • +/
    Assembly Language
    GCC – GNU Compiler Collection
    Про инлайнинг сами попгуглите.
     
  • 2.60, Himik (ok), 19:32, 10/10/2018 [^] [ответить]    [к модератору]  
  • –1 +/
    GNU C Compiler = GCC.
    Не путать с GNU Compiler Collection, такого языка программирования нет.
     
  • 1.40, Cradle (?), 16:48, 09/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • –1 +/
    немного не в тему, но может кто подскажет, такая проблемка: использую arm-none-eabi-gcc-7.2.1 с cmake , и результаты оптимизации как-то сильно зависят от cmake кэша, процентов на 10 размер бинарника разный выходит, при том что реально разные варианты кода в пределах тех же самых функций получаются, проверял ассемлерные дампы. Пока лечится стиранием директории CMakeFiles, но может есть более умное решение?
     
     
  • 2.61, Himik (ok), 19:36, 10/10/2018 [^] [ответить]    [к модератору]  
  • +/
    Не знаю точно, но может быть поможет export LDFLAGS='-s'
    чтобы вырезалась (strip) служебная информация из конечного результата.
     
     
  • 3.63, Cradle (?), 20:53, 10/10/2018 [^] [ответить]    [к модератору]  
  • +/
    нет, дело не в этом, я сравниваю дампы и размер бинарника уже после strip. На функцинальность эта проблема особо не влияет, но пока работаю над кодом в течении дня к бинарнику несколько кб мусора приростает. Приходится каждый раз когда нужно узнать точный размер или коллегам прошивку передать стирать CMakeFiles и пересобирать начисто.
     
     
  • 4.65, Sfinx (ok), 11:07, 11/10/2018 [^] [ответить]    [к модератору]  
  • +/
    включаешь verbose и смотришь опции компиляции или включаешь -frecord-gcc-switches и смотришь в бинарнике до стрипа.
     
  • 1.43, Аноним (43), 18:08, 09/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +1 +/
    Линус недавно устроил голвомойку разработчикам GCC за глюки в версии 4.9, кажется. Похоже, пора устроить её снова!
     
     
  • 2.45, Аноним (45), 18:56, 09/10/2018 [^] [ответить]    [к модератору]  
  • –1 +/
    А то что? На шланг перейдёт? Ну наконец-то в ядро примут патчи совместимости со шлангом.
     
     
  • 3.46, KonstantinB (ok), 19:09, 09/10/2018 [^] [ответить]    [к модератору]  
  • –1 +/
    Или clang достигнет критического уровня совместимости с расширениями gcc.
    Собственно, уже большая часть кода ядра прекрасно собирается.
     
     
  • 4.72, Аноним (-), 10:19, 12/10/2018 [^] [ответить]    [к модератору]  
  • +/
    > Собственно, уже большая часть кода ядра прекрасно собирается.

    "Немножечко беременна".

     
  • 1.50, Дуплик (ok), 02:16, 10/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • –1 +/
    Скорее бы Linux портировали на Clang/LLVM.
     
     
  • 2.62, Himik (ok), 19:38, 10/10/2018 [^] [ответить]    [к модератору]  
  • +1 +/
    Нет, уж лучше старые глюки, чем новые.
     
  • 2.73, Аноним (-), 10:21, 12/10/2018 [^] [ответить]     [к модератору]  
  • +/
    Мечтаешь увидеть проприерасские SDK к железкам, где даже сорц компилера зажали ... весь текст скрыт [показать]
     
  • 1.51, Аноним (51), 03:04, 10/10/2018 [ответить] [показать ветку] [···]     [к модератору]  
  • –3 +/
    При чем тут gcc вообще Коммент по ссылке про v8 движок JavaScript ... весь текст скрыт [показать]
     
     
  • 2.53, Аноним (53), 06:51, 10/10/2018 [^] [ответить]     [к модератору]  
  • +/
    Там речь про GCC v8 А в этом же комментарии упоминание v5 9 тогда про какой дви... весь текст скрыт [показать]
     
     
  • 3.57, Аноним (56), 11:45, 10/10/2018 [^] [ответить]    [к модератору]  
  • +/
    Web Assembly? Он вроде позваляет на любом языке писать.
     
     
  • 4.58, Himik (ok), 19:21, 10/10/2018 [^] [ответить]    [к модератору]  
  • +1 +/
    Web Assembly в Linux kernel?
     
     
  • 5.80, sage (??), 19:34, 12/10/2018 [^] [ответить]    [к модератору]  
  • +/
    Да. https://github.com/rianhunter/wasmjit
     
  • 3.83, Аноним (44), 19:15, 15/10/2018 [^] [ответить]    [к модератору]  
  • +/
    JavaScript движок под названием V8, версия движка 5.9. Что не понятно?
     
  • 3.84, Аноним (44), 19:43, 15/10/2018 [^] [ответить]     [к модератору]  
  • +/
    V8 генерирует машинный код При этом часть функций инлайнится, так же как и при ... весь текст скрыт [показать]
     
  • 1.79, Andrey Mitrofanov (?), 17:34, 12/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Удивиился, что не Фороникс,
       https://lwn.net/Articles/767884/rss
    обнаружив сабж на.

    Бывает же?!

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:


      Закладки на сайте
      Проследить за страницей
    Created 1996-2018 by Maxim Chirkov  
    ДобавитьПоддержатьВебмастеруГИД  
    Hosting by Ihor