2015-02-05 15 views
0

哪個代碼是更有效時:刪除分支機構設置局部變量

程序進行

local int a[5]; 
bool condition; 
... 
a[0] = 0; 
if (condition) { 
     a[0] = 1; 
} 

或常規乙

local int a[5]; 
bool condition; 
.... 
a[0] = 0; 
a[0] = select(a[0], 1, condition); 

第二上市消除了分支,但SELECT語句可能如果條件爲假,則訪問本地內存兩次。希望如果條件是錯誤的,編譯器會放入一個空操作。

+0

大部分(如果不是全部)編譯器都能夠用無分支條件移動替換第一個分支。請花時間檢查生成的程序集,然後再問這樣的問題...... – 2015-02-06 01:46:16

回答

1

在低級代碼和目標機器之間有一個編譯器,編譯器正在編譯的目標機器最終將確定要生成的彙編代碼。

例如,你不能說'刪除if語句去掉分支',如果編譯器決定使用比較和設置指令而不是比較分支然後移動會怎麼樣?

如果條件始終爲false,則代碼將被視爲死代碼,編譯器可能決定不做任何操作而不做任何操作。

如果您設法生成與例程A和例程B對應的彙編代碼,並獲得目標機器的指令成本表,那麼您就可以談論機器代碼效率。編譯器通常會嵌入這樣的表格,以嘗試選擇最合適的指令組合。

選擇看起來像它是專爲矢量而不是單一的值。最有可能的是,它可以使用SIMP指令來操作數組,而不僅僅是像我們手頭上那樣的單個值。請參閱OpenCL built-in function 'select'