我正在使用pgi编译器使用openacc。我想知道如何在运行时分析有关内存使用的代码,特别是共享内存?
非常感谢你的帮助!
Behzad
答案 0 :(得分:1)
我假设你是指"共享内存"在CUDA意义上(NVIDIA GPU上的快速,每SM共享内存)。在这种情况下,您有几个选择。
首先,如果您只想知道正在使用多少共享内存,可以在编译时通过添加-Mcuda=ptxinfo
来确定。
pgcc -fast -ta=tesla:cc35 laplace2d.c -Mcuda=ptxinfo
ptxas info : 0 bytes gmem
ptxas info : Compiling entry function 'main_61_gpu' for 'sm_35'
ptxas info : Function properties for main_61_gpu
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 26 registers, 368 bytes cmem[0]
ptxas info : Compiling entry function 'main_65_gpu_red' for 'sm_35'
ptxas info : Function properties for main_65_gpu_red
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 18 registers, 368 bytes cmem[0]
ptxas info : Compiling entry function 'main_72_gpu' for 'sm_35'
ptxas info : Function properties for main_72_gpu
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 18 registers, 344 bytes cmem[0]
在上述情况下,我没有看到我使用任何共享内存。 (后续我与PGI编译工程师交谈,了解到内核启动时动态调整了共享内存,因此不会通过ptxinfo显示。)
您还可以使用NVIDIA Visual Profiler获取此信息。如果您收集GPU时间轴,然后单击特定内核的实例,则应打开属性面板并显示共享内存/块。在我的例子中,上面显示了0字节的共享内存使用,Visual Profiler显示了一些内存被使用,所以我需要深入研究原因。
您也可以在运行时获取一些信息。如果您对命令行感到满意,可以使用nvprof:
# Analyze load/store transactions
$ nvprof -m shared_load_transactions,shared_store_transactions ./a.out
# Analyze shared memory efficiency
# This will result in a LOT of kernel replays.
$ nvprof -m shared_efficiency ./a.out
这并未显示使用的数量,但确实可以让您了解其使用方式。 Visual Profiler的指导分析将让您深入了解这些指标的含义。