第一次cuda编程,出现写入位置访问冲突,求指点

第一次写自己写cuda程序,就出现了访问冲突,求高手指点。
我编写了一个 光线跟踪 的cuda版本,就是想让每个线程处理得到(SCREEN_WIDTH=512) * (SCREEN_HEIGHT=512)屏幕上的一个像素点,得到颜色。
参数light_t, object_t传入到常量空间,返回512*512的颜色数组h_mem。

以下是关键代码
//////////////////////////////////////////////////////
//kernel
global void Render(unsigned char *o_mem)
{
// 得到该线程处理的元素的屏幕坐标
int x = blockIdx.x * blockDim.x + threadIdx.x;
int y = blockIdx.y * blockDim.y + threadIdx.y;
Ray ray;
ray.start = campos;
ray.dir = getUnitDirForImageCoords(x, y); // 调用device函数,求出每个屏幕像素对应的射线方向

float3 color = getColourForRay(ray); // 调用device函数,求出每根射线的颜色
color = clamp(color, 0.0, 1.0);

//???
//将对应颜色值直接写入到global memory
//考虑到合并访问,将o_mem分成等大小三部分,第一部分放r通道值,第二部分放g通道值,第三部分放b通道值。
// 可问题也出现在下面,说是访问冲突。我想应该没有超出范围才对呀。o_mem大小是SCREEN_WIDTHSCREEN_HEIGHT3
//个uchar。我哪里理解错了吗?

if(y < SCREEN_HEIGHT && x < SCREEN_WIDTH)
{
o_mem[ySCREEN_WIDTH + x] = unsigned char(color.x * 255);
o_mem[mem_size + y
SCREEN_WIDTH + x] = unsigned char(color.y * 255);
o_mem[mem_size2 + ySCREEN_WIDTH + x] = unsigned char(color.z * 255);
}
}

//////////////////////////////////////////////////////
// 调用kernel的函数
void trace(float* object_t, float * light_t, unsigned char* h_mem)
{
// 分配显存空间
unsigned char* d_mem;

cutilSafeCall(cudaMalloc((void**) &d_mem, SCREEN_WIDTHSCREEN_HEIGHT3));
// 传值到常数空间
cutilSafeCall(cudaMemcpyToSymbol(object, object_t, sizeof(object_t)));
cutilSafeCall(cudaMemcpyToSymbol(light, light_t, sizeof(light_t)));

// 设置参数(让每一个thread对应一个像素点)
dim3 block(32,32);
dim3 threads(16,16);
// 调用kernel
Render<<<block, threads>>>(d_mem);

cutilCheckMsg(“Kernel execution failed”);
// 将处理结果拷贝到内存
cutilSafeCall(cudaMemcpy(h_mem, d_mem, mem_size*3, cudaMemcpyDeviceToHost ));

// 释放显存空间
cutilSafeCall(cudaFree(d_mem));
cudaThreadExit();
}

自己先回一下

// 传值到常数空间
cutilSafeCall(cudaMemcpyToSymbol(object, object_t, sizeof(object_t)));
cutilSafeCall(cudaMemcpyToSymbol(light, light_t, sizeof(light_t)));

这里两个函数应该修改成
cutilSafeCall(cudaMemcpyToSymbol(object, object_t, sizeof(object)));
cutilSafeCall(cudaMemcpyToSymbol(light, light_t, sizeof(light)));

将cutilSafeCall(cudaMalloc((void**) &d_mem, SCREEN_WIDTHSCREEN_HEIGHT3));
也改成
cutilSafeCall(cudaMalloc((void**) &d_mem, SCREEN_WIDTHSCREEN_HEIGHT3)*sizeof(unsigned char));

晕,竟然是字节数的问题,这种错误确实很难找啊,一般不会想到是这边出问题

问题没解决呢~错误还在

哦,我以为你自己回复的那段是改正过的呢,呵呵,继续等高手回复吧,呵呵

小心的就好了~

还是没有解决,和硬件有关系的原因?

我看了一遍,我有以下问题,希望能帮到你:
你的kernel中,campos是显存上的变量吗?你的device函数不会有问题吧?clamp函数时设备端函数吗?它能返回float3类型吗?
你出错的地方:你确定mem_size等变量为设备端的变量吗?或者你传参进去了吗?我觉得你这里错了,你的mem_size不是设备端变量。你最好传参解决。我是这么想的。

另外,等你解决了,别忘了告诉大家奥。。:lol

估计是host端代码出问题了把,host内存分配不成功。不知道为什么,反正很简单的代码,那个程序用就是一个cu文件,用vs步进的话,直接跳过了某些语句,其中包括malloc调用