3

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表現はアーキテクチャに依存しません。

4

1 に答える 1

2

そのための特定のプラグインはありません。しかし、「ドット」を使用してグラフを描くことができます。gimple 表現には特定の形式があるため、gimple 表現を入力として取り、ドット ファイルを出力として与えるパーサーを簡単に作成できます。ドットファイルから簡単にグラフを描くことができます。マンドットを実行するだけで、すべてが得られます。とにかくいい質問です。

于 2012-07-19T18:44:46.190 に答える