2012-03-31 37 views
1

我有一個3載體,讓我們說對絕對值做max()最便宜的方法,但是max()會保存符號嗎?

v = vec3(-4, 2, 3) 

我願做組件的絕對值的最大值,所以相當於:

max(abs(v[0]), max(abs(v[1]), abs(v[2]))) == 4 

不過,我有一個我需要保留標誌的要求。因此,例如:

magic_max(v[0], magic_max(v[1], v[2])) == -4. 

這是一個很重要的問題,如果我使用條件分支,但我想這樣做的儘可能少的操作成爲可能,並避免分支。任何想法在哪裏看?也許有一些變化的魔法可以做到嗎?

+1

難道你不能將這樣的低級優化留給編譯器嗎? – 2012-03-31 19:52:16

+0

@BasileStarynkevitch我不相信我的編譯器來優化它。這是一個GLSL字節碼編譯器,直接進入我的GPU,不幸的是我無法訪問任何中間格式(例如程序集)來查看它在做什麼。 – amoffat 2012-03-31 19:58:32

+1

你在做什麼'vec3(4,0,-4)'? – 2012-03-31 20:04:21

回答

1

我會determ的最大值和所有值的分鐘,然後再決定什麼是ABS較大

ma = max(v[0], max(v[1], v[2])); 
mi = min(v[0], min(v[1], v[2])); 

res = abs(mi) > ma ? mi : ma; 

如果你想要得到的標誌,與是否

if (abs(mi) > ma) { 
    sign = -1; 
    res = mi; 
} else { 
    sign = +1; 
    res = ma; 
} 
替換最後一行

但是,(0,0,0)會發生什麼?沒有徵兆?

+0

非常聰明。我仍然需要做一個條件來確定最終簽署的價值,但我認爲這是一樣好。謝謝! – amoffat 2012-03-31 20:03:53

+0

你應該改變if來檢查mi <-ma',否則當mi = -2 **(wordsize-1)時會遇到不必要的問題' – Voo 2012-04-01 14:46:15