CUDA内核只能使用1D线程索引

CUDA内核只能使用1D线程索引,cuda,Cuda,有一个奇怪的问题。我有以下代码。当我调用第一个函数时,它不会给出正确的结果。但是,当我调用function2(第二个函数)时,它工作正常。这对我来说太奇怪了。有人知道这个问题吗?谢谢 __global__ void function(int w, class<double> C, float *result) { int r = threadIdx.x + blockIdx.x * blockDim.x; int c = threadIdx.y + bloc

有一个奇怪的问题。我有以下代码。当我调用第一个函数时,它不会给出正确的结果。但是,当我调用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);  
    }  
}
\uuuuu全局函数(intw,类C,float*result){
int r=threadIdx.x+blockIdx.x*blockDim.x;
int c=线程IDX.y+块IDX.y*块DIM.y;
int-half_w=w/2;
如果(r
更新: 我使用
函数
函数2
绘制图像。像素值基于图像中心和当前像素位置之间的距离。基于距离,C类getVal将计算像素的值。所以,在内核中,我只是让每个线程计算距离和相应的像素值。将正确的结果与CPU版本进行比较。
函数
只是给出一些随机值,一些非常大,一些非常小。当我将
结果[c*w+r]=(float)c.getVal(dis)
更改为
结果[c*w+r]=1.0f
时,生成的图像似乎没有改变

图像大小为W x W,以启动
功能
I设置
dim3网格尺寸(w/64+1,w/64+1)
dim3块_dim(64,64)
功能(W,C,cu_img)

启动
功能2
function2(W、C、cu\u img)

固定的:


我有问题。我给一个块分配了太多线程。在我的设备中,一个块中的最大线程数为1024。实际上,当我运行cuds memcheck时,我可以看到
函数2
甚至没有启动

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

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

你能解释一下“正确答案”是什么吗?另外,您如何启动
函数
函数2
?请再次添加您的解决方案作为答案。你可以稍后接受答案,将问题从未回答的问题列表中删除。你能解释一下“正确答案”是什么吗?另外,您如何启动
函数
函数2
?请再次添加您的解决方案作为答案。您可以稍后接受答案,将问题从未回答的问题列表中删除。