我有具有多个内核的 CUDA 程序在系列上运行(在同一个流中 - 默认一个)。我想对整个程序进行性能分析,特别是 GPU 部分。我正在使用 nvprof 工具使用一些指标进行分析,例如 completed_occupancy、inst_per_warp、gld_efficiency 等。
但是分析器分别为每个内核提供指标值,而我想为它们计算这些值以查看程序的 GPU 总使用量。我应该为每个指标取所有内核的(平均值或最大值或总数)吗?
我有具有多个内核的 CUDA 程序在系列上运行(在同一个流中 - 默认一个)。我想对整个程序进行性能分析,特别是 GPU 部分。我正在使用 nvprof 工具使用一些指标进行分析,例如 completed_occupancy、inst_per_warp、gld_efficiency 等。
但是分析器分别为每个内核提供指标值,而我想为它们计算这些值以查看程序的 GPU 总使用量。我应该为每个指标取所有内核的(平均值或最大值或总数)吗?
一种可能的方法是使用加权平均方法。
假设我们的时间轴中有 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