<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Разработка преобразования code factoring для ПЛИС</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>A.P. Bagly</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Southern Federal University</string-name>
        </contrib>
      </contrib-group>
      <pub-date>
        <year>2010</year>
      </pub-date>
      <volume>17</volume>
      <issue>6</issue>
      <fpage>120</fpage>
      <lpage>126</lpage>
      <abstract>
        <p>Аннотация. Приводятся доводы в пользу высокоуровневого анализа текста на частичные дубликаты для оптимизации синтеза на ПЛИС из программы на языке С. Описываются возможные подходы к такому анализу. Приводится выбранный способ поиска важных фрагментов с фильтрацией результатов через статическое профилирование. Для поиска частично повторяющихся фрагментов используется комбинация методов анализа текста и поиска шаблонов в дереве программы после синтаксического разбора. Статическое профилирование позволяет выбрать фрагменты кода, которые выгодно выполнять на ПЛИС. Представлены результаты анализа кода некоторых тестовых программ. На основе сделанного анализа выбраны требования к разрабатываемому преобразованию программ code factoring для внедрения в состав компилятора с высокоуровневого языка на ПЛИС.</p>
      </abstract>
      <kwd-group>
        <kwd>FPGA</kwd>
        <kwd>code factoring</kwd>
        <kwd>code duplication</kwd>
        <kwd>compiler</kwd>
        <kwd>high-level synthesis</kwd>
        <kwd>optimizing compilation</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>Введение
Синтез программ для ПЛИС по программам на высокоуровневом языке
программирования (например, С) – это в общем случае сложная задача, которая
на данный момент не решается полностью автоматически.</p>
      <p>
        На основе Оптимизирующей распараллеливающей системы [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]
