2012-03-28 101 views
10

當我到擠壓性能的最後一位出一個內核的,我通常會發現與位運算符&|)更換邏輯運算符&&||),使內核快一點點。通過查看CUDA Visual Profiler中的內核時間彙總可以看到這一點。CUDA:爲什麼按位運算符有時比邏輯運算符更快?

那麼,爲什麼按位運算符比CUDA中的邏輯運算符要快?我必須承認,他們是並不總是更快,但他們很多次。我不知道什麼魔法可以讓這個加速。

聲明:我知道邏輯運算符短路和按位運算符沒有。我很清楚這些操作員如何被濫用導致錯誤的代碼。我用這個替代小心只有當產生的邏輯是一樣的,有一個加速,並由此獲得了加速的問題給我:-)

+0

謝謝你提供了一個很棒的優化技巧! – 2012-03-28 16:49:58

+0

Roger:很高興幫助!當我發現這一點時,我感到很驚訝:-) – 2012-03-29 00:04:11

回答

11

邏輯運算符經常會導致枝條,特別是當需要被觀察到短路評價的規則。對於正常的CPU,這可能意味着分支預測失誤,CUDA可能意味着分歧。按位操作不需要短路評估,因此代碼流是線性的(即無分支)。

+1

此外,對於邏輯運算符,必​​須將非零結果設置爲1. – 2012-03-28 16:54:35

+1

@Roger:true,但通常可以優化它,例如,如果表達式只是作爲條件的一部分使用 - 只有在將結果分配給變量時,結果才真正需要設置爲1。 – 2012-03-28 17:05:04

1

位運算可以在寄存器在硬件層次上進行。寄存器操作是最快的,當數據可以放入寄存器時尤其如此。邏輯操作涉及表達式評估,它可能不是寄存器綁定的。通常,&,|,^,>> ...是一些最快的操作,並在高性能邏輯中廣泛使用。

6

甲& & B:

if (!A) { 
    return 0; 
} 
if (!B) { 
    return 0; 
} 
return 1; 

甲& B:

return A & B; 

這些是考慮到評估A和B可以有副作用的語義(它們可以是改變的狀態的功能系統評估時)。

有許多方法,該編譯器可以優化A && B情況下,取決於該類型A和B的和上下文。