我需要为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:这些工具应该是独立于平台的,不仅限于特定的架构。例如,GCC中的Gimple表示与体系结构无关。
答案 0 :(得分:2)
没有特定的插件可以执行此操作。但您可以使用“点”绘制图形。由于gimple表示具有特定格式,因此您可以轻松地创建一个解析器,该解析器将gimple表示作为输入并将点文件作为输出。从点文件中,您可以轻松绘制图形。只做男人点,你会得到一些东西。无论如何这是一个很好的问题。