NVCC ptas=-v 输出

Posted

技术标签:

【中文标题】NVCC ptas=-v 输出【英文标题】:NVCC ptas=-v output 【发布时间】:2014-10-13 17:12:26 【问题描述】:

a 我用“nvcc -ccbin=icpc source/* -Iinclude -arch=sm_35 --ptxas-options=-v 编译了我的程序 "。输出如下:

ptxas info    : 0 bytes gmem
ptxas info    : 0 bytes gmem
ptxas info    : 450 bytes gmem
ptxas info    : Compiling entry function '_Z21process_full_instancePiPViS1_S_' for 'sm_35'
ptxas info    : Function properties for _Z21process_full_instancePiPViS1_S_
    408 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 174 registers, 9748 bytes smem, 352 bytes cmem[0]

我认为gmem指的是全局内存,但是为什么第一行和第三行的geme值不同(0 vs 450)?

smem是共享内存,cmem呢?

内存使用是块还是 SM(流处理器)?块被动态分配给 SM。我们能推断出一个 SM 上会同时运行多少个块吗?

我的 GPU 是 K20。

【问题讨论】:

您是否在内核中使用了全局变量?此外,您的内核每次启动时都会产生相同的结果吗? 我的内核不使用全局变量。但是cudaMalloc的全局内存中有变量。 pxtas 似乎没有从这些变量中报告内存使用情况。 这是您自己的内核还是您使用的是外部库(例如 cublas)? 程序是我自己开发的。 【参考方案1】:

smem是共享内存,cmem呢?

cmem 代表常量内存 gmem 代表全局内存 smem 代表共享内存 lmem 代表本地内存 堆栈帧是本地内存的一部分 溢出加载存储使用部分堆栈帧

内存使用是块还是 SM(流处理器)?

不,寄存器的数量是每个线程的,而共享内存是每个块的。

我们能推断出一个 SM 上会同时运行多少个块吗?

没有。由于您无法确定每个块的线程数,因此您无法计算每个块所需的资源。

【讨论】:

从我的观察来看,内存使用似乎是一个块。在我的示例中,一个块使用大约 9k 共享内存。由于 k20 有高达 48k 的共享内存,因此可以在同一个流处理器上同时运行 5 个块。 在我看来,您需要知道每个线程的寄存器数和每个块的线程数,以确定填充 SM 的块数。每个块的共享内存只是方程式的一部分。 在我的程序中,一个块有 32 个线程。由于每个线程使用 174 个寄存器,那么一个块使用大约 5500 个寄存器? 是的。然后,您将每个块的可用寄存器数除以 5568(每个块的寄存器)和每个线程的可用共享内存,得到这两个数字中的最小值,您将得到每个 SM 的块数。 对于 CC3.5,寄存器分配粒度为 8 个寄存器,每个线程将使用 176 个寄存器。 176 * 32 = 5632。这不足以容纳每个 warp 调度程序 3 个 warp,因此您将被限制为 8 个 warp。如果共享内存使用量为 9K,则每个块的共享内存是限制器。

以上是关于NVCC ptas=-v 输出的主要内容,如果未能解决你的问题,请参考以下文章

nvcc:找不到命令

cuda安装完成后nvcc -V报错

nvcc 在调试模式下编译失败:需要单个文件

如何说服 nvcc 使用 128 位宽负载?

如何将 cuda-gdb 与使用 nvcc 编译的静态库的 g++ 链接程序一起使用?

ubuntu18.04下cuda.cu在c/c++中的三种使用方式