首页 > 解决方案 > 多内核性能分析(CUDA C)

问题描述

我有具有多个内核的 CUDA 程序在系列上运行(在同一个流中 - 默认一个)。我想对整个程序进行性能分析,特别是 GPU 部分。我正在使用 nvprof 工具使用一些指标进行分析,例如 completed_occupancy、inst_per_warp、gld_efficiency 等。

但是分析器分别为每个内核提供指标值,而我想为它们计算这些值以查看程序的 GPU 总使用量。我应该为每个指标取所有内核的(平均值或最大值或总数)吗?

标签: performancecudanvprof

解决方案


一种可能的方法是使用加权平均方法。

假设我们的时间轴中有 3 个不重叠的内核。假设内核 1 运行 10 毫秒,内核 2 运行 20 毫秒,内核 3 运行 30 毫秒。在我们的整个应用程序时间线中,所有 3 个内核总共占用了 60 毫秒。

我们还假设分析器报告 gld_efficiency 指标如下:

kernel     duration    gld_efficiency
     1        10ms               88%
     2        20ms               76%
     3        30ms               50%

您可以按如下方式计算加权平均值:

                                     88*10        76*20        50*30
"overall"  global load efficiency =  -----   +    -----    +   ----- = 65%
                                       60           60           60 

我相信可能还有其他有意义的方法。例如,更好的方法可能是让探查器报告每个内核的全局加载事务总数,并基于此而不是内核持续时间进行加权:

kernel     gld_transactions    gld_efficiency
     1        1000               88%
     2        2000               76%
     3        3000               50%


                                     88*1000        76*2000        50*3000
"overall"  global load efficiency =  -------   +    -------    +   ------- = 65%
                                       6000           6000           6000 

推荐阅读