PAPI 入门#

性能应用程序编程接口(PAPI)是一个库,它在多种平台上提供性能计数器。性能计数器提供了在给定执行过程中处理器行为的准确低级信息。这些信息可以包含简单的指标,如总周期数、缓存未命中和执行的指令,以及更高级别的信息,如总浮点运算次数(FLOPS)和线程束占用率。PAPI 在性能分析时使这些指标可用。

安装 PAPI#

PAPI 可以通过您的包管理器安装(在 Ubuntu 上使用 apt-get install libpapi-dev),或者从源代码安装,源代码位于:icl-utk-edu/papi

从源代码拉取最新版本的 PAPI 曾经引发过构建问题。因此,建议检出标签版本 papi-6-0-0-1-t

构建 带有 PAPI 的 TVM#

要在您的 TVM 构建中包含 PAPI,请在您的 config.cmake 文件中设置以下行:

set(USE_PAPI ON)

如果 PAPI 安装在非标准的位置,您可以像这样指定其路径:

set(USE_PAPI path/to/papi.pc)

在性能分析时使用 PAPI#

如果 TVM 已使用 PAPI 构建(见上文),那么您可以向 tvm.runtime.GraphModule.profile() 传递 tvm.runtime.profiling.PAPIMetricCollector 来收集性能指标。以下是示例:

import tvm
from tvm import relay
from tvm.relay.testing import mlp
from tvm.runtime import profiler_vm
import numpy as np

target = "llvm"
dev = tvm.cpu()
mod, params = mlp.get_workload(1)

exe = relay.vm.compile(mod, target, params=params)
vm = profiler_vm.VirtualMachineProfiler(exe, dev)

data = tvm.nd.array(np.random.rand(1, 1, 28, 28).astype("float32"), device=dev)
report = vm.profile(
    data,
    func_name="main",
    collectors=[tvm.runtime.profiling.PAPIMetricCollector()],
)
print(report)
Name                                    perf::CACHE-MISSES   perf::CYCLES  perf::STALLED-CYCLES-BACKEND  perf::INSTRUCTIONS  perf::STALLED-CYCLES-FRONTEND
fused_nn_dense_nn_bias_add_nn_relu                   2,494      1,570,698                        85,608             675,564                         39,583
fused_nn_dense_nn_bias_add_nn_relu_1                 1,149        655,101                        13,278             202,297                         21,380
fused_nn_dense_nn_bias_add                             288        600,184                         8,321             163,446                         19,513
fused_nn_batch_flatten                                 301        587,049                         4,636             158,636                         18,565
fused_nn_softmax                                       154        575,143                         8,018             160,738                         18,995
----------
Sum                                                  4,386      3,988,175                       119,861           1,360,681                        118,036
Total                                               10,644      8,327,360                       179,310           2,660,569                        270,044

您还可以更改收集的指标:

report = vm.profile(
    data,
    func_name="main",
    collectors=[tvm.runtime.profiling.PAPIMetricCollector({dev: ["PAPI_FP_OPS"]})],
)
Name                                  PAPI_FP_OPS
fused_nn_dense_nn_bias_add_nn_relu        200,832
fused_nn_dense_nn_bias_add_nn_relu_1       16,448
fused_nn_dense_nn_bias_add                  1,548
fused_nn_softmax                              160
fused_nn_batch_flatten                          0
----------
Sum                                       218,988
Total                                     218,988

您可以通过运行 papi_availpapi_native_avail 命令来查看可用指标的列表。