有一个奇怪的问题。我有以下代码。当我调用第一个函数时,它没有给出正确的结果。但是,当我调用 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);
}
}
更新:我使用function
andfunction2
来绘制图像。像素值基于图像中心和当前像素位置之间的距离。根据距离,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
它甚至没有启动。