2011-04-18 50 views
0

問題說明了一切;CUDA可以做argmax嗎?

假設每個線程都在做類似的東西

value=blockDim.x*blockIdx.x+threadIdx.x; 
result=f(value); 

其中f是設備的功能,它很容易通過添加atomicMax()調用找到最大的結果,但你怎麼能找出什麼價值是?

+0

您是否已經查看了所有還原內核?無論如何,它們可能比atomicMax更快。 – jmilloy 2011-04-19 01:17:21

+0

基本上f()是做了一整堆的工作,並在它的最後我有f()的輸出值,但我想要的是f的輸入給出了最高的輸出。我正在繞着它工作,但我們會看到... – Bolster 2011-04-19 01:18:05

+0

是的,我知道了,我只是在緩慢。 – jmilloy 2011-04-19 01:24:52

回答

1

這是否有意義?只需添加一個if語句,將最大結果與線程結果進行比較。如果匹配,則保存該線程的值。

value=blockDim.x*blockIdx.x+threadIdx.x; 
result=f(value); 
atomicMax(max,result); 

if result==*max: 
    max_value = value; 

或者,也許你需要指定的行爲,如果多個線程具有最大結果...例如以最低線:

value=blockDim.x*blockIdx.x+threadIdx.x; 
result=f(value); 
atomicMax(max,result); 

if result==*max: 
    atomicMin(max_value,value); 

這就是說,如果你正在尋找最大結果出來每個線程,你會想要使用減少,而不是atomicMax。如果我理解正確,atomicMax函數基本上將連續執行,而減少將基本平行。當您使用縮減時,您可以手動跟蹤結果以及結果 - 這就是我所做的。 (雖然也許上面的if語句方法也會在減少結束時工作,但我可能不得不在我的代碼中嘗試...)

+0

我不太理解實現你所談論的最佳方式。我看了一下使用推力,但從我的閱讀theres沒有簡單的方法來處理有條件地使用最大(即如果這個值大於該值,給我的id最大模板)更多的提示? :D – Bolster 2011-04-19 17:04:50

+0

我認爲我的代碼完全符合你的要求。也許如果你把它放在真正的內核環境中,我可以幫助更多。 – jmilloy 2011-04-19 18:09:17

+0

我正在考慮更多關於縮減內核的評論,但謝謝! (由於內核安排的特殊問題,並沒有以相同的方式實現,但與您的內核安排差不多) – Bolster 2011-04-19 18:47:51