TWI496088B - 基於指標之程式之發散分析方法及儲存實現該方法之程式之非短暫之實體讀取媒介 - Google Patents
基於指標之程式之發散分析方法及儲存實現該方法之程式之非短暫之實體讀取媒介 Download PDFInfo
- Publication number
- TWI496088B TWI496088B TW103122208A TW103122208A TWI496088B TW I496088 B TWI496088 B TW I496088B TW 103122208 A TW103122208 A TW 103122208A TW 103122208 A TW103122208 A TW 103122208A TW I496088 B TWI496088 B TW I496088B
- Authority
- TW
- Taiwan
- Prior art keywords
- variable
- function
- defined field
- node
- divergent
- Prior art date
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
- G06F8/434—Pointers; Aliasing
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Description
本發明係關於一種基於指標之程式之發散分析方法。
近年來,由於具有提供高計算量,越來越多使用繪圖處理器(GPU)-中央處理器(CPU)異質架構(heterogeneous architectures)於高性能計算上。
現代的GPU使用單一指令多重資料執行模型(single instruction multiple data(SIMD)execution model),該SIMD執行模型在鎖定步驟(lock step)中群組執行相同指令的平行執行緒(parallel threads)。在NVIDIA GPU術語中,此群組被稱為工作緒束(warp);而在AMD GPU的術語中,此群組被稱為波前(wavefront)。然而,因為程式碼中的分支,在鎖定步驟內執行的執行緒會被迫採用不同的程式路徑,從而可能產生發散(divergence)。當分支發散(branch divergence)產生,一些執行緒必須等待或閒置(idle),而其他執行緒則繼續執行。發散的分支會在GPU上依序被執行。由此可知,發散會讓GPU的性能嚴重下降。
雖然許多的研究聚焦在發散的問題上,然而基於指標之程式之發散分析方法尚未被細究。
在本發明至少一實施例中,一種基於指標之程式之發散分析方法包含:(1)產生一基於指標之程式之中間表示碼,其中該中間表示碼是
至少為閘控靜態單賦值形式;(2)提供該中間表示碼之控制流程圖;(3)選擇該中間表示碼之一變數作為一分析目標;(4)以該分析目標作為一追蹤變數和一根節點;(5)根據對應之定義鏈與該控制流程圖,決定該追蹤變數之一定義場域;(6)若該追蹤變數之該定義場域未包含一預定內建函數,則為該定義場域之各定義場域變數定義一節點;(7)若該追蹤變數之該定義場域未包含該預定內建函數,則使用該定義場域之各該定義場域變數和該追蹤變數定義一邊線;(8)以該定義場域之各該定義場域變數作為一追蹤變數;重複步驟(5)至(8)以獲得一發散關係圖;將該發散關係圖轉變為有向無迴圈圖;辨認出該有向無迴圈圖之至少一發散節點;以及根據該至少一發散節點與該有向無迴圈圖,決定該分析目標是否為發散。
圖1A例示本發明一實施例之基於指標之程式。
圖1B例示本發明一實施例之以靜態單賦值形式表示之中間表示碼。
圖1C例示本發明一實施例之以存儲SSA表示之中間表示碼。
圖1D例示本發明一實施例之以存儲SSA及閘控SSA表示之中間表示碼。
圖2為本發明一實施例之基於指標之程式之基於指標之發散分析(PDA)方法之流程圖。
圖3例示本發明一實施例之基於指標之發散分析(PDA)法之演算法。
圖4例示本發明一實施例之建立發散關係圖(divergence relation graph;DRG)之演算法。
圖5例示本發明一實施例之函數BuildDRG_Chi
之演算法。
圖6例示本發明一實施例之函數BuildDRG_Gating
之演算法。
圖7例示本發明一實施例之函數BuildDRG_Callee
之演算法。
圖8例示本發明一實施例之函數BuildDRG_Mu
之演算法。
圖9A例示圖1D之中間表示碼之控制流程圖(CFG)。
圖9B顯示本發明一實施例之一DRG。
圖9C例示本發明一實施例之有向無迴圈圖。
圖9D例示本發明一實施例之決定p 4
狀態之程序。
圖10例示本發明一實施例之函數RemoveCycle
之演算法。
圖11例示本發明一實施例之函數DivergenceState
之演算法。
開放計算語言(open computing language;OpenCL)是一種程式設計架構(programming framework),該程式設計架構用於在異質平台上操作之程式,而該異質平台包括CPUs、GPUs、數位信號處理(DSPs)或其他硬體加速器。儘管本發明使用OpenCL,但本發明不限於使用OpenCL表1顯示本發明一實施例之一範例OpenCL程式之兩程式片段。
程式片段A包含一OpenCL內建函數(built-in function)get_global_id()
,其於不同的執行緒(threads)上回傳不同的工作項目(work-item)的編號(IDs)。如此,一些執行緒之if
陳述(if
statements)之結果會和另一些執行緒之if
陳述(if
statements)之結果不同,其結果是發散
(divergence)可能產生。OpenCL架構包含其他內建函數,例如:get_local_id()
,atomic_add(),atomic_sub(),atomic_xchg(),atomic_inc(),atomic_dec(),atomic_cmpxchg(),atomic_min(),atomic_max(),atomic_and(),atomic_or(),and atomic_xor()
,而那些其他內建函數也可能產生發散。
程式片段B的x值可能在不同的執行緒是不同的,因為不同的tids
會造成不同的迭代數(iteration numbers)。如上述例子所顯示,如果變數的值是從內建函數(如:get_global_id()
)計算而來,則變數可能發散;變數是資料相依(data-dependent)於一發散變數,則該變數是發散;或者,變數是控制相依(control-dependent)於一發散變數,則該變數是發散。類似地,一指標(pointer)是發散,如果該指標指向一發散變數。
在本揭露中,變數可能為字元(character)、整數變數(integer variable)、浮點數變數(float variable)、雙精度數變數(double variable)或指標變數(pointer variable)。
在至少一些實施例之方法是基於兩延伸靜態單賦值形式(extended SSA(static single assignment)forms):存儲SSA(memory SSA)和閘控SSA(gated SSA)。參照圖1A與圖1B所示,一種如圖1A所示之基於指標之程式可被轉換成以靜態單賦值形式表示之中間表示碼(intermediate representation;IR
),如圖1B所示。在以SSA形式(SSA form)表示之中間表示碼,一種陳述(函數)被用來表示一變數(variable)之所有定義(definitions)之連結(joining)。函數可被表示成V k
=(V m
,V n
,...,V i
),其中V k
為新版(new version)之V
,而在右邊(right hand side;RHS)的運算元(operands)為舊版(old version)之V
。
基於指標之程式可被轉換成以存儲SSA形式表示之IR
,如圖1C所示。圖1C之IR
使用兩種註解(annotations)或運算子(operators),MayUse
:μ
和MayDef
:χ
來特徵化別名之效果(characterize effects of aliasing)。函數μ
和χ
可被用來表示可能之defs
和uses
。在原來程式表示(original pointer-based program representation)之各間接儲存(indirect store)(即*x=y)可使用函數v
=χ
(v
),來為每個可被該儲存(儲存指令)所定義(defined by the store)的變數v
註解。在原來程式表示之各間接載入(indirect load)(即x=*y)
可使用函數μ
(v
),來為每個可以被該載入(載入指令)所存取(accessed by)之變數v
註解。當轉換至SSA形式時,各函數χ
可視為特定變數(given variable)之def
及use
;而各函數μ
可視為該特定變數之use
。如圖1C所示,在第19行之p4
可具有a 1
和b 1
的別名,以及該IR
包括a 2
=χ
(a 1
)和b 2
=χ
(b 1
),其中a 2
=χ
(a 1
)表示間接儲存(indirect store)可將a 1
定義為新版的a 2
(new versiona 2
)。
閘控SSA利用控制條件運算元(control condition operands)來加強(enhance)函數。在圖1D的IR
包括三個閘控函數(gating functions)γ
、μ
及η
。
函數γ
為複數定義(multiple definitions)增加條件(condition),以形成一匯流節點(reach a confluence node),其中該匯流節點沒有像在if-then-else
陳述之條件中所有之進入後退邊線(incoming back edge)。例如,x 3
=γ
(P
,x 1
,x 2
)表示若為P
時,則x 3
=x 1
;若為 P
時,則x 3
=x 2
。
函數μ
僅存在於迴圈標頭(loop headers)。函數μ
選擇初始和迴圈承載值(initial and loop carried values)。例如,x 2
=μ
(x 0
,x 3
)表示在迴圈第一次迭代(first iteration)時,x 2
=x 0
,而在迴圈第一次迭代後,x 2
=x 3
。
函數η
決定迴圈(loop)結束時,在跳出處(exit)的一變數之數值。例如,x 4
=η
(P
,x 3
)代表x 3
是在一迴圈之最後一迭代所指派的數值,而P
為離開迴圈之條件。
在至少一些實施例中,圖1D之一種修改過的閘控SSA中間表示碼被使用,其中該修改過的閘控SSA中間表示碼可避免命名衝突(naming conflict)及可處理零迭代的迴圈(loops having zero iteration)。在圖1D中,第16與17行之陳述使用γ
函數來取代原本應使用之η
函數。在第10與11行中,使用函數來取代原本應使用之μ
函數。
表2顯示本發明一實施例之一陳述或程式歸類(statement ro program classification)。
在表2中,p
和q
為一級指標(one-level pointers);r
為二級指標(two-level pointer);i
為純量變數(scalar variable);以及A
為純量函數或變數(scalar functions or variables)之陣列。
Updated by Function
的陳述使用一OpenCL內建函數來回傳一數值。Points-to Location
的陳述包括一指標,其中該指標指向一或以上的位置(locations)。Pointers Aliased
的陳述包含具有偏移(offset)之指標的別名,或者包含指向低一級指標(one-level-lower pointer)之一高一級指標(one-level-higher pointer)。當一指標被*或→取址(dereferenced)時,Indirect Store
和Indirect Load
的陳述間接存取指標。在至少一些實施例中,位置命名(location naming)定義成(base
,offset
),其中offset
可包括仿射樣式(affine style)。
圖2為本發明一實施例之流程圖,其例示一種基於指標之程式之基於指標之發散分析(pointer-based divergence analysis;PDA)方法。圖3為本發明一實施例之基於指標之發散分析之演算法。參照圖2與圖3所示,一OpenCL程式被提供,其中該OpenCL程式可為一基於指標之程式(pointer-based program)。然而,本發明之應用不限於在OpenCL程式。
一編譯器(compiler),例如Open64,被用來編譯該OpenCL程式,已產生一WHIRL中間表示碼、一SSA形式中間表示碼(SSA form intermediate representation),以及一控制流程圖(control flow graph;CFG)。然而,本發明不限於使用Open64。在一些實施例中,SSA形式中間表示碼可為存儲SSA形式之中間表示碼。在一些實施例中,SSA形式中間表示碼可為閘控SSA形式之中間表示碼。在一些實施例中,SSA形式中間表示碼可為存儲SSA形式與閘控SSA形式之中間表示碼。在一些實施例中,SSA形式中間表示碼在一迴圈(loop)後使用γ
函數取代η
函數,並在一迴圈前使用函數取代μ
函數。
圖4為本發明一實施例之建立發散關係圖(divergence relation graph;DRG)之演算法。參照圖2至圖4所示,SSA形式中間表示碼之一指標或其他類型之變數被選為分析目標u 0
。分析目標u 0
用來定義一節點(node),然後傳給函數Build_DRG
,如圖3之第2與3行所示,藉此利用總體資料CFG和SSA(global data CFG and SSA)來建立發散關係圖(divergence relation graph)。
參照圖4所示,在函數Build_DRG
中,分析目標u 0
之使用-定義鏈(use-define chain)或定義-使用鏈(define-use chain)之指標或其他類似變數一個接著一個被處理,以連續地更新一總體的DRG:G,藉此能最後於更新程序完成後得到一DRG。對每一指標或其他類似變數u
而言,定義場域陳述s
(definition site statements
)是依照分析目標或追蹤變數u 0
之使用-定義鏈或定義-使用鏈和該CFG來決定。在一實施例中,總體的DRG:G是一有向迴圈圖(directed cyclic graph)G(V
,E
),而且DRG的根節點(root node)是分析目標u 0
;葉節點可為追蹤變數u 0
之定義或points-to locations
(points-to
位置);而在節點集(node set)V
(G
)的其他節點為相關的指標和其他類型之變數。E
(G
)連接V
(G
)之節點間之相關的指標、位置或變數。
參照圖4所示,函數Build_DRG
包含函數BuildDRG_Chi、BuildDRG_Gating、BuildDRG_Callee
及BuildDRG_Mu
。如果定義場域或陳述s
包括χ
註解,則呼叫函數BuildDRG_Chi
。
參照圖5所示,當函數BuildDRG_Chi
被呼叫,在陳述s
中之一間接儲存指標(indirect store pointer)之取值指標(dereference pointer)u md
被決定。E
(G
)因增加由追蹤指標u
和取值指標u md
所定義之邊線(edge)而更新,如圖5之第3行所示。接著,E
(G
)因增加由取值指標u md
和在函數χ
中之各運算元u χ
所定義之邊線而更新,如圖5之第4行所示。然後,以代表取值指標u md
的節點更新V
(G
),以及使用代表函數χ
中之各運算元u χ
的節點更新V
(G
)。之後,取值指標u md
及運算元u χ
之變異狀態(variance state)設定為非變異的(non-variant)。其次,取值指標u md
及運算元u χ
分別傳送到函數Build_DRG
,以連續地追蹤與陳述s
相關之連結(connections)。接著,將在
陳述s
右邊(RHS)之各運算元u op
及追蹤指標u
所定義之邊線加入E
(G
)中。代表各運算元u op
之節點加入V
(G
)中。然後,各運算元u op
之變異狀態設定成非變異。最後,各運算元u op
傳至函數Build_DRG
以連續地追蹤與陳述s
相關之連結(connections)。
參照圖4和圖6所示,當陳述s
具有至少一閘控函數(gating functions)時,函數BuildDRG_Gating
則被使用。在至少一些實施例中,分析可能會產生發散之所有可能的定義場域和控制相依(control dependences),如此在函數γ
與中所有運算元可被追蹤並傳送至函數Build_DRG
。
參照圖6所示,當陳述s
包括函數γ
或,則函數BuildDRG_Gating
會被呼叫。將由在各函數γ
或中之各運算元u gating
和追蹤指標u
所定義之各邊線加入E
(G
)。將各函數γ
或中之各運算元u gating
之節點加入V
(G
)。將陳述s
之各函數γ
或中之各運算元u gating
之變異狀態設定成非變異。各運算元u gating
傳至函數Build_DRG
直到所有可能相關的指標或其他類型之變數都處理完畢。
參照圖4所示,若陳述s
之RHS包含至少一points-to location
,則將由陳述s
之RHS之各位置(location)之基址(base address)u rb
和追蹤指標或其他類型變數u
所定義之邊線加入E
(G
),並且將各位置之基址u rb
加入V
(G
)。將由陳述s
之RHS之偏移u offset
和追蹤指標或其他類型變數u
所界定之邊線加入E
(G
),而且將偏移u offset
加入V
(G
)。基址u rb
和偏移u offset
的變異狀態設定成非變異,且將基址u rb
和偏移u offset
個別地傳入函數Build_DRG
。當偏移u offset
傳入函數Build_DRG
時,可獲得偏移u offset
的位置。
參照圖4所示,若陳述s
包含至少一別名指標(aliased pointer)u rb
,將由別名指標u rb
和追蹤指標或其他類型變數u
所定義之邊線加入E
(G
),並將別名指標u rb
之節點加入V
(G
)。將由別名指標u rb
之對應偏移u offset
和追蹤指標或其他類型變數u
所定義之邊線加入E
(G
),而且將該對應偏移u offset
之節點加入V
(G
)。別名指標u rb
和偏移u offset
的變異狀態設定成非變異。別名指標u rb
和偏移u offset
個別地傳至函數Build_DRG
。
參照圖4與圖7所示,當陳述s
包含一更新函數(updating
function),而該更新函數歸類為(classified as)Updated by Function
時,則函數BuildDRG_Callee
被呼叫。函數BuildDRG_Callee
會檢查是否該更新函數列在上述表2中,或者它不是OpenCL內建函數。如果該更新函數是上述表2中之內建函數之一或它不是OpenCL內建函數,則該指標或其他類型變數u
之變異狀態設定成變異或發散;否則,該變異狀態設定為非發散。若該更新函數不是列在上述表2中,將代表被呼叫程式(callee(即為一called function))之一回傳值u rv
之節點加入V
(G
),並將由回傳值u rv
和該指標或其他類型變數u
所定義之邊線加入E
(G
)。回傳值u rv
的變異狀態然後被設定成非發散。回傳值u rv
傳入函數Build_DRG
。參照圖4與圖8所示,當陳述s
包含間接載入(indirect load),則呼叫函數BuildDRG_Mu
。函數BuildDRG_Mu
會追蹤各函數μ
中之所有可能的may-use
變數。將由在各函數μ
中之各運算元u μ
和追蹤指標或其他類型變數u
所定義之邊線加入E
(G
),以及將各運算元u μ
之節點加入V
(G
)。各運算元u μ
的變異狀態設定成非變異,而且將各運算元u μ
傳至函數Build_DRG
。
參照圖4之第32至36行,將由在陳述s
之RHS之各純量變數指定(scalar variable assignment)內之各運算元u op
和追蹤指標或其他類型變數u
所定義之邊線加入E
(G
)。將陳述s
之RHS之各純量變數指定內之各運算元u op
之節點加入V
(G
)。將各純量變數指定內之各運算元u op
之變異狀態設定成非變異。將各純量變數指定內之各運算元u op
傳送至函數Build_DRG
。
圖9A顯示圖1D之IR
之一CFG。圖9B顯示本發明一實施例之一DRG。參照圖9A與圖9B所示,在所有相關的節點都被函數Build_DRG
處理(visited)後,DRG被建立。藉由廣域對SSA變數的各版本編號(globally numbering each version of a variable in SSA),各節點被指定一獨特的號碼。以下會解釋如何產生DRG。
選擇p 4
為分析目標,並將其傳至函數Build_DRG
。由於p 4
之定義場域或陳述包括閘控函數(gating function)γ
,且該閘控函數γ
的定義場域變數(definition site variables)或運算元(operands)在BB5處為p 2
、p 3
和c 1
,因此增加p 2
、p 3
和c 1
之節點並傳至函數Build_DRG
。因為在BB8處,x 4
在
陳述p 4
之RHS,所以增加x 4
並傳至函數Build_DRG
。
在p 2
傳至函數Build_DRG
後,包括p 2
之定義場域之陳述被決定。根據在BB3之p 2
之定義場域,BB3之陳述被歸類為Pointer Aliased
。因此,增加定義場域變數或別名指標b 1
並將其傳至函數Build_DRG
。由於b 1
是分析函數(analyzed function)的參數,而該分析函數是定義在一主機碼(host code)中,因此可以找到別名指標b 1
的定義場域,從而使此分支結束(this branch is terminated)。
在p 3
傳至函數Build_DRG
後,包括p 3
之定義場域之陳述被決定。根據p 3
之定義場域,在BB4之陳述為一Points-to location
。增加基址a 1
及偏移tid 1
,並將其傳至函數Build_DRG
,其中基址a 1
及偏移tid 1
為定義場域變數和陣列索引(array indices)。由於找到基址a 1
之定義場域,從而使此分支結束。
在函數Build_DRG
接受偏移tid 1
後,包括在BB1處之偏移tid 1
之定義場域之陳述被決定。因為偏移tid 1
之定義場域包含更新函數(update function)get_global_id(0)
,且更新函數get_global_id(0)
是上表2中OpenCL C內建函數之一,因此呼叫函數BuildDRG_Callee
。函數BuildDRG_Callee
將偏移tid 1
設定為發散,然後返回(return)。
在函數Build_DRG
接受x 4
後,發現在BB8處之陳述,其中該陳述包括x 4
之定義場域。x 4
之定義場域包括閘控函數(gating function)γ
。因此,增加定義場域變數或運算元x 2
、x 3
和i 2
,並將定義場域變數或運算元x 2
、x 3
和i 2
傳至函數Build_DRG
。
因為在BB6處,x 2
是由函數所定義。由於x 3
已經處理(visited),所以僅增加一節點x 1
,並將其傳至函數Build_DRG
。
x 3
之定義場域僅包括變數x 2
。由於變數x 2
已經處理過,因此此分析結束。
因為最後的定義(final definition)已找到,所以x 1
的分析結束。
i 1
、i 2
和i 3
之分析類似x 1
、x 2
和x 3
之分析,所以於此不再贅述。最後如圖9B所示的DRG被建立。
參照圖2、3、9C和10,在DRG被建立後,函數RemoveCycle
被呼叫。函數RemoveCycle
合併(merging)在DRG上產生循環(cycle)之節點,以將DRG轉變成有向無迴圈圖(directed acyclic graph),如圖9C所示。循環可利用如Tarjan's演算法(Tarjan's Algorithm)來找出。Tarjan's演算法算出將循環之節點合併後之循環根節點(cycle's root)。如圖9B所示,DRG包含兩循環。第一循環包含節點i 2
和i 3
。若Tarjan's演算法算得i 2
是循環根節點,則在根據節點i 3
之變異狀態將i 2
之變異狀態更新後,將邊線(i 2
,i 3
)及(i 3
,i 2
)移除,並將節點i 3
刪除。第二循環包含x 2
和x 3
。若x 3
是循環根節點,則移除邊線(x 4
,x 2
),且移除邊線(x 3
,x 2
)被。接著,增加邊線(x 3
,x 1
),而移除邊線(x 2
,x 3
)和(x 3
,x 2
)。最後,在合併後,計算新的變異狀態,並將節點x 2
移除,從而得到縮減的DRG(reduced DRG)或有向無迴圈圖,如圖9C所示。
參照圖2、3、9D和11所示,函數DivergenceState
被用來計算分析目標之發散狀態(divergence state)。函數DivergenceState
對縮減的DRG中除根節點外之所有節點,執行「或運算」(OR
operation)。如圖9D所示,tid 1
被決定為發散,因為tid 1
是從一內建函數獲得。p 3
是發散,因為p 3
相依(dependent on)於tid 1
。最後,p 4
是發散,因為p 4
相依(dependent on)於發散的p 3
。
在一實施例中,本發明包含一硬體電腦。該電腦包含一處理器和一硬體記憶體,其中該處理器執行上述實施例之方法之步驟;該記憶體儲存編碼或程式(codes),該編碼或程式使該處理器執行上述實施例之方法之步驟。
在本實施方式內的資料結構和編碼可儲存在電腦可讀取之非短暫之實體讀取媒介上。非短暫之實體讀取媒介可為任何可為電腦系統所使用之裝置或媒介。非短暫之實體讀取媒介可包含(但不限於)揮發性記憶體、非揮發性記憶體、磁性和光學儲存裝置(例如:光碟機、磁帶、光碟、多功能數位光碟(DVD))或其他未可知或於日後發展之可儲存編碼及/或資料之媒體。
上述實施例之方法和程序可實現為編碼及/或資料,其中編碼及/或資料可儲存在電腦可讀取之非短暫之實體讀取媒介。當電腦系統讀
取和執行儲存在電腦可讀取之非短暫之實體上之編碼及/或資料時,電腦系統可執行在電腦可讀取之非短暫之實體讀取媒介上所實現之編碼及/或資料。再者,上述方法和程序包含在硬體模組內。例如,硬體模組包含(但不限於)特殊用途積體電路(ASIC)晶片、可規劃邏輯閘陣列或其他未知或日後發展出之可程式化邏輯裝置。當該硬體模組啟動後,硬體模組可執行儲存在硬體模組內之方法和程序。
本揭露之技術內容及技術特點已揭示如上,然而熟悉本項技術之人士仍可能基於本揭露之教示及揭示而作種種不背離本揭露精神之替換及修飾。因此,本揭露之保護範圍應不限於實施範例所揭示者,而應包括各種不背離本揭露之替換及修飾,並為以下之申請專利範圍所涵蓋。
Claims (16)
- 一種基於指標之程式之發散分析方法,包含:(1)產生一基於指標之程式之中間表示碼,其中該中間表示碼是至少為閘控靜態單賦值形式;(2)提供該中間表示碼之控制流程圖;(3)選擇該中間表示碼之一變數作為一分析目標;(4)以該分析目標作為一追蹤變數和一根節點;(5)根據對應之定義鏈與該控制流程圖,決定該追蹤變數之一定義場域;(6)若該追蹤變數之該定義場域未包含一預定內建函數,則為該定義場域之各定義場域變數定義一節點;(7)若該追蹤變數之該定義場域未包含該預定內建函數,則使用該定義場域之各該定義場域變數和該追蹤變數定義一邊線;(8)以該定義場域之各該定義場域變數作為一追蹤變數;重複步驟(5)至(8)以獲得一發散關係圖;將該發散關係圖轉變為有向無迴圈圖;辨認出該有向無迴圈圖之至少一發散節點;以及根據該至少一發散節點與該有向無迴圈圖,決定該分析目標是否為發散。
- 根據申請專利範圍第1項所述之發散分析方法,其中將該發散關係圖轉變為有向無迴圈圖之步驟包含移除該發散關係圖之至少一循環。
- 根據申請專利範圍第1項所述之發散分析方法,其中該中間表示碼使用γ 函數決定迴圈結束時在跳出處之一變數之數值。
- 根據申請專利範圍第1項所述之發散分析方法,其中該中間表示碼在迴圈標頭使用函數。
- 根據申請專利範圍第1項所述之發散分析方法,其中該至少一發散節點包含一變數,該變數是由造成發散的函數所決定。
- 根據申請專利範圍第1項所述之發散分析方法,其中步驟(6)和(7)包含:若該定義場域包含χ 函數,則為在該定義場域上之一間接儲存指標之取值指標定義一節點;為該χ 函數之各運算元定義一節點;使用該取值指標和該追蹤變數定義一邊線;使用該χ 函數的各該運算元和該追蹤變數定義一邊線;以及將該取值指標和各該運算元設定成非變異的。
- 根據申請專利範圍第6項所述之發散分析方法,更包含:為該定義場域之右邊之各運算元定義一節點;以及使用該定義場域之右邊之各該運算元和該追蹤變數定義一邊線。
- 根據申請專利範圍第1項所述之發散分析方法,其中步驟(6)和(7)包含:為該定義場域之各γ 或函數中之各運算元定義一節點; 使用各該γ 或函數中之各該運算元和該追蹤變數定義一邊線;以及將該定義場域之各該γ 或函數中之各該運算元之變異狀態設定成非變異的。
- 根據申請專利範圍第1項所述之發散分析方法,其中步驟(6)和(7)包含:使用該定義場域之一位置之一基址和該追蹤變數定義一邊線;為該基址定義一節點;使用對應於該基址之一偏移和該追蹤變數定義一邊線;為該偏移定義一節點;以及設定該基址和該偏移之變異狀態為非變異。
- 根據申請專利範圍第1項所述之發散分析方法,其中步驟(6)和(7)包含:使用該定義場域之右邊之一別名指標和該追蹤變數定義一邊線;為該別名指標定義一節點;使用對應於該別名指標之一偏移和該追蹤變數定義一邊線;為該偏移定義一節點;以及設定該別名指標和該偏移之變異狀態為非變異。
- 根據申請專利範圍第1項所述之發散分析方法,更包含:若該追蹤變數之該定義場域包含一預定內建函數,則設定該追蹤變數為非變異。
- 根據申請專利範圍第1項所述之發散分析方法,其中步驟(6)和(7)包含:為該定義場域之一被呼叫程式之一回傳值定義一節點;若該追蹤變數之該定義場域不包含一預定內建函數,則使用該回傳值與該追蹤變數定義一邊線;以及設定該回傳值為非變異。
- 根據申請專利範圍第1項所述之發散分析方法,其中步驟(6)和(7)包含:以該定義場域之一μ 函數之各運算元和該追蹤變數定義一邊線;為該μ 函數之各該運算元定義一節點;以及設定該μ 函數之各該運算元為非變異。
- 根據申請專利範圍第1項所述之發散分析方法,其中步驟(6)和(7)包含:以該定義場域之右邊之一純量變數指定之各運算元和該追蹤變數定義一邊線;為該定義場域之右邊之該純量變數指定之各該運算元界定一節點;以及設定該定義場域之右邊之該純量變數指定之各該運算元為非變異。
- 根據申請專利範圍第1項所述之發散分析方法,更包含設定各該定義場域變數為非變異。
- 一種非短暫之實體讀取媒介,其儲存一程式,該程式能讓電腦執行一種基於指標之程式之發散分析方法,該方法包 含:(1)產生一基於指標之程式之中間表示碼,其中該中間表示碼是至少為閘控靜態單賦值形式;(2)提供該中間表示碼之控制流程圖;(3)選擇該中間表示碼之一變數作為一分析目標;(4)以該分析目標作為一追蹤變數和一根節點;(5)根據對應之定義鏈與該控制流程圖,決定該追蹤變數之一定義場域;(6)若該追蹤變數之該定義場域未包含一預定內建函數,則為該定義場域之各定義場域變數定義一節點;(7)若該追蹤變數之該定義場域未包含該預定內建函數,則使用該定義場域之各該定義場域變數和該追蹤變數定義一邊線;(8)以該定義場域之各該定義場域變數作為一追蹤變數;重複步驟(5)至(8)以獲得一發散關係圖;將該發散關係圖轉變為有向無迴圈圖;辨認出該有向無迴圈圖之至少一發散節點;以及根據該至少一發散節點與該有向無迴圈圖,決定該分析目標是否為發散。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US14/086,481 US9201636B2 (en) | 2013-11-21 | 2013-11-21 | Method for divergence analysis of pointer-based program |
Publications (2)
Publication Number | Publication Date |
---|---|
TW201520900A TW201520900A (zh) | 2015-06-01 |
TWI496088B true TWI496088B (zh) | 2015-08-11 |
Family
ID=53174621
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
TW103122208A TWI496088B (zh) | 2013-11-21 | 2014-06-27 | 基於指標之程式之發散分析方法及儲存實現該方法之程式之非短暫之實體讀取媒介 |
Country Status (2)
Country | Link |
---|---|
US (1) | US9201636B2 (zh) |
TW (1) | TWI496088B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9292269B2 (en) * | 2014-01-31 | 2016-03-22 | Nvidia Corporation | Control flow optimization for efficient program code execution on a processor |
US9367307B2 (en) * | 2014-10-15 | 2016-06-14 | Oracle International Corporation | Staged points-to analysis for large code bases |
US9811322B1 (en) * | 2016-05-31 | 2017-11-07 | Oracle International Corporation | Scalable provenance generation from points-to information |
US10326688B2 (en) * | 2017-05-25 | 2019-06-18 | Nokia Of America Corporation | Method and apparatus for instantiating a path with the minimum number of segments |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TW200709055A (en) * | 2005-05-04 | 2007-03-01 | Advanced Risc Mach Ltd | Use of a data engine within a data processing apparatus |
US7477255B1 (en) * | 2004-04-12 | 2009-01-13 | Nvidia Corporation | System and method for synchronizing divergent samples in a programmable graphics processing unit |
US7834881B2 (en) * | 2004-07-13 | 2010-11-16 | Nvidia Corporation | Operand collector architecture |
TW201342212A (zh) * | 2011-12-21 | 2013-10-16 | Nvidia Corp | 使用預解碼資料進行指令排程的方法和裝置 |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6247143B1 (en) * | 1998-06-30 | 2001-06-12 | Sun Microsystems, Inc. | I/O handling for a multiprocessor computer system |
US8302085B2 (en) * | 2005-02-16 | 2012-10-30 | University College Cork—National University of Ireland | Method for developing software code and estimating processor execution time |
US7284219B1 (en) * | 2005-02-17 | 2007-10-16 | Xilinx, Inc. | Representation of a relaxation of a constraint by graph replication |
US7619628B2 (en) * | 2005-06-24 | 2009-11-17 | Microsoft Corporation | Caching digital image data |
US8161464B2 (en) * | 2006-04-11 | 2012-04-17 | International Business Machines Corporation | Compiling source code |
US8015556B2 (en) * | 2006-10-12 | 2011-09-06 | International Business Machines Corporation | Efficient method of data reshaping for multidimensional dynamic array objects in the presence of multiple object instantiations |
US8381203B1 (en) * | 2006-11-03 | 2013-02-19 | Nvidia Corporation | Insertion of multithreaded execution synchronization points in a software program |
US20080184208A1 (en) * | 2007-01-30 | 2008-07-31 | Sreedhar Vugranam C | Method and apparatus for detecting vulnerabilities and bugs in software applications |
US7996798B2 (en) * | 2007-05-24 | 2011-08-09 | Microsoft Corporation | Representing binary code as a circuit |
US9043774B2 (en) * | 2008-02-12 | 2015-05-26 | William G. Bently | Systems and methods for information flow analysis |
US8402444B2 (en) * | 2009-10-09 | 2013-03-19 | Microsoft Corporation | Program analysis through predicate abstraction and refinement |
US8881293B1 (en) * | 2013-07-01 | 2014-11-04 | Sap Se | Static application security testing |
-
2013
- 2013-11-21 US US14/086,481 patent/US9201636B2/en active Active
-
2014
- 2014-06-27 TW TW103122208A patent/TWI496088B/zh active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7477255B1 (en) * | 2004-04-12 | 2009-01-13 | Nvidia Corporation | System and method for synchronizing divergent samples in a programmable graphics processing unit |
US7834881B2 (en) * | 2004-07-13 | 2010-11-16 | Nvidia Corporation | Operand collector architecture |
TW200709055A (en) * | 2005-05-04 | 2007-03-01 | Advanced Risc Mach Ltd | Use of a data engine within a data processing apparatus |
TW201342212A (zh) * | 2011-12-21 | 2013-10-16 | Nvidia Corp | 使用預解碼資料進行指令排程的方法和裝置 |
Also Published As
Publication number | Publication date |
---|---|
TW201520900A (zh) | 2015-06-01 |
US9201636B2 (en) | 2015-12-01 |
US20150143349A1 (en) | 2015-05-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Jia et al. | Optimizing DNN computation with relaxed graph substitutions | |
JP7090778B2 (ja) | 影響分析 | |
Yang et al. | Efficient stateful dynamic partial order reduction | |
US8793674B2 (en) | Computer-guided holistic optimization of MapReduce applications | |
US20050210473A1 (en) | Controlling task execution | |
TWI496088B (zh) | 基於指標之程式之發散分析方法及儲存實現該方法之程式之非短暫之實體讀取媒介 | |
KR102182198B1 (ko) | 데이터 처리 그래프 컴파일 | |
US20140122832A1 (en) | Partial vectorization compilation system | |
JP6528465B2 (ja) | ソフトウェアテストのためのシンボリック実行における状態パラメータ化 | |
Drăgoi et al. | Automatic linearizability proofs of concurrent objects with cooperating updates | |
Schlaipfer et al. | Optimizing big-data queries using program synthesis | |
Stock et al. | Cache persistence analysis: Finally exact | |
Zhao et al. | Parallel sparse flow-sensitive points-to analysis | |
Su et al. | An efficient GPU implementation of inclusion-based pointer analysis | |
Sbirlea et al. | Dfgr an intermediate graph representation for macro-dataflow programs | |
US9152543B1 (en) | Symbolic execution with automatic abstractions | |
Hijma et al. | Stepwise‐refinement for performance: a methodology for many‐core programming | |
Basso et al. | Optimizing Parallel Java Streams | |
Bhowmik et al. | A fast approximate interprocedural analysis for speculative multithreading compilers | |
Thoman et al. | Task-parallel runtime system optimization using static compiler analysis | |
Wang et al. | Automatic scoping of task clauses for the OpenMP tasking model | |
Thoman et al. | Static compiler analyses for application-specific optimization of task-parallel runtime systems | |
Leppkes et al. | Meta Adjoint Programming in C+ | |
Metzler et al. | Efficient verification of program fragments: Eager POR | |
US11922152B2 (en) | Workload oriented constant propagation for compiler |