разрабатывается компилятор на ПЛИС с языка С [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. Поскольку ОРС обладает
набором оптимизирующих преобразований программ, типичных для
современных компиляторов, то интересной выглядит идея их использования
для улучшения параметров получаемых схем, например их размера (для
возможности размещения на ПЛИС).
      </p>
      <p>Целью высокоуровневых оптимизирующих преобразований программ
обычно являются:
1. Уменьшение времени работы программы
2. Уменьшения объема ее кода
3. Ускорение работы программы с памятью
Эти параметры для каждой программы влияют друг на друга нетривиальным
образом. В это время, оптимизация синтеза на ПЛИС может включать большее
число параметров, например:
1. Число задействованных элементов разных типов
2. Максимальная частота работы схемы
3. Задействованная пропускная способность памяти
4. Энергопотребление</p>
      <p>Каким образом преобразования высокоуровневой программы повлияют
на параметры созданной по ней схемы для ПЛИС заранее не известно и зависит
во многом от используемых инструментов.</p>
      <p>
        Постановка задачи
Возможно провести прямые параллели между оптимизацией параметров
схем для ПЛИС и оптимизацией программ компиляторами на примере
встраивания процедур в место вызова (инлайнинга). Частая задача для
компиляторов – поиск баланса между инлайнингом и использованием вызовов
подпрограмм в неизменном виде. Инлайнинг устраняет накладные расходы на
вызов подпрограммы, но увеличивает объем кода за счет его дублирования.
Рост объема кода может привести к промахам в кэше инструкций и
уменьшению производительности. Методам выбора функций для инлайнинга
посвящено множество работ, например [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], где кроме этого используется
обратное преобразование – outlining, которое преобразует участок кода в
функцию.
      </p>
      <p>Дополнительная проблема, усложняющая решение задачи по инлайнингу
и аутлайнингу кода – наличие полностью или частично повторяющихся
фрагментов кода, которые не выделены в отдельные подпрограммы.
При переходе к ПЛИС указанные проблемы сохраняются, но проблема
повторяющихся фрагментов кода встает более остро, так как они напрямую
влияют на размер полученной схемы. Поэтому стоит задача проверки подхода
оптимизации параметров ПЛИС за счет поиска частично повторяющихся
фрагментов кода и их преобразований.</p>
      <p>
        Целью исследований является проверка актуальности создания
преобразования code factoring для высокоуровневого внутреннего
представления, аналогичного преобразованию, используемому в современных
компиляторах в низкоуровневом представлении [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].
      </p>
      <p>
        Методы
Если стоит задача уменьшения объема используемых ресурсов ПЛИС, то
потенциальные источники кода, подлежащего оптимизации - это:
1. Часто вызываемые функции,
2. Полностью продублированные фрагменты кода
3. Частично продублированные фрагменты кода, и отдельные
выражения
В случае 3 возможно использование ранее описанных методов [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
Полное или частичное дублирование исходного кода программ
неизбежное явление. Дублированию могут подвергаться целые файлы, функции
или отдельные фрагменты кода. Исследование [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] демонстрирует возможность
анализа очень большого объема исходного кода на дублирование.
      </p>
      <p>В применении к высокоуровневому синтезу на ПЛИС может быть
интересно частичное или полное дублирование коротких участков кода,
выполняющих относительно большой объем вычислений.</p>
      <p>
        Выбор участков кода для отображения на ПЛИС может производиться по
результатам профилирования программы [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] или статического анализа [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]
(статического профилирования). Профилирование на реальных входных
данных дает точные данные о времени, уходящем на выполнение каждой
функции или оператора программы, но оно может быть ресурсоемким и не
всегда доступным способом анализа времени выполнения. Статическое
профилирование может дать удовлетворительные результаты для некоторого
подкласса программ за меньшее время.
      </p>
      <p>
        Предлагаемое решение
Для проверки перспективности предлагаемого подхода были
скомбинированы методы поиска похожих фрагментов [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] и статического
профилирования. Статическое профилирование используется нами для
отсеивания неинтересных для оптимизации фрагментов из тех, которые были
найдены при анализе текста на дубликаты.
      </p>
      <p>
        Для проверки возможного эффекта от оптимизаций целесообразно
проанализировать исходный код программ, которые предназначены для
отображения на ПЛИС средствами высокоуровневого синтеза. Для синтеза на
ПЛИС существуют несколько общепринятых наборов таких программ
(бенчмарков), специально собранных для оценки эффектов от новых
оптимизаций. Например, наборы CHStone [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] и Rosetta [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] содержат
достаточный объем исходного кода программ из разных предметных областей.
Результаты
Для проверки разрабатываемых методов был использован исходный код
программ бенчмарка CHStone [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. Для поиска участков кода, представляющих
интерес для оптимизации, использовался простой порог на число
вычислительных операций (арифметических, логических) во фрагменте кода.
Программа
всего
строк
фрагментов
      </p>
      <p>%
похожих</p>
      <p>строк
3d-rendering
3836
9
2%</p>
      <p>%
похожих похожих
строк строк</p>
      <p>всего
72 86%
Похожих
строк
всего
3300
BNN 14203 358 27% 3880 46% 6562
digit 433 5 5% 21 8% 34
recognition
Face detection 1490 14 7% 102 54% 806
harness 753 12 22% 167 27% 206
Optical flow 2404 46 21% 501 38% 930
Spam filter 2541 9 5% 132 83% 2223
Таблица 1. Результаты анализа текста программ CHStone. Помечены
результаты по похожим фрагментам больше порога.</p>
      <p>Использованный метод позволяет быстро проанализировать большой
объем кода, что даст возможность точнее оценить перспективы для
оптимизации за счет анализа большого числа программ, ускоряемых с
помощью ПЛИС.</p>
      <p>С помощью стандартного профилирования программ бенчмарка CHStone
с использованием профилировщика gprof [14] было обнаружено, что в 50%
случаев «горячие участки» программы включали в себе найденные
повторяющиеся фрагменты, например, в программе AES:
Был найден следующий фрагмент кода, повторяющийся 4 раза с
небольшими модификациями (другими значениями констант).</p>
      <p>
        После того, как такие фрагменты кода были найдены в исходной
программе, возможно их преобразование в функцию. Это можно сделать в 2
этапа:
1. Преобразовать все частично продублированные фрагменты в
полностью продублированные и добавленный к ним код,
присваивающий значения вспомогательным переменным. Для этого
можно использовать методы из [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]
2. Преобразовать все копии продублированных фрагментов в вызовы
новой функции, что можно сделать автоматически с помощью ОРС.
Эти преобразования программы призваны помочь работе инструментов
высокоуровневого синтеза для ПЛИС.
      </p>
      <p>Перспективы
Среди современных подходов к автоматическому программированию
ПЛИС стоит выделить, кроме средств высокоуровневого синтеза, средства
параллельной разработки программного и аппаратного обеспечения (co-design),
которые могут занимать промежуточное положение между полностью
автоматическим синтезом схемы на ПЛИС по высокоуровневой программе и
ручным программирование ПЛИС на низкоуровневом языке. Co-design
позволяет, например, использовать готовые архитектуры процессоров в виде
схемы на ПЛИС, к которым добавляются новые инструкции, поддерживаемые
компилятором, для ускорения работы целевой программы. Среди таких средств
можно выделить систему [15] использующую упрощенную VLIW-архитектуру.
Возможно применение описанных выше методов для поиска участков кода
кандидатов в дополнительные инструкции для подобных архитектур.
Выводы
Проверены методы быстрого анализа большого объема исходного кода
для проверки потенциала оптимизации схем ПЛИС за счет частично или
полностью продублированных фрагментов кода. Полученные результаты
свидетельствуют об актуальности разработки преобразования code factoring в
высокоуровневом внутреннем представлении для использования в составе
компилятора с языка С.</p>
      <p>Работа выполнена при поддержке Российского фонда фундаментальных
исследований, проект 18-37-00179\18.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1. “Optimiziruiushchaia rasparallellivaiushchaia sistema”
          <year>2018</year>
          . www.ops.rsu.ru. [date of access:
          <fpage>28</fpage>
          -May-2018].
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>B. Y.</given-names>
            <surname>Steinberg</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. P.</given-names>
            <surname>Bugliy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. V.</given-names>
            <surname>Dubrov</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y. V.</given-names>
            <surname>Mikhailuts</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O. B.</given-names>
            <surname>Steinberg</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R. B.</given-names>
            <surname>Steinberg</surname>
          </string-name>
          , “
          <article-title>A Project of Compiler for a Processor with Programmable Accelerator</article-title>
          ,” in Procedia Computer Science,
          <year>2016</year>
          , vol.
          <volume>101</volume>
          , pp.
          <fpage>435</fpage>
          -
          <lpage>438</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>P.</given-names>
            <surname>Zhao</surname>
          </string-name>
          and
          <string-name>
            <given-names>J. N.</given-names>
            <surname>Amaral</surname>
          </string-name>
          , “
          <article-title>Function Outlining</article-title>
          and Partial Inlining,
          <source>” 17th Int. Symp. Comput. Archit. High Perform. Comput.</source>
          , pp.
          <fpage>101</fpage>
          -
          <lpage>108</lpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4. G. Lóki, Á. Kiss,
          <string-name>
            <given-names>J.</given-names>
            <surname>Jász</surname>
          </string-name>
          , and Á. Beszédes, “Code Factoring in
          <string-name>
            <surname>GCC</surname>
          </string-name>
          ,
          <source>” Proc. 2004 GCC Dev</source>
          . Summit, no.
          <source>June</source>
          ,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>A. P.</given-names>
            <surname>Baglii</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. V.</given-names>
            <surname>Dubrov</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Ia</surname>
          </string-name>
          . Shteinberg, and
          <string-name>
            <given-names>R. B.</given-names>
            <surname>Shteinberg</surname>
          </string-name>
          , “
          <article-title>Povtornoe ispolzovanie resursov pri konveiernykh vychisleniiakh,” in Nauchnyi servis v seti Internet: trudy XIX Vserossiiskoi nauchnoi konferentsii</article-title>
          ,
          <year>2017</year>
          , s.
          <fpage>43</fpage>
          -
          <lpage>46</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>C. V.</given-names>
            <surname>Lopes</surname>
          </string-name>
          et al.,
          <article-title>“DéjàVu: a map of code duplicates on GitHub,”</article-title>
          <source>Proc. ACM Program. Lang.</source>
          , vol.
          <volume>1</volume>
          , no.
          <source>OOPSLA</source>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>28</lpage>
          ,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>J. G.</given-names>
            <surname>Tong</surname>
          </string-name>
          , “
          <article-title>Software profiling for an FPGA-based CPU core</article-title>
          ,”, thesis, University of Windsor 2007.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>S. V.</given-names>
            <surname>Poluian</surname>
          </string-name>
          , “
          <article-title>Profilirovanie i ego primenenie v dialogovom optimiziruiushchem rasparallelivatele,” Nauchnyi servis v seti Internet: superkompiuternye tsentry i zadachi: Trudy Mezhdunarodnoi superkompiuternoi konferentsii</article-title>
          ,
          <year>2010</year>
          , pp.
          <fpage>652</fpage>
          -
          <lpage>653</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>D.</given-names>
            <surname>Grune</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Huntjens</surname>
          </string-name>
          , “
          <article-title>Het detecteren van kopieen bij informatica-practica,” Informatie</article-title>
          , vol.
          <volume>31</volume>
          , no.
          <issue>11</issue>
          . pp.
          <fpage>864</fpage>
          -
          <lpage>867</lpage>
          ,
          <year>1989</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10. F. Ma, “
          <article-title>On the Study of Tree Pattern Matching Algorithms</article-title>
          and Applications,” University Of British Columbia,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11. “
          <article-title>CHStone benchmark for FPGA high-level synthesis tools</article-title>
          ,”
          <year>2018</year>
          . http://www.ertl.jp/chstone/. [data dostupa:
          <fpage>29</fpage>
          -May-2018].
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <given-names>Y.</given-names>
            <surname>Zhou</surname>
          </string-name>
          et al., “Rosetta:
          <string-name>
            <given-names>A Realistic</given-names>
            <surname>High-Level Synthesis Benchmark Suite for Software Programmable</surname>
          </string-name>
          <string-name>
            <surname>FPGAs</surname>
          </string-name>
          ,” pp.
          <fpage>269</fpage>
          -
          <lpage>278</lpage>
          ,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <given-names>Y.</given-names>
            <surname>Hara</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Tomiyama</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Honda</surname>
          </string-name>
          , and
          <string-name>
            <given-names>H.</given-names>
            <surname>Takada</surname>
          </string-name>
          , “
          <article-title>Proposal and Quantitative Analysis of the CHStone Benchmark Program Suite for Practical C-based Highlevel Synthesis,”</article-title>
          <string-name>
            <given-names>J.</given-names>
            <surname>Inf</surname>
          </string-name>
          . Process., vol.
          <volume>17</volume>
          , pp.
          <fpage>242</fpage>
          -
          <lpage>254</lpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>