解读ptxas的详细输出,第一部分(Interpreting the verbose output

2019-06-28 06:21发布

我想了解每个CUDA我对线程手写的内核资源的利用率。

我编译kernel.cu文件到kernel.o文件, nvcc -arch=sm_20 -ptxas-options=-v

和我得到了以下的输出(穿过c++filt ):

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]

看着上面的输出,是正确地说,

  • 每个CUDA线程使用寄存器46?
  • 没有寄存器溢出到本地内存?

我也有与理解输出的一些问题。

  • 我的内核是调用了一大堆的__device__功能。 IS的总和计72个字节用于的堆栈帧的存储器的__global____device__功能?

  • 是什么区别0 byte spill stores0 bytes spill loads

  • 为什么对信息cmem (这我假设是恒定的内存)有不同的数字重复了两次? 在内核中,我没有使用任何常量内存。 这是否意味着编译器, 引擎盖下 ,要告诉GPU使用的一些常量内存?

:在这个问题是“继续” 解读ptxas的详细输出,第二部分

Answer 1:

  • 每个CUDA线程使用寄存器46? 是,对的
  • 没有寄存器溢出到本地内存? 是,对的
  • 是总和计72个字节用于的堆栈帧的存储器的__global____device__功能? 是,对的
  • 是什么0字节溢出商店和0字节溢出负荷之间的差?
    • 公平的问题,负载可能比商店更大,因为你可能会蔓延计算出的值,加载了一次,丢弃它(即商店东西进入该寄存器),然后再加载(即重复使用)。 更新:另请注意,在下面的意见通过@njuffa描述了漏油加载/存储计数是基于静态分析
  • 为什么对于CMEM的信息(我假设是恒定的内存)有不同的数字重复了两次? 在内核中,我没有使用任何常量内存。 这是否意味着编译器,引擎盖下,要告诉GPU使用的一些常量内存?
    • 恒内存用于几个目的,包括__constant__变量和内核参数,不同的“银行”时,即开始变得有点详细,但只要你用不到64KB为您__constant__超过4KB变量和少内核参数你会好的。


文章来源: Interpreting the verbose output of ptxas, part I