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

时间:2012-09-12 12:29:52

标签: memory cuda gpu-constant-memory ptxas

我正在尝试了解手写内核的每个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__个函数。总和为72字节 __global____device__函数的堆栈帧的内存?

  • 0 byte spill stores0 bytes spill loads之间有什么区别

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

此问题在“Interpreting the verbose output of ptxas, part II

中继续”

1 个答案:

答案 0 :(得分:16)

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