19

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

  • 0 byte spill stores和有什么区别0 bytes spill loads

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

这个问题在以下内容中“继续”:解释 ptxas 的详细输出,第二部分

4

1 回答 1

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