有一個奇怪的問題。我有以下代碼。當我呼叫第一個功能時,它不會給出正確的結果。但是,當我調用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);
}
}
更新: 我用的是function
和function2
繪製的圖像。像素值基於圖像中心和當前像素位置之間的距離。基於距離,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
甚至沒有啓動。
你能解釋一下「正確答案」是什麼嗎?另外你如何啓動'function'和'function2'? –
再次,請添加您的解決方案作爲答案。您可以稍後接受答案,從未回答的問題列表中解決問題。 – talonmies