<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Релиз набора компиляторов LLVM 11.0 </title>
    <link>https://www.opennet.ru/openforum/vsluhforumID3/122094.html</link>
    <description>После шести месяцев разработки представлен релиз проекта LLVM 11.0 - GCC-совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизаций). Сгенерированный псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы...&lt;br&gt;&lt;br&gt;Подробнее: https://www.opennet.ru/opennews/art.shtml?num=53874&lt;br&gt;</description>

<item>
    <title>Релиз набора компиляторов LLVM 11.0  (Andrey_Karpov)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID3/122094.html#89</link>
    <pubDate>Tue, 27 Oct 2020 12:03:52 GMT</pubDate>
    <description>Не мог пройти мимо и не потыкать палочкой :)&lt;br&gt;Проверка Clang 11 с помощью PVS-Studio - https://habr.com/ru/company/pvs-studio/blog/525248/&lt;br&gt;</description>
</item>

<item>
    <title>Релиз набора компиляторов LLVM 11.0  (n00by)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID3/122094.html#88</link>
    <pubDate>Wed, 21 Oct 2020 09:44:10 GMT</pubDate>
    <description>&amp;gt; Как насчёт pgo? Все эти ручные твики на редкость не универсальны. А &lt;br&gt;&amp;gt; сам компилятор туп, как пробка. Поэтому ему нужны статы для эффективной &lt;br&gt;&amp;gt; оптимизации, шланг уделает.&lt;br&gt;&lt;br&gt;В данном конкретном случае Clang (безо всяких твиков!) выполнил во время трансляции то что происходит при профилировке. Посчитал количество вызовов нескольких мелких функций (они все вызываются в циклах) и тело самой часто вызываемой подставил в место вызова. &lt;br&gt;&lt;br&gt;&amp;gt; А lto в целом вещь довольно бесполезная (практически). &lt;br&gt;&lt;br&gt;Её не от нечего делать прикрутили. Лет 15 назад на паре call+ret была сушественная просадка по скорости, потому инлайн мелких функций из другой единицы трансляции давал заметный выигрыш.&lt;br&gt;</description>
</item>

