我使用PGI编译器编译了一些OpenACC加速的C++代码。事情似乎在起作用,所以现在我想利用分析信息来发挥效率。
我通过设置:
export PGI_ACC_TIME=1然后运行程序。
以下产出结果:
-bash-4.2$ ./a.out
libcupti.so not found
Accelerator Kernel Timing data
PGI_ACC_SYNCHRONOUS was set, disabling async() clauses
/home/myuser/myprogram.cpp
_MyProgram NVIDIA devicenum=1
time(us): 97,667
75: data region reached 2 times
75: data copyin transfers: 3
device time(us): total=101 max=82 min=9 avg=33
76: compute region reached 1000 times
76: kernel launched 1000 times
grid: [1938] block: [128]
elapsed time(us): total=680,216 max=1,043 min=654 avg=680
95: compute region reached 1000 times
95: kernel launched 1000 times
grid: [1938] block: [128]
elapsed time(us): total=487,365 max=801 min=476 avg=487
110: data region reached 2000 times
110: data copyin transfers: 1000
device time(us): total=6,783 max=140 min=3 avg=6
125: data copyout transfers: 1000
device time(us): total=7,445 max=190 min=6 avg=7
real 0m3.864s
user 0m3.499s
sys 0m0.348s它提出了一些问题:
time(us): 97,667在顶部。这似乎是一个完整的时间,但在底部,我看到了real 0m3.864s。为何会有这样的分别呢?time(us): 97,667是总数,为什么它比值低得多,比如elapsed time(us): total=680,216elapsed time(us): total=680,216 max=1,043 min=654 avg=680)运行了1000次。max、min和avg值是否基于内核的每次运行值?[grid]值和[block]值可能不同,所以经过的总值是否仍然是热点的良好指示?device time(us): total=6,783),是测量传输时间还是处理数据的全部时间(准备传输、接收后操作)?for循环,第95行in是一个闭括号,第110行是一个可变的定义。行号应该解释为“最接近指示行号的循环”,还是以其他方式解释?(这些问题中有一些有点拘谨,但我还没有找到这方面的文档,所以我认为我会很彻底。)
发布于 2017-09-18 18:35:44
这里的部分问题是运行时找不到CUDA分析库(libcupti.so),因此您只看到PGI端分析,而不是设备分析。PGI附带了编译器(在$PGI/linux86-64|linuxpower/2017/cuda/7.5|8.0/lib64)下) libcupti.so库,但这是一个可选的安装,因此您可能没有在运行的系统上安装它。CUPTI还附带了CUDA SDK,所以如果系统有CUDA安装,您可以尝试设置您的LD_LIBRARY_PATH在那里。在我的系统中,它安装在“/opt/cuda-8.0/extras/CUPTI/lib64 64/”中。
丢失的CUPTI库是您查看文件时间的错误时间( 97,667 )的原因。另外,由于你错过了CUPTI,你看到的时间是从主机测量的。使用CUPTI时,除了经过的时间外,您还可以看到每个内核的设备时间。运行时间与设备时间之间的差异是每个内核的启动开销。
max、min和avg值是否基于内核的每次运行值?
是。
4.由于网格值和块值可能不同,经过的总值是否仍然是热点的一个很好的指标?
我倾向于首先查看avg时间,因为通常有更多的机会来优化这些循环。如果您正在改变每个内核迭代的工作量(即网格大小的变化),那么它可能不是那么有用,而是一个很好的起点。
现在,如果您有一个很低的平均值,但是有很多调用,那么经过的时间可能会被内核启动开销所支配。在这种情况下,我想看看您是否可以组合循环或将更多的工作推入每个循环中。
5.对于数据区域(设备时间(Us):total=6,783),是测量传输时间还是处理数据的全部时间(准备传输、接收后操作)?
只是数据传输的时间。对于开销,您需要使用PGPROF/NVPROF。
6.线路编号很奇怪。例如,我的程序中的第76行显然是一个For循环,第95行in是一个闭括号,第110行是一个可变的定义。行号应该解释为“最接近指示行号的循环”,还是以其他方式解释?
这是因为代码经过了优化,所以行号可能有点偏离,尽管它应该与编译器反馈消息(-Minfo=accel)中的行号相对应。所以“循环最接近.”选项应该是正确的。
https://stackoverflow.com/questions/46261407
复制相似问题