【发布时间】:2012-09-05 11:24:24
【问题描述】:
我正在尝试了解我的每个 CUDA 线程的资源使用情况,以用于手写内核。
我用nvcc -arch=sm_20 -ptxas-options=-v 将我的kernel.cu 文件编译为kernel.o 文件
我得到了以下输出(通过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 stores和0 bytes spill loads有什么区别为什么
cmem的信息(我假设它是常量内存)用不同的数字重复了两次?在内核中我没有使用任何常量 记忆。这是否意味着编译器在后台会告诉 GPU 使用一些常量内存?
【问题讨论】:
-
'Used 46 registers' 表示编译器为每个线程保留了 46 个寄存器用于编译的内核,其他寄存器被溢出。您可以通过从内核 PTX 中使用的寄存器总数中减去这个数字 (46) 来找到溢出寄存器的数量。
-
@Ahmad:你的第一句话是正确的,但第二句话不是。内核可以使用少于每个线程允许的最大寄存器,并且不会溢出到本地内存。
-
为了详细说明 talonmies 回复,PTX 是具有无限寄存器的高级抽象。那是因为它可以为多代GPU编译并且寄存器的数量可以不同。只有当您编译为特定于机器的代码时,您才能真正了解寄存器的使用情况。在任何情况下,ptxas(将 PTX 编译为特定于机器的代码)都会告诉您溢出的数量。
-
编译器还使用常量内存来存储数字常量(如果它们太大而无法在指令操作码中硬编码)。虽然我不确定如果你说你自己在程序中不使用常量内存,为什么 cmem 会重复两次
-
curiousexplorer:我已经为这个问题发布了“第二部分”。
标签: memory cuda gpu-constant-memory ptxas