1

我有一个带有 a 的内核,#pragma unroll 80我正在使用 NVIDIA GT 285、计算能力 1.3、网格架构运行它:dim3 thread_block( 16, 16 )并且dim3 grid( 40 , 30 )它运行良好。

当我尝试使用 NVIDIA GT 580、计算能力 2.0 和上述网格架构运行它时,它运行良好。

当我将 GT 580 上的网格架构更改为

dim3 thread_block( 32 , 32 )并且dim3 grid( 20 , 15 ),因此产生与上述相同数量的线程,我得到不正确的结果。

如果我在 GT 580 中删除#pragma unroll 80或替换它,它工作正常。#pragma unroll 1如果我不这样做,那么内核就会崩溃。

有谁知道为什么会这样?先感谢您

编辑:检查两个设备上的内核错误,我得到“无效参数”。当我搜索此错误的原因时,我发现当网格和块的尺寸超出其限制时会发生这种情况。但对我来说情况并非如此,因为我每个块使用 16x16=256 个线程和 40x30=1200 个总块。据我所知,这些值位于 GPU 网格的边界内,计算能力为 1.3。我想知道这是否与我遇到的循环展开问题有关。

4

1 回答 1

1

我弄清楚了问题所在。

在修复了一些错误后,我收到了“启动请求资源过多”错误。对于循环展开,每个线程都需要额外的寄存器,并且我的寄存器用完了,因此错误和内核失败。每个线程需要 22 个寄存器,每个块有 1024 个线程。

通过将我的数据插入到 CUDA_Occupancy_calculator 中,它向我显示每个 SM 安排了 1 个块,在计算能力 2.0 设备上为整个块留下了 32678 个寄存器。

22 个寄存器 * 1024 个线程 = 22528 个寄存器<32678,这应该可以工作。但是我使用 nvcc -arch sm_13 使用每个 SM 16384 个寄存器的 CC 1.3 特性进行编译

我使用 nvcc -arch sm_20 编译,利用了 32678 个寄存器,对于所需的 22528 来说绰绰有余,现在它工作正常。感谢大家,我了解了内核错误。

于 2013-04-13T09:34:42.460 回答