楼主: 申宝明

[求助] 急急!CPU函数转到GPU运行输出的数据不一样

[复制链接]
论坛徽章:
0
11#
发表于 2011-3-27 18:30 | 只看该作者
原帖由 申宝明 于 2011-3-27 18:29 发表

这里的我之所以是上面的 是因为 我是先沿着xz平面剖分 然后 再沿着y方向增加的。threadIdx.x; blockIdx.x;blockIdx.y; 如果您不介意 可以加您的QQ  给看看我的程序吗  谢谢先


QQ不在线。。如果这里是故意的。那就完全没有任何问题了。。。太奇怪了。。。

使用道具 举报

回复
论坛徽章:
0
12#
发表于 2011-3-27 18:34 | 只看该作者

回复 #10 申宝明 的帖子

对了。您的意图是:
根据voxelStatus的(x0,y0,z0)处的值,来设置BoxVoxelStatus(x0-W/2,y0-W/2,z0-W/2)到BoxVoxelStatus(x0+W/2,y0+W/2,z0+W/2)的值,最后再取出BoxVoxelStatus里这些值为1的点的坐标吗?

希望我没有理解错。。

使用道具 举报

回复
论坛徽章:
0
13#
 楼主| 发表于 2011-3-27 18:37 | 只看该作者

急急!CPU函数转到GPU运行输出的数据不一样

原帖由 悠闲的小猫 于 2011-3-27 18:30 发表


QQ不在线。。如果这里是故意的。那就完全没有任何问题了。。。太奇怪了。。。

恩 还是谢谢了啊 不知道还有没有人来给解答啊

使用道具 举报

回复
论坛徽章:
0
14#
 楼主| 发表于 2011-3-27 18:39 | 只看该作者

急急!CPU函数转到GPU运行输出的数据不一样

原帖由 悠闲的小猫 于 2011-3-27 18:34 发表
对了。您的意图是:
根据voxelStatus的(x0,y0,z0)处的值,来设置BoxVoxelStatus(x0-W/2,y0-W/2,z0-W/2)到BoxVoxelStatus(x0+W/2,y0+W/2,z0+W/2)的值,最后再取出BoxVoxelStatus里这些值为1的点的坐标吗?

希望我没有理解错。。

恩 恩 是啊是啊 就是这个逻辑啊 输出的是BoxVoxelStatus为1的对应的 x y z值啊 就是这些值和cpu计算出的不一样啊

使用道具 举报

回复
论坛徽章:
0
15#
发表于 2011-3-27 18:44 | 只看该作者
原帖由 申宝明 于 2011-3-27 18:39 发表

恩 恩 是啊是啊 就是这个逻辑啊 输出的是BoxVoxelStatus为1的对应的 x y z值啊 就是这些值和cpu计算出的不一样啊


看了看。。真的完全没问题。。太奇怪了。。。
对了。你看看你这两处:

int x = threadIdx.x-(BoxWidth/2)+jx;
int y = blockIdx.x-(BoxWidth/2)+jy;
int z = blockIdx.y-(BoxWidth/2)+jz;

cudaBoxIndex_X[tmp] = blockIdx.y;//iy
cudaBoxIndex_Y[tmp] = blockIdx.x;//iz
cudaBoxIndex_Z[tmp] = threadIdx.x;//ix
你确定你的确是故意这样而且完全认为正确吗?

[ 本帖最后由 悠闲的小猫 于 2011-3-27 18:46 编辑 ]

使用道具 举报

回复
论坛徽章:
0
16#
 楼主| 发表于 2011-3-27 18:52 | 只看该作者

急急!CPU函数转到GPU运行输出的数据不一样

原帖由 悠闲的小猫 于 2011-3-27 18:44 发表


看了看。。真的完全没问题。。太奇怪了。。。
对了。你看看你这两处:

int x = threadIdx.x-(BoxWidth/2)+jx;
int y = blockIdx.x-(BoxWidth/2)+jy;
int z = blockIdx.y-(BoxWidth/2)+jz;

cudaBoxIndex_X[tmp] = blockIdx.y;//iy
cudaBoxIndex_Y[tmp] = blockIdx.x;//iz
cudaBoxIndex_Z[tmp] = threadIdx.x;//ix
你确定你的确是故意这样而且完全认为正确吗?

cuda中  应该是按threadIdx.x  blockIdx.x  blockIdx.y每个递增的吧 jx jy jz 也是对应的先线程 然后再块的

使用道具 举报

回复
论坛徽章:
0
17#
 楼主| 发表于 2011-3-27 18:53 | 只看该作者

急急!CPU函数转到GPU运行输出的数据不一样

原帖由 悠闲的小猫 于 2011-3-27 18:44 发表


看了看。。真的完全没问题。。太奇怪了。。。
对了。你看看你这两处:

int x = threadIdx.x-(BoxWidth/2)+jx;
int y = blockIdx.x-(BoxWidth/2)+jy;
int z = blockIdx.y-(BoxWidth/2)+jz;

