taichi.profiler
#
- class taichi.profiler.CuptiMetric(name='', header='unnamed_header', val_format=' {:8.0f} ', scale=1.0)#
A class to add CUPTI metric for
KernelProfiler
.This class is designed to add user selected CUPTI metrics. Only available for the CUDA backend now, i.e. you need
ti.init(kernel_profiler=True, arch=ti.cuda)
. For usage of this class, see examples in funcset_kernel_profiler_metrics()
andcollect_kernel_profiler_metrics()
.- Parameters:
name (str) – name of metric that collected by CUPTI toolkit. used by
set_kernel_profiler_metrics()
andcollect_kernel_profiler_metrics()
.header (str) – column header of this metric, used by
print_kernel_profiler_info()
.val_format (str) – format for print metric value (and unit of this value), used by
print_kernel_profiler_info()
.scale (float) – scale of metric value, used by
print_kernel_profiler_info()
.
Example:
>>> import taichi as ti >>> ti.init(kernel_profiler=True, arch=ti.cuda) >>> num_elements = 128*1024*1024 >>> x = ti.field(ti.f32, shape=num_elements) >>> y = ti.field(ti.f32, shape=()) >>> y[None] = 0 >>> @ti.kernel >>> def reduction(): >>> for i in x: >>> y[None] += x[i] >>> global_op_atom = ti.profiler.CuptiMetric( >>> name='l1tex__t_set_accesses_pipe_lsu_mem_global_op_atom.sum', >>> header=' global.atom ', >>> val_format=' {:8.0f} ') >>> # add and set user defined metrics >>> profiling_metrics = ti.profiler.get_predefined_cupti_metrics('global_access') + [global_op_atom] >>> ti.profiler.set_kernel_profile_metrics(profiling_metrics) >>> for i in range(16): >>> reduction() >>> ti.profiler.print_kernel_profiler_info('trace')
Note
For details about using CUPTI in Taichi, please visit https://docs.taichi-lang.org/docs/profiler#advanced-mode.
- taichi.profiler.clear_kernel_profiler_info()#
Clear all KernelProfiler records.
- taichi.profiler.clear_scoped_profiler_info()#
Clear profiler’s records about time elapsed on the host tasks.
Call function imports from C++ : _ti_core.clear_profile_info()
- taichi.profiler.collect_kernel_profiler_metrics(metric_list=default_cupti_metrics)#
Set temporary metrics that will be collected by the CUPTI toolkit within this context.
- Parameters:
metric_list (list) – a list of
CuptiMetric()
instances, default value:default_cupti_metrics
.
Example:
>>> import taichi as ti >>> ti.init(kernel_profiler=True, arch=ti.cuda) >>> ti.profiler.set_kernel_profiler_toolkit('cupti') >>> num_elements = 128*1024*1024 >>> x = ti.field(ti.f32, shape=num_elements) >>> y = ti.field(ti.f32, shape=()) >>> y[None] = 0 >>> @ti.kernel >>> def reduction(): >>> for i in x: >>> y[None] += x[i] >>> # In the case of not parameter, Taichi will print its pre-defined metrics list >>> ti.profiler.get_predefined_cupti_metrics() >>> # get Taichi pre-defined metrics >>> profiling_metrics = ti.profiler.get_predefined_cupti_metrics('device_utilization') >>> global_op_atom = ti.profiler.CuptiMetric( >>> name='l1tex__t_set_accesses_pipe_lsu_mem_global_op_atom.sum', >>> header=' global.atom ', >>> format=' {:8.0f} ') >>> # add user defined metrics >>> profiling_metrics += [global_op_atom] >>> # metrics setting is temporary, and will be clear when exit from this context. >>> with ti.profiler.collect_kernel_profiler_metrics(profiling_metrics): >>> for i in range(16): >>> reduction() >>> ti.profiler.print_kernel_profiler_info('trace')
Note
The configuration of the
metric_list
will be clear when exit from this context.
- taichi.profiler.get_kernel_profiler_total_time()#
Get elapsed time of all kernels recorded in KernelProfiler.
- Returns:
total time in second.
- Return type:
time (float)
- taichi.profiler.get_predefined_cupti_metrics(name='')#
Returns the specified cupti metric.
Accepted arguments are ‘global_access’, ‘shared_access’, ‘atomic_access’, ‘cache_hit_rate’, ‘device_utilization’.
- Parameters:
name (str) – cupti metri name.
- taichi.profiler.print_kernel_profiler_info(mode='count')#
Print the profiling results of Taichi kernels.
To enable this profiler, set
kernel_profiler=True
inti.init()
.'count'
mode: print the statistics (min,max,avg time) of launched kernels,'trace'
mode: print the records of launched kernels with specific profiling metrics (time, memory load/store and core utilization etc.), and defaults to'count'
.- Parameters:
mode (str) – the way to print profiling results.
Example:
>>> import taichi as ti >>> ti.init(ti.cpu, kernel_profiler=True) >>> var = ti.field(ti.f32, shape=1) >>> @ti.kernel >>> def compute(): >>> var[0] = 1.0 >>> compute() >>> ti.profiler.print_kernel_profiler_info() >>> # equivalent calls : >>> # ti.profiler.print_kernel_profiler_info('count') >>> ti.profiler.print_kernel_profiler_info('trace')
Note
Currently the result of KernelProfiler could be incorrect on OpenGL backend due to its lack of support for ti.sync().
For advanced mode of KernelProfiler, please visit https://docs.taichi-lang.org/docs/profiler#advanced-mode.
- taichi.profiler.print_memory_profiler_info()#
Memory profiling tool for LLVM backends with full sparse support.
This profiler is automatically on.
- taichi.profiler.print_scoped_profiler_info()#
Print time elapsed on the host tasks in a hierarchical format.
This profiler is automatically on.
Call function imports from C++ : _ti_core.print_profile_info()
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()
- taichi.profiler.query_kernel_profiler_info(name)#
Query kernel elapsed time(min,avg,max) on devices using the kernel name.
To enable this profiler, set kernel_profiler=True in ti.init.
- Parameters:
name (str) – kernel name.
- Returns:
with member variables(counter, min, max, avg)
- Return type:
KernelProfilerQueryResult (class)
Example:
>>> import taichi as ti >>> ti.init(ti.cpu, kernel_profiler=True) >>> n = 1024*1024 >>> var = ti.field(ti.f32, shape=n) >>> @ti.kernel >>> def fill(): >>> for i in range(n): >>> var[i] = 0.1 >>> fill() >>> ti.profiler.clear_kernel_profiler_info() #[1] >>> for i in range(100): >>> fill() >>> query_result = ti.profiler.query_kernel_profiler_info(fill.__name__) #[2] >>> print("kernel executed times =",query_result.counter) >>> print("kernel elapsed time(min_in_ms) =",query_result.min) >>> print("kernel elapsed time(max_in_ms) =",query_result.max) >>> print("kernel elapsed time(avg_in_ms) =",query_result.avg)
Note
[1] To get the correct result, query_kernel_profiler_info() must be used in conjunction with clear_kernel_profiler_info().
[2] Currently the result of KernelProfiler could be incorrect on OpenGL backend due to its lack of support for ti.sync().
- taichi.profiler.set_kernel_profiler_metrics(metric_list=default_cupti_metrics)#
Set metrics that will be collected by the CUPTI toolkit.
- Parameters:
metric_list (list) – a list of
CuptiMetric()
instances, default value:default_cupti_metrics
.
Example:
>>> import taichi as ti >>> ti.init(kernel_profiler=True, arch=ti.cuda) >>> ti.profiler.set_kernel_profiler_toolkit('cupti') >>> num_elements = 128*1024*1024 >>> x = ti.field(ti.f32, shape=num_elements) >>> y = ti.field(ti.f32, shape=()) >>> y[None] = 0 >>> @ti.kernel >>> def reduction(): >>> for i in x: >>> y[None] += x[i] >>> # In the case of not parameter, Taichi will print its pre-defined metrics list >>> ti.profiler.get_predefined_cupti_metrics() >>> # get Taichi pre-defined metrics >>> profiling_metrics = ti.profiler.get_predefined_cupti_metrics('shared_access') >>> global_op_atom = ti.profiler.CuptiMetric( >>> name='l1tex__t_set_accesses_pipe_lsu_mem_global_op_atom.sum', >>> header=' global.atom ', >>> format=' {:8.0f} ') >>> # add user defined metrics >>> profiling_metrics += [global_op_atom] >>> # metrics setting will be retained until the next configuration >>> ti.profiler.set_kernel_profiler_metrics(profiling_metrics) >>> for i in range(16): >>> reduction() >>> ti.profiler.print_kernel_profiler_info('trace')
Note
Metrics setting will be retained until the next configuration.
- taichi.profiler.set_kernel_profiler_toolkit(toolkit_name='default')#
Set the toolkit used by KernelProfiler.
Currently, we only support toolkits:
'default'
and'cupti'
.- Parameters:
toolkit_name (str) – string of toolkit name.
- Returns:
whether the setting is successful or not.
- Return type:
status (bool)
Example:
>>> import taichi as ti >>> ti.init(arch=ti.cuda, kernel_profiler=True) >>> x = ti.field(ti.f32, shape=1024*1024) >>> @ti.kernel >>> def fill(): >>> for i in x: >>> x[i] = i >>> ti.profiler.set_kernel_profiler_toolkit('cupti') >>> for i in range(100): >>> fill() >>> ti.profiler.print_kernel_profiler_info() >>> ti.profiler.set_kernel_profiler_toolkit('default') >>> for i in range(100): >>> fill() >>> ti.profiler.print_kernel_profiler_info()