<item>
    <title>Релиз набора компиляторов LLVM 11.0  (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID3/122094.html#87</link>
    <pubDate>Wed, 21 Oct 2020 07:51:31 GMT</pubDate>
    <description>Как насчёт pgo? Все эти ручные твики на редкость не универсальны. А сам компилятор туп, как пробка. Поэтому ему нужны статы для эффективной оптимизации, шланг уделает. А lto в целом вещь довольно бесполезная (практически).&lt;br&gt;</description>
</item>

<item>
    <title>Релиз набора компиляторов LLVM 11.0  (n00by)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID3/122094.html#86</link>
    <pubDate>Sun, 18 Oct 2020 05:46:25 GMT</pubDate>
    <description>Ну да, я не понял, какое отношение имеет оптимизация графа вызовов (когда оптимизатор на основании количества вызовов решает, что вот этот вызов функции надо заинлайнить, а вон те - не надо) к целевому коду и его внутреннему представлению? &lt;br&gt;</description>
</item>

<item>
    <title>Релиз набора компиляторов LLVM 11.0  (n00by)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID3/122094.html#85</link>
    <pubDate>Sun, 18 Oct 2020 05:38:14 GMT</pubDate>
    <description>&amp;gt; Вероятно, она объявлена не static и visibilty для DSO оставлен по-умолчанию, что &lt;br&gt;&amp;gt; заставляет GCC допускать возможность переопределения функции в другом DSO.&lt;br&gt;&lt;br&gt;Проверил гипотезу так:&lt;br&gt;объявил задействованные функции как static inline;&lt;br&gt;включил #include *.c с их определением в одну единицу трансляции, откуда происходит вызов;&lt;br&gt;добавил к -flto вот такое: -finline-limit=200000 --param inline-unit-growth=10000 -fwhole-program&lt;br&gt;&lt;br&gt;Не инлайнит.&lt;br&gt;&lt;br&gt;Clang инлайнит с -flto и без вышеуказанных манипуляций.&lt;br&gt;&lt;br&gt;&#091;code&#093;&lt;br&gt;// сюда передаётся указатель на функцию, и отсюда осуществляется вызов.&lt;br&gt;/**&lt;br&gt; * &#092;param painter   изменяет цвет вершин, либо NULL для раскрашивания в базовый цвет&lt;br&gt; */&lt;br&gt;static inline&lt;br&gt;void poly_draw(const struct polygon *p, struct vec4 coordinate,&lt;br&gt;               fn_painter painter, struct color color, struct draw_ctx *restrict ctx);&lt;br&gt;&lt;br&gt;// вот на что передаётся указатель&lt;br&gt;static inline __attribute__((always_inline))&lt;br&gt;void colorer(struct vertex *restrict vert, struct color src, unsigned i)&lt;br&gt;&#123;&lt;br&gt;        i</description>
</item>

<item>
    <title>Релиз набора компиляторов LLVM 11.0  (n00by)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID3/122094.html#84</link>
    <pubDate>Sat, 17 Oct 2020 14:55:19 GMT</pubDate>
    <description>&amp;gt;&amp;gt;&amp;gt;&amp;gt; Т.е не ясно, почему 1й вариант, а не 2й.&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Там четыре варианта в зависимости от целевого ядра.&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Поиграйтесь флагом -march на https://godbolt.org/z/j9q4oG &lt;br&gt;&amp;gt;&amp;gt; &lt;br&gt;&amp;gt;&amp;gt;Так варианты машинного кода не объясняют причину, почему выбрана именно такая. В моём случай &quot;ясно&quot;, это когда я найду что-то вроде: &lt;br&gt;&amp;gt; Ну как-бы очевидно что компилятор руководствуется подобными правилами, которые более-менее &lt;br&gt;&amp;gt; скрупулезно закодированные у него внутри.&lt;br&gt;&lt;br&gt;Так вопрос в том, насколько эти правила адекватны железу. Когда-то мне приходилось писать __asm nop, что бы MSVC не разворачивал цикл. Этот ноп давал +10&#037; скорости.&lt;br&gt;&lt;br&gt;&amp;gt; С явным описанием таких правил у Штеуда достаточно плохо, по многим инструкциям &lt;br&gt;&amp;gt; нет даже базовой информации.&lt;br&gt;&lt;br&gt;А где разработчики GCC их взяли? Может они изучают код после Intel C Compiler, или получают эмпирически? Посмотрел бумажное издание Optimization Manual, там раздел &quot;General Optimization&quot; почти в сотню страниц, а в текущей версии на четверть сокращён (правда, и ядра другие), вероятно, в п</description>
</item>

<item>
    <title>Релиз набора компиляторов LLVM 11.0  (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID3/122094.html#83</link>
    <pubDate>Sat, 17 Oct 2020 14:49:55 GMT</pubDate>
    <description>n00by, erthink, Аноним84701 - втроём полнедели обсуждали обсуждали да таки ничего не поняли.&lt;br&gt;Тсс!!! только не говорите им, что ассемблер синтаксиса AT&amp;T в GCC просто и гениально превращяется в машинный код.&lt;br&gt;</description>
</item>

<item>
    <title>Релиз набора компиляторов LLVM 11.0  (erthink)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID3/122094.html#82</link>
    <pubDate>Fri, 16 Oct 2020 12:45:56 GMT</pubDate>
    <description>&amp;gt;&amp;gt;&amp;gt; Т.е не ясно, почему 1й вариант, а не 2й.&lt;br&gt;&amp;gt;&amp;gt; Там четыре варианта в зависимости от целевого ядра.&lt;br&gt;&amp;gt;&amp;gt; Поиграйтесь флагом -march на https://godbolt.org/z/j9q4oG&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Так варианты машинного кода не объясняют причину, почему выбрана именно такая. В моём случай &quot;ясно&quot;, это когда я найду что-то вроде:&lt;br&gt;&lt;br&gt;Ну как-бы очевидно что компилятор руководствуется подобными правилами, которые более-менее скрупулезно закодированные у него внутри.&lt;br&gt;С явным описанием таких правил у Штеуда достаточно плохо, по многим инструкциям нет даже базовой информации.&lt;br&gt;Если хотите поднатореть в этом больше чем позволяют официальные штеуд-мануалы и (например) рекомендации Agner Fog, то это болезненный и малополезный путь.&lt;br&gt;&lt;br&gt;&amp;gt; Почему GCC не заинлайнил функцию из 5-ти строк, вызываемую из единственного места, загадка.&lt;br&gt;&lt;br&gt;Чудес не бывает.&lt;br&gt;Вероятно, она объявлена не static и visibilty для DSO оставлен по-умолчанию, что заставляет GCC допускать возможность переопределения функции в другом DSO.&lt;br&gt;Либо еще какие-то проблемы с опциями оптимизации</description>
</item>

<item>
    <title>Релиз набора компиляторов LLVM 11.0  (n00by)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID3/122094.html#81</link>
    <pubDate>Fri, 16 Oct 2020 10:07:37 GMT</pubDate>
    <description>&amp;gt;&amp;gt; Т.е не ясно, почему 1й вариант, а не 2й.&lt;br&gt;&amp;gt; Там четыре варианта в зависимости от целевого ядра.&lt;br&gt;&amp;gt; Поиграйтесь флагом -march на https://godbolt.org/z/j9q4oG &lt;br&gt;&lt;br&gt;Так варианты машинного кода не объясняют причину, почему выбрана именно такая. В моём случай &quot;ясно&quot;, это когда я найду что-то вроде:&lt;br&gt;&lt;br&gt;Assembly/Compiler Coding Rule 35. (M impact, ML generality) Use dependency-breaking-idiom&lt;br&gt;instructions to set a register to 0, or to break a false dependence chain resulting from re-use of&lt;br&gt;registers. In contexts where the condition codes must be preserved, move 0 into the register instead.&lt;br&gt;This requires more code space than using XOR and SUB, but avoids setting the condition codes.&lt;br&gt;&lt;br&gt;&amp;gt;&amp;gt; На массиве нулей. А если данные случайны? На каждом одном слове из &lt;br&gt;&amp;gt;&amp;gt; 256, то есть 1/256 такта. При этом кеш инструкций расходуется непропорционально.&lt;br&gt;&amp;gt; Тут &quot;трусы vs крестик&quot;.&lt;br&gt;&amp;gt; Если gcc опросили -Ofast он делает быстрее, если -Os то компактнее.&lt;br&gt;&amp;gt; При необходимости более оптимального решения нужно использовать PGO, либо раз</description>
</item>

</channel>
</rss>
