解释--ptxas-options = -v的输出

cur*_*rer 18 memory cuda ptxas gpu-constant-memory

我试图了解手写内核的每个CUDA线程的资源使用情况.

我把我的kernel.cu文件编译成了一个kernel.o文件nvcc -arch=sm_20 -ptxas-options=-v

我得到了以下输出

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]
Run Code Online (Sandbox Code Playgroud)

看看上面的输出,这是正确的

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

我在理解输出方面也遇到了一些问题.

  • 我的内核调用了很多c++filt函数.IS 72字节是__device____global__函数堆栈帧的内存总和?

  • __device__和之间有什么区别0 byte spill stores

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

Tom*_*Tom 16

  • 每个CUDA线程使用46个寄存器?是,对的
  • 没有寄存器溢出到本地内存?是,对的
  • 72字节是__global____device__函数的堆栈帧的内存总和吗?是,对的
  • 0字节溢出存储和0字节溢出加载有什么区别?
    • 公平的问题,负载可能比存储更大,因为你可以溢出计算值,加载一次,丢弃它(即将其他东西存储到该寄存器中)然后再次加载(即重新使用它).更新:另请注意,溢出加载/存储计数基于@njuffa在下面的注释中描述的静态分析
  • 为什么cmem的信息(我假设是常量记忆)用不同的数字重复两次?在内核中我没有使用任何常量内存.这是否意味着编译器会引导GPU使用一些常量内存?
    • 恒内存用于几个目的,包括__constant__变量和内核参数,不同的"银行"时,即开始变得有点详细,但只要你用不到64KB您__constant__超过4KB变量和更少的内核参数,你会好.

  • 请注意,溢出加载和存储是静态计数的,即本地加载和本地存储指令的数量乘以每个加载/存储的访问宽度.它们被标准化为字节,因为如果有足够的对齐信息并且寄存器分配允许,编译器可能能够对溢出加载/存储进行向量化.由于计数是静态的,因此不直接衡量溢出的流量,因为溢出/填充可能在内部循环中.如果重复使用溢出数据,溢出负载可能超过溢出存储.这意味着溢出加载字节> =溢出存储字节. (3认同)
  • 谢谢@njuffa - 优点.编译器无法知道循环的行程计数(除非编译时常量).真正分析溢出/填充成本的最佳方法是使用Nsight(或独立NVVP)等分析器,它将根据执行而不是编译为您提供数据. (2认同)