首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释PGI_ACC_TIME输出

解释PGI_ACC_TIME输出
EN

Stack Overflow用户
提问于 2017-09-17 06:41:35
回答 1查看 799关注 0票数 1

我使用PGI编译器编译了一些OpenACC加速的C++代码。事情似乎在起作用,所以现在我想利用分析信息来发挥效率。

我通过设置:

代码语言:javascript
复制
export PGI_ACC_TIME=1

然后运行程序。

以下产出结果:

代码语言:javascript
复制
-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

它提出了一些问题:

  1. 我看到time(us): 97,667在顶部。这似乎是一个完整的时间,但在底部,我看到了real 0m3.864s。为何会有这样的分别呢?
  2. 如果time(us): 97,667是总数,为什么它比值低得多,比如elapsed time(us): total=680,216
  3. 这个内核包括行(elapsed time(us): total=680,216 max=1,043 min=654 avg=680)运行了1000次。max、min和avg值是否基于内核的每次运行值?
  4. 由于[grid]值和[block]值可能不同,所以经过的总值是否仍然是热点的良好指示?
  5. 对于数据区域(device time(us): total=6,783),是测量传输时间还是处理数据的全部时间(准备传输、接收后操作)?
  6. 电话号码很奇怪。例如,我的程序中的第76行显然是一个for循环,第95行in是一个闭括号,第110行是一个可变的定义。行号应该解释为“最接近指示行号的循环”,还是以其他方式解释?
  7. 76的内核包含95的内核。计算76次的时间是否包括在95年内花费的时间?如果是这样的话,有没有一种方便的方法可以找到在内核中花费的时间减去所有子内核的时间?

(这些问题中有一些有点拘谨,但我还没有找到这方面的文档,所以我认为我会很彻底。)

EN

回答 1

Stack Overflow用户

发布于 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)中的行号相对应。所以“循环最接近.”选项应该是正确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46261407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档