跳转至主要内容
Version: v1.1.3

Profiler

概述

高性能数字计算是 Taichi 的核心应用领域之一。 我们提供了一组 profiler 协助量化 Taichi 程序的性能,帮助寻找性能瓶颈, 从而便利用户优化他们的代码。 这些性能分析器搜集硬件相关以及 Taichi 相关信息 ,也可以用作开发者的性能调试工具。

目前,Taichi 提供以下性能分析工具:

  • ScopedProfiler 用于分析Taichi JIT compiler (host) 的性能。
  • KernelProfiler 显示Taichi kernels (设备) 的性能,在高级模式下显示详细的性能度量(例如内存带宽消耗)。

ScopedProfiler

ScopedProfiler 跟踪的是执行主机任务所花费的时间。

  1. 这个 profiler 是自动开启的。
  2. 调用 ti.profiler.print_scoped_profiler_info() 以分层的格式显示结果。

For example:

import taichi as ti

ti.init(arch=ti.cpu)
var = ti.field(ti.f32, shape=1)

@ti.kernel
def compute():
var[0] = 1.0
print("Setting var[0] =", var[0])

compute()
ti.profiler.print_scoped_profiler_info()
note

ScopedProfiler is a C++ class in Taichi.

KernelProfiler

KernelProfiler 从后端获取内核的 profiling 记录,在 Python 作用域一一统计,并将结果打印到控制台。

  1. 如要开启该 profiler,请在 ti.init 中设置 kernel_profiler=True
  2. 要显示性能分析结果(profiling results),请调用 ti.profiler.print_kernel_profiler_info()。 有两种打印模式:
    • 'count' 模式(默认模式)下,相同 kernel 名的性能分析记录被记为一条性能分析记录,相应数据也呈现在该 kernel 下。
    • 'trace' 模式下,profiler 会列出硬件在性能分析期间启动的所有 kernel。 这一模式为每个 kernel 提供了详尽的性能以及运行时硬件指标。
  3. 要清除此 profiler 中的记录,请调用 ti.profiler.clear_kernel_profiler_info()

For example:

import taichi as ti

ti.init(ti.cpu, kernel_profiler=True)
x = ti.field(ti.f32, shape=1024*1024)

@ti.kernel
def fill():
for i in x:
x[i] = i

for i in range(8):
fill()
ti.profiler.print_kernel_profiler_info('trace')
ti.profiler.clear_kernel_profiler_info() # clear all records

for i in range(100):
fill()
ti.profiler.print_kernel_profiler_info() # default mode: 'count'

输出应该是:

=========================================================================
X64 Profiler(trace)
=========================================================================
[ % | time ] Kernel name
[ 0.00% | 0.000 ms] jit_evaluator_0_kernel_0_serial
[ 60.11% | 2.668 ms] fill_c4_0_kernel_1_range_for
[ 6.06% | 0.269 ms] fill_c4_0_kernel_1_range_for
[ 5.73% | 0.254 ms] fill_c4_0_kernel_1_range_for
[ 5.68% | 0.252 ms] fill_c4_0_kernel_1_range_for
[ 5.61% | 0.249 ms] fill_c4_0_kernel_1_range_for
[ 5.63% | 0.250 ms] fill_c4_0_kernel_1_range_for
[ 5.61% | 0.249 ms] fill_c4_0_kernel_1_range_for
[ 5.59% | 0.248 ms] fill_c4_0_kernel_1_range_for
-------------------------------------------------------------------------
[100.00%] Total kernel execution time: 0.004 s number of records: 9
=========================================================================
=========================================================================
X64 Profiler(count)
=========================================================================
[ % total count | min avg max ] Kernel name
[100.00% 0.033 s 100x | 0.244 0.329 2.970 ms] fill_c4_0_kernel_1_range_for
-------------------------------------------------------------------------
[100.00%] Total kernel execution time: 0.033 s number of records: 1
=========================================================================
caution

Currently the result of KernelProfiler could be incorrect on OpenGL backend due to its lack of support for ti.sync().

高级模式

对于 CUDA 后端, KernelProfiler 有一个基于 Nvidia CUPTI 的实验性的 GPU 配置工具包。 它具有较少的 deterministic profiling overhead,并且能够获取 6000 多个硬件指标。

使用 CUPTI 的前提条件:

  1. 安装 CUDA Toolkit
  2. 使用 CUDA toolkit 从源代码编译 Taichi:
    • TAICHI_CMAKE_ARGS="-DTI_WITH_CUDA_TOOLKIT:BOOL=ON" python3 setup.py develop --user
  3. 解决了 Nvidia profile 模块的权限问题 (用 sudo 来获得管理员权限):
    • options nvidia NVreg_RestrictProfilingToAdminUsers=0 添加至 /etc/modprobe.d/nvidia-kernel-common.conf
    • 然后 reboot 应该可以解决权限问题 (可能需要在 reboot 之前运行 update-initramfs -u)。
    • 另见 ERR_NVGPUCTRPERM