首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >库达:这与每个线程的注册使用有关吗?

库达:这与每个线程的注册使用有关吗?
EN

Stack Overflow用户
提问于 2014-05-31 06:58:48
回答 1查看 211关注 0票数 0

我有一个三维模具计算运行在开普勒cc3.0。我使用的CUDA块大小为32x4x4,这是512个线程。

不过,有些事很奇怪。只有当我将问题的大小增加到L=128或更高的时候,我才会从内核中的第一行代码中读取错误的值,并且总是以2的幂进行正确填充。在cc3.0开普勒上,每个线程的最大寄存器数量是63,我想。Ptxas输出告诉

代码语言:javascript
运行
复制
ptxas info    : Compiling entry function '_Z17kernel_metropolisiiPiS_PfffS_i' for 'sm_30'
ptxas info    : Function properties for _Z17kernel_metropolisiiPiS_PfffS_i
16 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 48 registers, 8160 bytes smem, 372 bytes cmem[0], 8 bytes cmem[2]

它显示48个寄存器,这是很好的。但是,如果我在内核前面添加了一些代码行,程序将内核编译成45个寄存器,那么内存读取就可以了。

如果选择L=32或L=64,则不会出现此问题,在这些情况下,结果是完美的。我真的不确定这是寄存器问题还是其他问题,因为据我所知,每个线程的寄存器问题不应该通过更改问题大小出现/取消,因为它取决于块配置,当然,内核代码也是这样吗?

一个方向,从哪里开始寻找是好的,足以让我自己去我自己的细节。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-01 06:34:22

内核的问题不是每个线程注册问题,而是下面的行:

代码语言:javascript
运行
复制
int tid = z*L*L/2 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;

这应该是:

代码语言:javascript
运行
复制
int tid = z*L*L/4 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;

这个错误超出了随机数生成器向量的访问权限,并导致发生了一系列不幸事件

这是非常棘手的,因为库达-模查没有检测到错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23967346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档