2013-01-19 52 views
1

有一個奇怪的問題。我有以下代碼。當我呼叫第一個功能時,它不會給出正確的結果。但是,當我調用function2(第二個函數)時,它工作正常。對我來說太奇怪了。有沒有人有任何關於這個問題的想法?謝謝!!!CUDA內核只能使用1D線程索引

__global__ void function(int w, class<double> C, float *result) { 

    int r = threadIdx.x + blockIdx.x * blockDim.x; 
    int c = threadIdx.y + blockIdx.y * blockDim.y; 
    int half_w = w /2; 

    if (r < w && c < w) { 
     double dis = sort((double)(r - half_w) * (r - half_w) + (double)(c_half_w) * (c - half_w)); 
    result[c * w + r] = (float)C.getVal(dis); 
    } 
} 


__global__ void function2(int w, class<double> C, float *result) { 

    int tid = threadIdx.x + blockIdx.x * blockDim.x; 

    int half_w = w /2; 
    int r = tid/w; 
    int c = tid % w;  

    if (r < w && c < w) { 
     double dis = sort((double)(r - half_w) * (r - half_w) + (double)(c_half_w) * (c - half_w)); 
    result[c * w + r] = (float)C.getVal(dis); 
    } 
} 

更新: 我用的是functionfunction2繪製的圖像。像素值基於圖像中心和當前像素位置之間的距離。基於距離,C類getVal將計算像素的值。所以,在內核中,我只是讓每個線程來計算距離和相應的像素值。將正確的結果與CPU版本進行比較。 function只是給一些非常小的一些非常大的隨機值。當我將result[c * w + r] = (float)C.getVal(dis)更改爲result[c * w +r ] = 1.0f時,生成的圖像看起來不會改變。

的影像尺寸爲寬x W,推出function我設置 dim3 grid_dim(w/64 + 1, w/64 + 1); dim3 block_dim(64, 64); function<<<grid_dim, block_dim>>>(W, C, cu_img);

要啓動function2 function2<<<W/128 + 1, 128>>>(W, C, cu_img)

修正:

我得到了這個問題。我爲一個塊分配了太多的線程。在我的設備中,一個塊中的最大線程數爲1024。其實,當我運行cuds-memcheck時,我可以看到function2甚至沒有啓動。

+0

你能解釋一下「正確答案」是什麼嗎?另外你如何啓動'function'和'function2'? –

+2

再次,請添加您的解決方案作爲答案。您可以稍後接受答案,從未回答的問題列表中解決問題。 – talonmies

回答

1

我解決了這個問題。我爲一個塊分配了太多的線程。在我的設備中,一個塊中的最大線程數爲1024。實際上,當我運行cuda-memcheck時,我可以看到function2還沒有啓動。