Cコードのデータフローグラフを作成する必要があります。データフローグラフとは、グラフ内のノードが加算や乗算などの演算を表し、エッジがノード間のオペランド(データ)フローを表すグラフを意味します。私の目標は、計算集約型カーネルのデータフローグラフの並列処理と実行時間を分析することです。Trimaran、Oink、GCCなどのCプログラムからデータフローグラフを生成するために多くのツールを使用しました。これらのツールの中で、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プログラムのデータフローグラフを生成するツールがあるかどうか疑問に思いましたか?または、Gimple表現からデータフローグラフを生成するGCCプラグインがあるかもしれません。
PS:ツールはプラットフォームに依存せず、特定のアーキテクチャに限定されない必要があります。たとえば、GCCでのGimple表現はアーキテクチャに依存しません。