如果標題混亂,我很抱歉。我雖然漫長而艱苦,並且無法想出合適的方式來將問題單獨列出來。所以這裏有更多的細節。我正在做一個基本的圖像減法,其中第二個圖像已被修改,我需要找出多少變化與圖像的比例。爲此,我使用了下面的代碼。這兩個圖像都是128x1024。CUDA在執行期間結合了線程獨立(??)變量
for(int i = 0; i < 128; i++)
{
for(int j = 0; j < 1024; j++)
{
den++;
diff[i * 1024 + j] = orig[i * 1024 + j] - modified[i * 1024 + j];
if(diff[i * 1024 + j] < error)
{
num++;
}
}
}
ratio = num/den;
上面的代碼工作在CPU上不錯,但我想嘗試這樣做的CUDA。爲此,我可以設置CUDA執行圖像的基本減法(下面的代碼),但我無法弄清楚如何執行條件if語句來獲取我的比例。
__global__ void calcRatio(float *orig, float *modified, int size, float *result)
{
int index = threadIdx.x + blockIdx.x * blockDim.x;
if(index < size)
result[index] = orig[index] - modified[index];
}
所以,到現在爲止它的工作原理,但我無法弄清楚如何parrallelize的Num和書房計數器在每個線程的所有線程執行結束來計算比例。對我來說,感覺就像num和den counders是獨立於線程的,因爲每次我嘗試使用它們時,似乎它們只會增加一次。
任何幫助將不勝感激,因爲我剛剛開始使用CUDA,並且我在網上看到的每個例子似乎都不適用於我需要做的事情。
編輯:修復了我的天真代碼。忘了輸入代碼中的主要條件之一。這是漫長的一天。
for(int i = 0; i < 128; i++)
{
for(int j = 0; j < 1024; j++)
{
if(modified[i * 1024 + j] < 400.0) //400.0 threshold value to ignore noise
{
den++;
diff[i * 1024 + j] = orig[i * 1024 + j] - modified[i * 1024 + j];
if(diff[i * 1024 + j] < error)
{
num++;
}
}
}
}
ratio = num/den;
感謝talonmies。但我只是意識到我在打字代碼中犯了一個巨大的錯誤。我在記憶中漫長的一天之後輸入了這個內容,因此忘記了一個主要部分。上面編輯我的帖子。 – user656210 2011-04-14 18:20:46
這對代碼幾乎沒有影響。您添加的條件在我發佈的內核的第一個節的循環內進行。 – talonmies 2011-04-14 18:56:06
Ooooo。這大概是我在想什麼......但表達得更清楚。你知道這個操作的名字。這可能在未來有用。 – cgmb 2011-04-15 03:27:29