Генерация графа потока данных для программ на Си

Мне нужно сделать графики потоков данных для C-кодов. Под графами потоков данных я подразумеваю графы, в которых узлы графа представляют операции, такие как сложение и умножение, а ребра представляют поток операндов (данных) между узлами. Моя цель - проанализировать параллелизм и время выполнения графов потоков данных в ядрах с интенсивным использованием вычислений. Я использовал ряд инструментов для генерации графиков потоков данных из C-программ, таких как Trimaran, Oink, GCC и т. Д. Среди этих инструментов внутреннее представление GCC Gimple предоставляет мне некоторый анализ потока данных для каждого базового блока в SSA (Статическая единичная форма). форма SSA упрощает мой анализ. Вот как я использую GCC:

-fdump-tree-cfg генерирует график потока управления для каждой функции, в которой узлы представляют основные блоки, а ребра представляют зависимость управления. Зависимость данных в каждом базовом блоке также показана. Однако он не дает график потока данных для каждого базового блока. Мне нужно визуализировать зависимость данных, чтобы анализировать поток данных в каждом базовом блоке.

В качестве примера, если вы подаете заявку -fdump-tree-cfg к следующему коду

for (i1=0; i1<=N1-N2; i1++)
    for (i2=0; i2<N2; i2++) //N2=31
        y[i1] = y[i1] + w[i2]*x[i1+i2];

Вы получаете это:

...
<bb 3>:
  i2 = 0;
  goto <bb 5>;

<bb 4>: //the inner-most loop, where real computation happens
  i1.0 = i1;
  i1.1 = i1;
  D.1608 = y[i1.1];
  i2.2 = i2;
  D.1610 = w[i2.2];
  D.1611 = i1 + i2;
  D.1612 = x[D.1611];
  D.1613 = D.1610 * D.1612;
  D.1614 = D.1608 + D.1613;
  y[i1.0] = D.1614;
  i2 = i2 + 1;

<bb 5>:
  if (i2 <= 31)
    goto <bb 4>;
  else
    goto <bb 6>;
...

-fdump-tree-vcg генерирует граф потока управления в VCG формат, но не несет никакой информации о зависимости данных.

Однако GCC имеет некоторые ограничения. Например, GCC не генерирует визуализированный график потока данных для каждого базового блока. Мне было интересно, есть ли какие-либо инструменты для генерации графиков потока данных для программ на C? Или может быть плагин GCC для генерации графиков потока данных из представления Gimple.

PS: инструменты должны быть независимыми от платформы и не ограничиваться конкретной архитектурой. Например, представление Gimple в GCC не зависит от архитектуры.

1 ответ

Для этого нет специального плагина. Но вы можете рисовать графики, используя "точку". Поскольку gimple представление имеет определенный формат, вы можете легко создать синтаксический анализатор, который принимает gimple представление в качестве входных данных и дает точечный файл в качестве выходных данных. Из точечного файла вы можете легко рисовать графики. Просто сделай человек точка, ты получишь все. Во всяком случае, это хороший вопрос.

Другие вопросы по тегам