2012-07-19 74 views
3

我需要爲C代碼生成數據流圖。數據流圖是指圖中的節點表示加法和乘法等操作,邊表示節點間的操作數(數據)流。我的目標是分析計算密集型內核的數據流圖的並行性和執行時間。我使用了許多工具從C程序(如Trimaran,Oink,GCC等)生成數據流圖。在這些工具中,GCC的Gimple內部表示爲我提供了一些針對SSA中每個基本塊的數據流分析(靜態單一分配)表單。 SSA表格簡化了我的分析。以下是我如何使用GCC:C程序的數據流圖生成

-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表示與體系結構無關。

+1

看看多面模型(可能有助於您的具體示例)。但在一般情況下,至少需要完整的抽象解釋。 – 2012-07-20 08:50:08

+0

[提出建議列表的問題在SE上不太合適](http://meta.stackexchange.com/questions/158809/why-are-shopping-list-questions-bad) – 2013-06-04 15:39:51

回答

2

沒有特定的插件可以這樣做。但是你可以使用「點」來繪製圖形。由於gimple表達式具有特定的格式,因此您可以輕鬆地創建一個解析器,它將gimple表達式作爲輸入並將點文件作爲輸出。從點文件,你可以很容易地繪製圖形。只要做點人,你就會得到一些東西。無論如何它是一個很好的問題。

+0

我可以將vcg轉換爲ps或使用點的其他格式。但它只能用於CFG。正如你所提到的,你可以編寫一個解析器,它可以獲取每個基本塊的疙瘩表示並生成基本塊的數據流圖。我希望我可以依靠已經開發的工具來做到這一點。有些微妙的東西使得解析器比較困難,比如指針分析。感謝您的回答,我會更新我的問題,使其更清楚一點。 – aminfar 2012-07-19 19:01:34

+0

數據流分析通常需要解析器作爲接近流量事實的前置步驟,但它不會使「解析器」變得困難。解析器的難度完全取決於語言(現代C,無論是MS,GNU還是GreenHills,......都比人們似乎認爲的「老式的C」更加複雜)。確實,點對點分析本身很難做到。你不想自己做這件事;你永遠不會達到你的實際目標。 – 2012-07-19 19:48:24