問題說明了一切;CUDA可以做argmax嗎?
假設每個線程都在做類似的東西
value=blockDim.x*blockIdx.x+threadIdx.x;
result=f(value);
其中f是設備的功能,它很容易通過添加atomicMax()調用找到最大的結果,但你怎麼能找出什麼價值是?
問題說明了一切;CUDA可以做argmax嗎?
假設每個線程都在做類似的東西
value=blockDim.x*blockIdx.x+threadIdx.x;
result=f(value);
其中f是設備的功能,它很容易通過添加atomicMax()調用找到最大的結果,但你怎麼能找出什麼價值是?
這是否有意義?只需添加一個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語句方法也會在減少結束時工作,但我可能不得不在我的代碼中嘗試...)
您是否已經查看了所有還原內核?無論如何,它們可能比atomicMax更快。 – jmilloy 2011-04-19 01:17:21
基本上f()是做了一整堆的工作,並在它的最後我有f()的輸出值,但我想要的是f的輸入給出了最高的輸出。我正在繞着它工作,但我們會看到... – Bolster 2011-04-19 01:18:05
是的,我知道了,我只是在緩慢。 – jmilloy 2011-04-19 01:24:52