解释ptxas的详细输出,第二部分

时间:2019-05-16 20:41:23

标签: cuda verbose gpu-shared-memory gpu-constant-memory ptxas

这个问题是Interpreting the verbose output of ptxas, part I的延续。

当我们使用.ptx编译内核ptxas -v文件,或使用.cu-ptxas-options=-v文件进行编译时,我们得到如下几行输出: / p>

ptxas info    : Compiling entry function 'searchkernel(octree, int*, double, int, double*, double*, double*)' for 'sm_20'
ptxas info    : Function properties for searchkernel(octree, int*, double, int, double*, double*, double*)
    72 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 46 registers, 176 bytes cmem[0], 16 bytes cmem[14]

(与链接到的问题相同的示例;但名称已拆散)

该问题以最后一行为准。来自其他内核的更多示例:

ptxas info    : Used 19 registers, 336 bytes cmem[0], 4 bytes cmem[2]
...
ptxas info    : Used 19 registers, 336 bytes cmem[0]
... 
ptxas info    : Used 6 registers, 16 bytes smem, 328 bytes cmem[0]

除了所使用的寄存器数量以外,我们如何解释此行上的信息?具体来说:

  • cmem是恒定内存的缩写吗?
  • 为什么cmem有不同类别,即cmem[0]cmem[2]cmem[14]
  • smem可能代表shared memory;只是静态共享内存吗?
  • 在哪种情况下此行会显示每种条目?

2 个答案:

答案 0 :(得分:3)

  

cmem代表恒定内存吗?

  

为什么有cmem的不同类别,即cmem [0],cmem [2],cmem [14]?

它们代表不同的常量存储库。 cmem[0]是内核参数和静态大小的常量值的保留库。

  

smem可能代表共享内存;仅仅是静态共享内存吗?

是的,否则会怎样。

  

在哪种情况下该行上会显示每种条目?

大多数回答here

答案 1 :(得分:0)

收集并重新格式化...

最后一个ptxas信息行上的资源:

  • registers -每个SM(多处理器)上的寄存器文件中
  • gmem -全局内存
  • smem -静态共享内存
  • cmem[N] -索引为N的恒定存储体。
    • cmem[0] -为内核参数和静态大小的常量值保留的银行
    • cmem[2] -???
    • cmem[4] -???
    • cmem[14] -???

如果内核使用任何此类内存(寄存器-可能始终显示),则将显示这些类别中的每一个;因此,所有示例都显示了一些cmem[0]用法就不足为奇了。

您可以在Section 2.3 of the Programming Guide中的CUDA存储器层次结构及其那里的链接中了解更多信息。此外,还有this blog post关于静态和动态共享内存。