CUDA: - ftxas-options = -v共享内存和cudaFuncAttributes.sharedSizeBytes不匹配

时间:2014-07-11 19:01:24

标签: c++ c cuda ptxas

我正在尝试在reqRegs结构中使用sharedSizeBytescudaFuncAttributes来在运行时动态优化内核的块大小。

我当前的实现从nvcc --ptxas-options=-v浏览stdout文本以发现内核的寄存器和共享内存使用情况。这种方法有点hacky,并且取决于--ptxas-options=-v的输出文本的确切格式,这可能会在没有警告的情况下发生变化。

我的问题是,我发现--ptxas-options=-v输出中报告的'smem'共享内存值与sharedSizeBytes结构中的cudaFuncAttributes之间存在差异,让我担心到目前为止我一直在使用的共享内存估计是错误的,或者sharedSizeBytes变量是不可靠的,这意味着我不能将它用于运行时块大小优化的目的。 这是一个这样的内核nvcc --ptxas-options=-v的输出......

ptxas info    : Used 14 registers, 2088 bytes smem, 48 bytes cmem[1]

...在运行时与cudaFuncAttributes.sharedSizeBytes = 296的值进行比较,对于完全相同的内核。有人知道这里会发生什么吗?

这是另一个使用不同内核的示例:

ptxas info    : Used 18 registers, 2132 bytes smem, 48 bytes cmem[1]

运行时cudaFuncAttributes.sharedSizeBytes = 340。

感谢。

1 个答案:

答案 0 :(得分:0)

感谢Robert和Marco的回复。他们帮助我排除了一些案例。

事实证明,报告的共享内存使用率不匹配是由于第一次测试编译(由--ptxas-options=-v报告)后使用的共享内存量与最终程序使用的共享内存量不同修改后的块大小(由cudaFuncAttributes.sharedSizeBytes报告)。 (为清晰起见编辑)

共享内存差异是由共享内存阵列分配依赖于块大小引起的;例如:

__shared__ float myArray[BLOCK_SIZE];

上面的语句在块大小为256的程序中使用不同数量的共享内存,而不是使用优化块大小192编译的相同源代码。现在看来很明显,但需要注意的是优化的CUDA代码生成。