CUDA内核仅适用于1D线程索引

时间:2013-01-19 00:35:46

标签: cuda

有一个奇怪的问题。我有以下代码。当我调用第一个函数时,它没有给出正确的结果。但是,当我调用function2(第二个函数)时,它工作正常。这对我来说太奇怪了。有没有人对这个问题有任何想法?感谢!!!

__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时,生成的图像似乎不会更改。

图像尺寸为W 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甚至没有启动。

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。我为一个块分配了太多线程。我的设备中一个块中的最大线程数为1024。实际上,当我运行cuda-memcheck时,我可以看到function2从未启动过。