4

我正在尝试全面了解PTXAS -vCUDA 的内核堆栈使用信息和寄存器溢出(对于 sm_35 架构)。对于我的一个内核,它产生:

    3536 bytes stack frame, 3612 bytes spill stores, 6148 bytes spill loads
ptxas info    : Used 255 registers, 392 bytes cmem[0]

我知道堆栈帧是在本地内存中分配的,该内存物理上位于全局内存所在的位置,并且对每个线程都是私有的。

我的问题是:

  1. 寄存器溢出所需的内存是否也在本地内存中分配?
  2. 寄存器溢出和堆栈使用所需的内存总量是否等于 [线程数] x [3536 字节]。因此寄存器溢出加载/存储在堆栈帧上运行?
  3. 溢出存储/加载的数量没有详细说明转移的大小。这些总是32位寄存器吗?因此,一个 64 位浮点数溢出会被算作 2 个溢出存储?
  4. 溢出存储/加载是否缓存在 L2 缓存中?
4

1 回答 1

3
  1. 寄存器溢出到本地内存。“本地”表示“线程本地”,即每个线程私有的存储。
  2. 整个启动所需的本地内存量至少为number_of_threads 乘以 local_memory_bytes_per_thread。由于分配粒度,它通常可以更多。
  3. 溢出传输的编译器统计信息已经标准化为字节,因为各个本地内存访问可能具有不同的宽度。检查生成的机器代码(cuobjdump --dump-sass在二进制文件上运行)将显示各个访问的宽度。相关指令将具有 LLD、LST、LDL、STL 等名称。
  4. 我有理由确定本地内存访问缓存在 L1 和 L2 缓存中,但目前无法引用文档中的相关段落。
于 2013-09-28T20:03:57.433 回答