我正在尝试在reqRegs
结构中使用sharedSizeBytes
和cudaFuncAttributes
来在运行时动态优化内核的块大小。
我当前的实现从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。
感谢。
答案 0 :(得分:0)
感谢Robert和Marco的回复。他们帮助我排除了一些案例。
事实证明,报告的共享内存使用率不匹配是由于第一次测试编译(由--ptxas-options=-v
报告)后使用的共享内存量与最终程序使用的共享内存量不同修改后的块大小(由cudaFuncAttributes.sharedSizeBytes
报告)。 (为清晰起见编辑)
共享内存差异是由共享内存阵列分配依赖于块大小引起的;例如:
__shared__ float myArray[BLOCK_SIZE];
上面的语句在块大小为256的程序中使用不同数量的共享内存,而不是使用优化块大小192编译的相同源代码。现在看来很明显,但需要注意的是优化的CUDA代码生成。