用户
 找回密码
 立即注册
pinx_bu@163.com 该用户已被删除
发表于 2013-9-13 22:20:32
2924326
本帖最后由 pinx_bu@163.com 于 2013-9-13 22:28 编辑

     本人 根据SDK的矩阵乘的例子,进行修改得到简单的对两个矩阵(145*145)做加减运算的程序,wW,wH是矩阵的长和宽,但是发现输出结果不正确,不知道哪里出的问题,希望大家能帮看看。其中的kernel和host程序如下。
__global__ void nvdiCUDA(int *Arr, float *Op, int wW, int wH)
{ int x=threadIdx.x+blockIdx.x*blockDim.x;
   int y=threadIdx.y+blockIdx.y*blockDim.y;
   float value=0;
   if(x<=wW&&y<=wH)
   { value=Arr[59*wW*wH+x*wH+Y]+Arr[27*wW*wH+x*wH+Y];
   }
      Op[x*wH+y]=value;
}
nvdi(int *arr, float *op, dim3 &dimsA, dim3 &dimsO)
{ int *d_arr;
float *d_op ;  (接着分配空间cudamalloc,数值传递cudaMemcpy.....)
   threads(blocksize,blocksize);
   blocks((dimsA.x+blocksize-1)/blocksize,(dimsA.y+blocksize-1)/blocksize);
   nvdiCUDA<<<blocks,threads>>>(d_arr, d_op,dimsA.x,dimsA.y);
  cudaFree....
}
其中dimsA(W,H,B);  dimsO(W,H,1); W为宽,H为高,B是第几个矩阵数据。blocksize等于16;就是有B个相同大小的矩阵列优先依次存在arr指向的内存空间中,矩阵元素都是非零正整数。现要对第59个矩阵和第27个矩阵进行一下简单运算。但是, 我发现输出结果不正确,查看调用运算后的op[0],op[1]始终都是0.000,同时,查看了参照修改的matrixMul例子 的结果是正确的,请问斑竹是哪的问题呢?
使用道具 举报 回复
发表于 2013-9-13 22:22:33
楼主您好,

您的代码至少有如下问题:
您在kernel的运行期间进行了cudaFree。

建议您至少应该在cudaFree()前等待(cudaDeviceSynchronize())kernel完成后再尝试释放缓冲区。

否则您提前的缓冲区释放将导致kernel访存失败。

请立刻修正。

感谢深夜来访。
使用道具 举报 回复 支持 反对
发表于 2013-9-13 22:26:38
以及,楼主您还有一个问题:

如果您的wW和wH分别代表宽和高的话,
您这里的:
if(x<=wW&&y<=wH)

可能需要改写成:
if(x<wW&&y<wH)
方能保证安全的不下标越界。

请您考虑这点。

感谢深夜来访。
使用道具 举报 回复 支持 反对
发表于 2013-9-13 22:35:37
本帖最后由 ice 于 2013-9-13 22:41 编辑

LZ您好:

我来稍微补充一下横扫斑竹。

LZ代码中:
if(x<=wW&&y<=wH)
{ value=Arr[59*wW*wH+x*wH+Y]+Arr[27*wW*wH+x*wH+Y];
   }
      Op[x*wH+y]=value ;

应当将“Op[x*wH+y]=value ”放在if的{}中,这样才合乎算法逻辑。

以及,按照LZ当前的写法,这句赋值对于超出所需范围的线程而言也是执行的,这样很容易出现错误结果乃至直接写越界,导致kernel挂掉。

建议LZ修改此处BUG。

祝您编码顺利~

-------------------------------------------------------------------------------
修正一处笔误,深表歉意。
使用道具 举报 回复 支持 反对
发表于 2013-9-13 22:40:39
横扫千军 发表于 2013-9-13 22:26
以及,楼主您还有一个问题:

如果您的wW和wH分别代表宽和高的话,

非常感谢您, 那么及时的给我回复,之前条件是没有等于wW和wH的,但是结果也是不正确,不过您说的对,我会改正过来的。对2#提的问题,是有可能造成问题的原因,因为现在没在那边实验室,程序不在手边,我明早去改了试一下,在与您讨论。 非常感谢您的帮助。。
使用道具 举报 回复 支持 反对
发表于 2013-9-13 22:46:09
以及,LZ,根据您的代码实现目测您的矩阵存储是列优先存储顺序的,不知是否这样。

如是,则请无视本楼。
如不是,请检查一下您的实现。

祝您好运~
使用道具 举报 回复 支持 反对
发表于 2013-9-13 22:54:26
ice 发表于 2013-9-13 22:35
LZ您好:

我来稍微补充一下横扫斑竹。

  啊恩, 是的哦, 谢谢ice斑竹,我想补充问个问题, 怎么样能调试kernel函数呢, 在VS2010里无法进入kernel内部函数,也无法查看设备端变量值, 就是知道内核函数有问题, 可是无法查看该怎么办呢?
使用道具 举报 回复 支持 反对
发表于 2013-9-13 22:56:08
pinx_bu@163.com 发表于 2013-9-13 22:54
啊恩, 是的哦, 谢谢ice斑竹,我想补充问个问题, 怎么样能调试kernel函数呢, 在VS2010里无法进入ker ...

LZ您好:

您可以立即安装nsight 来调试您的device端代码。

祝您调试顺利~
使用道具 举报 回复 支持 反对
发表于 2013-9-14 09:56:51
横扫千军 发表于 2013-9-13 22:22
楼主您好,

您的代码至少有如下问题:

你好横扫千军斑竹, 在调用kernel后补上cudaDeviceSynchronize()的计算结果输出是有值但还是不正确的。。是 哪里还有问题吗 ?
使用道具 举报 回复 支持 反对
发表于 2013-9-14 09:58:51
ice 发表于 2013-9-13 22:35
LZ您好:

我来稍微补充一下横扫斑竹。

你好ice斑竹,经过相应修改kernel代码, 输出是有值可是结果还是不正确的,不知道 哪里 出了问题呢
使用道具 举报 回复 支持 反对
123下一页
发新帖
您需要登录后才可以回帖 登录 | 立即注册