cudaBoxIndex_X[tmp] = blockIdx.y;//iy
cudaBoxIndex_Y[tmp] = blockIdx.x;//iz
cudaBoxIndex_Z[tmp] = threadIdx.x;//ix
你确定你的确是故意这样而且完全认为正确吗?

cudaBoxVoxelStatus 是按这个下标找的啊z  y  x : int boxIndex = z*Depth*Depth+y*Depth+x;

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2011-3-27 19:50 | 只看该作者
原帖由 悠闲的小猫 于 2011-3-27 18:34 发表
对了。您的意图是:
根据voxelStatus的(x0,y0,z0)处的值,来设置BoxVoxelStatus(x0-W/2,y0-W/2,z0-W/2)到BoxVoxelStatus(x0+W/2,y0+W/2,z0+W/2)的值,最后再取出BoxVoxelStatus里这些值为1的点的坐标吗?

希望我没有理解错。。


原帖由 申宝明 于 2011-3-27 18:39 发表

恩 恩 是啊是啊 就是这个逻辑啊 输出的是BoxVoxelStatus为1的对应的 x y z值啊 就是这些值和cpu计算出的不一样啊



我给你举个特例:
假设BoxWidth=2, 同时假设在threadIdx.x为2,blockIdx.x为3,blockIdx.y为4的时候,
才可以满足voxelStatus[index]==0, 那么:


你的第一次kernel标记了
BoxVoxelStatus[]中对应如下的点:
(1,2,3) (2,2,3) (1,3,3) (2,3,3)
(1,2,4) (2,2,4) (1,3,4) (2,3,4)
一共8个。

然后在你的第二个kernel里面,
你却会得到什么呢?根据你的写法, 是:
       cudaBoxIndex_X[],cudaBoxIndex_Y[],cudaBoxIndex_Z[])
偏移a  3,2,1
偏移b  3,2,2  
偏移c  3,3,1
偏移d  3,3,2
偏移e  4,2,1
偏移f  4,2,2
偏移g  4,3,1
偏移h  4,3,2
(a-h是0-7里面的8个数的某种可能的排列)

所以您看。。您第二个kernel取出的结果和您第一个kernel得到的结果,是不是有点不对?

跟据您的写法,您无法得到本回帖的第一段中提出的和第二段中您所确定的目的。

[ 本帖最后由 悠闲的小猫 于 2011-3-27 19:53 编辑 ]

使用道具 举报

回复
论坛徽章:
0
19#
 楼主| 发表于 2011-3-27 20:23 | 只看该作者

急急!CPU函数转到GPU运行输出的数据不一样

原帖由 悠闲的小猫 于 2011-3-27 19:50 发表






我给你举个特例:
假设BoxWidth=2, 同时假设在threadIdx.x为2,blockIdx.x为3,blockIdx.y为4的时候,
才可以满足voxelStatus==0, 那么:


你的第一次kernel标记了
BoxVoxelStatus[]中对应如下的点:
(1,2,3) (2,2,3) (1,3,3) (2,3,3)
(1,2,4) (2,2,4) (1,3,4) (2,3,4)
一共8个。

然后在你的第二个kernel里面,
你却会得到什么呢?根据你的写法, 是:
       cudaBoxIndex_X[],cudaBoxIndex_Y[],cudaBoxIndex_Z[])
偏移a  3,2,1
偏移b  3,2,2  
偏移c  3,3,1
偏移d  3,3,2
偏移e  4,2,1
偏移f  4,2,2
偏移g  4,3,1
偏移h  4,3,2
(a-h是0-7里面的8个数的某种可能的排列)

所以您看。。您第二个kernel取出的结果和您第一个kernel得到的结果,是不是有点不对?

跟据您的写法,您无法得到本回帖的第一段中提出的和第二段中您所确定的目的。

但是 我是这样int boxIndex = z*Depth*Depth+y*Depth+x; 所以在第一段中也是先存的z 即 您举例中的blockIdx.y 。所以在第二个kernel中 应该是blockIdx.y 在前的啊,这个可以由之前的cpu值对应起来的 。另外,我设计的是以voxelStatus==0;的为中心立方体,所以boxwidth按奇数算的。

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2011-3-27 21:47 | 只看该作者
原帖由 申宝明 于 2011-3-27 20:23 发表

但是 我是这样int boxIndex = z*Depth*Depth+y*Depth+x; 所以在第一段中也是先存的z 即 您举例中的blockIdx.y 。所以在第二个kernel中 应该是blockIdx.y 在前的啊,这个可以由之前的cpu值对应起来的 。另外,我设计的是以voxelStatus==0;的为中心立方体,所以boxwidth按奇数算的。



好吧。。。我没有看懂。。我得出的结论只是从您的代码和grid shape(Depth,Depth,1), block shape (Depth,1,1)中得出的。请原谅我的没有理解。
还请高人指点!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表