CUDA:这与每个线程的注册使用率有关吗?

CUDA:这与每个线程的注册使用率有关吗?,cuda,Cuda,我在开普勒cc3.0上运行了一个3D模具计算。我正在使用 大小为32 x 4 x 4的CUDA块,即512个线程 但有些事情很奇怪。我已经从内核的第一行代码中读取了错误的值,只有当我将问题的大小增加到L=128或更高时,才会得到错误的值,对于正确的填充,总是以2的幂为单位。我认为cc3.0开普勒上每个线程的最大寄存器数量是63。Ptxas输出 ptxas info : Compiling entry function '_Z17kernel_metropolisiiPiS_PfffS_i'

我在开普勒cc3.0上运行了一个3D模具计算。我正在使用 大小为32 x 4 x 4的CUDA块,即512个线程

但有些事情很奇怪。我已经从内核的第一行代码中读取了错误的值,只有当我将问题的大小增加到L=128或更高时,才会得到错误的值,对于正确的填充,总是以2的幂为单位。我认为cc3.0开普勒上每个线程的最大寄存器数量是63。Ptxas输出

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个寄存器,这很好。但是,如果我在内核的前面添加了一个“return”语句(返回代码行),程序会将内核编译成45个寄存器,然后内存读取再次正常

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


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

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

int tid = z*L*L/2 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;
应该是:

int tid = z*L*L/4 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;
该错误导致对随机数生成器向量的越界访问,并导致一系列不幸事件


这是一个非常棘手的问题,因为cuda memcheck没有检测到错误。

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

int tid = z*L*L/2 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;
应该是:

int tid = z*L*L/4 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;
该错误导致对随机数生成器向量的越界访问,并导致一系列不幸事件


这是一个非常棘手的问题,因为cuda memcheck没有检测到错误。

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

int tid = z*L*L/2 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;
应该是:

int tid = z*L*L/4 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;
该错误导致对随机数生成器向量的越界访问,并导致一系列不幸事件


这是一个非常棘手的问题,因为cuda memcheck没有检测到错误。

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

int tid = z*L*L/2 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;
应该是:

int tid = z*L*L/4 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;
该错误导致对随机数生成器向量的越界访问,并导致一系列不幸事件


这非常棘手,因为cuda memcheck没有检测到错误。

“这是每线程寄存器问题的典型症状”什么?如果你想要一个答案,那么你必须向我们展示一些代码,否则我看不出任何人可以如何帮助你。唯一一次“每个线程寄存器”的变化应该导致错误的结果是当内核无法启动时,因为每个线程请求的寄存器太多。在这种情况下很容易被发现。模具操作很难得到正确的结果,尤其是在数据集的边缘,因为总体数据集大小不是模具尺寸的偶数倍。同意Talonmes,并投票关闭。@Talonmes确信我可以显示一些代码。让我准备一些简单的东西。我已经添加了代码并做了更好的解释,我希望你能再次看到这个问题,谢谢。我不想看到你的全部代码。将问题简化为重现问题所需的部分(是的,这需要您的努力),并在问题中发布所有内容,而不是外部链接。这些都是对一个好问题的期望,“这是每个线程注册问题的典型症状”什么?如果你想要一个答案,那么你必须向我们展示一些代码,否则我看不出任何人可以如何帮助你。唯一一次“每个线程寄存器”的变化应该导致错误的结果是当内核无法启动时,因为每个线程请求的寄存器太多。在这种情况下很容易被发现。模具操作很难得到正确的结果,尤其是在数据集的边缘,因为总体数据集大小不是模具尺寸的偶数倍。同意Talonmes,并投票关闭。@Talonmes确信我可以显示一些代码。让我准备一些简单的东西。我已经添加了代码并做了更好的解释,我希望你能再次看到这个问题,谢谢。我不想看到你的全部代码。将问题简化为重现问题所需的部分(是的,这需要您的努力),并在问题中发布所有内容,而不是外部链接。这些都是对一个好问题的期望,“这是每个线程注册问题的典型症状”什么?如果你想要一个答案,那么你必须向我们展示一些代码,否则我看不出任何人可以如何帮助你。唯一一次“每个线程寄存器”的变化应该导致错误的结果是当内核无法启动时,因为每个线程请求的寄存器太多。在这种情况下很容易被发现。模具操作很难得到正确的结果,尤其是在数据集的边缘,因为总体数据集大小不是模具尺寸的偶数倍。同意Talonmes,并投票关闭。@Talonmes确信我可以显示一些代码。让我准备一些简单的东西。我已经添加了代码并做了更好的解释,我希望你能再次看到这个问题,谢谢。我不想看到你的全部代码。将问题简化为重现问题所需的部分(是的,这需要您的努力),并在问题中发布所有内容,而不是外部链接。这些都是对一个好问题的期望,“这是每个线程注册问题的典型症状”什么?如果你想要一个答案,那么你必须向我们展示一些代码,否则我看不出任何人可以如何帮助你。只有当内核无法启动时,“每个线程注册数”的变化才会导致错误的结果