Генерация графа потока данных для программ на Си
Мне нужно сделать графики потоков данных для 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 представление в качестве входных данных и дает точечный файл в качестве выходных данных. Из точечного файла вы можете легко рисовать графики. Просто сделай человек точка, ты получишь все. Во всяком случае, это хороший вопрос.