From 74b0ed0359ffc53af9fdcb1d36c950afcd52099f Mon Sep 17 00:00:00 2001 From: coleramos425 Date: Tue, 11 Apr 2023 17:44:17 -0500 Subject: [PATCH] Update docs with --roof-only example Signed-off-by: coleramos425 --- src/docs/images/sample-roof-plot.png | Bin 0 -> 65881 bytes src/docs/profiling.md | 297 ++++++++++++++++----------- 2 files changed, 178 insertions(+), 119 deletions(-) create mode 100644 src/docs/images/sample-roof-plot.png diff --git a/src/docs/images/sample-roof-plot.png b/src/docs/images/sample-roof-plot.png new file mode 100644 index 0000000000000000000000000000000000000000..2deaba7ad27f7c7fd154c1dab53a9494fe223fff GIT binary patch literal 65881 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

)22FfF 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 SGRVCL{7H)|h?R=G_xm5TtG?&} literal 0 HcmV?d00001 diff --git a/src/docs/profiling.md b/src/docs/profiling.md index c0d3fbddda..5abaaac295 100644 --- a/src/docs/profiling.md +++ b/src/docs/profiling.md @@ -3,7 +3,7 @@ ```eval_rst .. toctree:: :glob: - :maxdepth: 4 + :maxdepth: 5 ``` The [Omniperf](https://github.com/AMDResearch/omniperf) repository @@ -104,50 +104,48 @@ Standalone Roofline Options: L2 vL1D LDS - --axes [ ...] Desired axis values for graph. As follows: - xmin xmax ymin ymax --device GPU device ID. (DEFAULT: ALL) + --kernel-names Include kernel names in roofline plot. ``` -- The `-k` \ flag allows for kernel filtering, which is compatible with the current rocprof utility. - -- The `-d` \ flag allows for dispatch ID filtering, which is compatible with the current rocprof utility. - -- The `-b` \ allows system profiling on one or more selected IP blocks to speed up the profiling process. One can gradually incorporate more IP blocks, without overwriting performance data acquired on other IP blocks. - The following sample command profiles the *vcopy* workload. **vcopy profiling:** ```shell $ omniperf profile --name vcopy -- ./vcopy 1048576 256 +Resolving rocprof ROC Profiler: /usr/bin/rocprof - --------- + + +------------- Profile only --------- - -omniperf ver: v1.0.3 -Path: workloads +------------- + +omniperf ver: 1.0.8-PR1 +Path: /home/colramos/GitHub/omniperf-pub/workloads Target: mi200 -Command: ./vcopy 1048576 256 +Command: /home/colramos/vcopy 1048576 256 Kernel Selection: None Dispatch Selection: None IP Blocks: All -RPL: on '220527_130247' from '/opt/rocm-5.2.0-9768/rocprofiler' in '/home/amd/xlu/test' -RPL: profiling '""./vcopy 1048576 256""' -RPL: input file 'workloads/vcopy/mi200/perfmon/SQ_IFETCH_LEVEL.txt' -RPL: output dir '/tmp/rpl_data_220527_130247_1781699' -RPL: result dir '/tmp/rpl_data_220527_130247_1781699/input0_results_220527_130247' +Log: /home/colramos/GitHub/omniperf-pub/workloads/vcopy/mi200/log.txt + +/home/colramos/GitHub/omniperf-pub/workloads/vcopy/mi200/perfmon/SQ_INST_LEVEL_SMEM.txt +RPL: on '230411_165021' from '/opt/rocm-5.2.1' in '/home/colramos/GitHub/omniperf-pub' +RPL: profiling '""/home/colramos/vcopy 1048576 256""' +RPL: input file '/home/colramos/GitHub/omniperf-pub/workloads/vcopy/mi200/perfmon/SQ_INST_LEVEL_SMEM.txt' +RPL: output dir '/tmp/rpl_data_230411_165021_26406' +RPL: result dir '/tmp/rpl_data_230411_165021_26406/input0_results_230411_165021' Finished allocating vectors on the CPU -ROCProfiler: input from "/tmp/rpl_data_220527_130247_1781699/input0.xml" - gpu_index = - kernel = - range = - 6 metrics - GRBM_COUNT, GRBM_GUI_ACTIVE, SQ_WAVES, SQ_IFETCH, SQ_IFETCH_LEVEL, SQ_ACCUM_PREV_HIRES +ROCProfiler: input from "/tmp/rpl_data_230411_165021_26406/input0.xml" + gpu_index = + kernel = + range = + 3 metrics + SQ_INSTS_SMEM, SQ_INST_LEVEL_SMEM, SQ_ACCUM_PREV_HIRES Finished allocating vectors on the GPU Finished copying vectors to the GPU -sw thinks it moved 1.000000 KB per wave +sw thinks it moved 1.000000 KB per wave Total threads: 1048576, Grid Size: 4096 block Size:256, Wavefronts:16384: Launching the kernel on the GPU Finished executing kernel @@ -206,145 +204,206 @@ Peak MFMA FLOPs (F64), GPU ID: 1, workgroupSize:256, workgroups:16384, experimen 99% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ] Peak MFMA IOPs (I8), GPU ID: 1, workgroupSize:256, workgroups:16384, experiments:100, IOP:2147483648000, duration:14.3 ms, mean:150317.8 GOPS, stdev=203.5 GOPS ``` +You'll notice two stages in *default* Omniperf profiling. The first stage collects all the counters needed for Omniperf analysis (omitting any filters you've provided). The second stage collects data for the roofline analysis (this stage can be disabled using `--no-roof`) At the end of the profiling, all resulting csv files should be located in the SOC specific target directory, e.g., mi200. -> Note: An SoC parameters file, *sysinfo.csv*, is also created to reflect the target device settings. +> Note: Additionally, you'll notice a few extra files. An SoC parameters file, *sysinfo.csv*, is created to reflect the target device settings. All profiling output is stored in *log.txt*. Roofline specific benchmark results are stored in *roofline.csv*. + ```shell $ ls workloads/vcopy/mi200/ -total 116 --rw-rw-r-- 1 amd amd 400 May 27 13:03 SQC_DCACHE_INFLIGHT_LEVEL.csv --rw-rw-r-- 1 amd amd 452 May 27 13:03 SQC_DCACHE_TC_INFLIGHT_LEVEL.csv --rw-rw-r-- 1 amd amd 451 May 27 13:03 SQC_DCACHE_UTCL1_INFLIGHT_LEVEL.csv --rw-rw-r-- 1 amd amd 445 May 27 13:03 SQC_DCACHE_UTCL2_INFLIGHT_LEVEL.csv --rw-rw-r-- 1 amd amd 396 May 27 13:03 SQC_ICACHE_INFLIGHT_LEVEL.csv --rw-rw-r-- 1 amd amd 396 May 27 13:03 SQC_ICACHE_TC_INFLIGHT_LEVEL.csv --rw-rw-r-- 1 amd amd 445 May 27 13:03 SQC_ICACHE_UTCL1_INFLIGHT_LEVEL.csv --rw-rw-r-- 1 amd amd 442 May 27 13:03 SQC_ICACHE_UTCL2_INFLIGHT_LEVEL.csv --rw-rw-r-- 1 amd amd 423 May 27 13:03 SQC_TC_INFLIGHT_LEVEL.csv --rw-rw-r-- 1 amd amd 437 May 27 13:02 SQ_IFETCH_LEVEL.csv --rw-rw-r-- 1 amd amd 374 May 27 13:03 SQ_INST_LEVEL_EXP.csv --rw-rw-r-- 1 amd amd 374 May 27 13:03 SQ_INST_LEVEL_GDS.csv --rw-rw-r-- 1 amd amd 374 May 27 13:02 SQ_INST_LEVEL_LDS.csv --rw-rw-r-- 1 amd amd 392 May 27 13:03 SQ_INST_LEVEL_SMEM.csv --rw-rw-r-- 1 amd amd 392 May 27 13:03 SQ_INST_LEVEL_VMEM.csv --rw-rw-r-- 1 amd amd 516 May 27 13:03 SQ_LEVEL_WAVES.csv -drwxrwxr-x 2 amd amd 4096 May 27 13:02 perfmon --rw-rw-r-- 1 amd amd 32797 May 27 13:03 pmc_perf.csv --rw-rw-r-- 1 amd amd 958 May 27 13:04 roofline.csv --rw-rw-r-- 1 amd amd 469 May 27 13:03 sysinfo.csv --rw-rw-r-- 1 amd amd 317 May 27 13:03 timestamps.csv +total 112 +drwxrwxr-x 3 colramos colramos 4096 Apr 11 16:42 . +drwxrwxr-x 3 colramos colramos 4096 Apr 11 16:42 .. +-rw-rw-r-- 1 colramos colramos 40750 Apr 11 16:44 log.txt +drwxrwxr-x 2 colramos colramos 4096 Apr 11 16:42 perfmon +-rw-rw-r-- 1 colramos colramos 25877 Apr 11 16:42 pmc_perf.csv +-rw-rw-r-- 1 colramos colramos 1716 Apr 11 16:44 roofline.csv +-rw-rw-r-- 1 colramos colramos 429 Apr 11 16:42 SQ_IFETCH_LEVEL.csv +-rw-rw-r-- 1 colramos colramos 366 Apr 11 16:42 SQ_INST_LEVEL_LDS.csv +-rw-rw-r-- 1 colramos colramos 391 Apr 11 16:42 SQ_INST_LEVEL_SMEM.csv +-rw-rw-r-- 1 colramos colramos 384 Apr 11 16:42 SQ_INST_LEVEL_VMEM.csv +-rw-rw-r-- 1 colramos colramos 509 Apr 11 16:42 SQ_LEVEL_WAVES.csv +-rw-rw-r-- 1 colramos colramos 498 Apr 11 16:42 sysinfo.csv +-rw-rw-r-- 1 colramos colramos 309 Apr 11 16:42 timestamps.csv ``` -### IP Block Profiling +### Filtering +To reduce profiling time and the counters collected one may use profiling filters. + +Filtering Options: + +- The `-k` \ flag allows for kernel filtering, which is compatible with the current rocprof utility. + +- The `-d` \ flag allows for dispatch ID filtering, which is compatible with the current rocprof utility. + +- The `-b` \ allows system profiling on one or more selected IP blocks to speed up the profiling process. One can gradually incorporate more IP blocks, without overwriting performance data acquired on other IP blocks. + +#### IP Block Filtering One can profile a selected IP Block to speed up the profiling process. All profiling results are accumulated in the same target directory, without overwriting those for other IP blocks, hence enabling the incremental profiling and analysis. The following example only profiles SQ and TCC, skipping all other IP Blocks. ```shell $ omniperf profile --name vcopy -b SQ TCC -- ./sample/vcopy 1048576 256 +Resolving rocprof ROC Profiler: /usr/bin/rocprof --------- -Profile only --------- -omniperf ver: v1.0.3 -Path: workloads +------------- +Profile only +------------- + +omniperf ver: 1.0.8-PR1 +Path: /home/colramos/GitHub/omniperf-pub/workloads Target: mi200 -Command: ./vcopy 1048576 256 +Command: /home/colramos/vcopy 1048576 256 Kernel Selection: None Dispatch Selection: None IP Blocks: ['SQ', 'TCC'] -fname: pmc_ta_perf: Skipped -fname: pmc_sq_perf3: Added -fname: pmc_sqc_icache_perf2: Skipped -fname: pmc_sqc_dcache_perf2: Skipped -fname: pmc_sqc_dcache_perf3: Skipped -fname: pmc_sqc_icache_perf4: Skipped -fname: pmc_sqc_dcache_perf5: Skipped -fname: pmc_sqc_dcache_perf4: Skipped -fname: pmc_cpc_perf: Skipped -fname: pmc_sqc_icache_perf1: Skipped -fname: pmc_sq_perf4: Added -fname: pmc_sqc_icache_perf5: Skipped -fname: pmc_sq_perf5: Added -fname: pmc_grbm_perf: Skipped -fname: pmc_sq_perf8: Added fname: pmc_sq_perf2: Added -fname: pmc_sq_perf6: Added -fname: pmc_sqc_icache_perf3: Skipped -fname: pmc_sqc_dcache_perf1: Skipped -fname: pmc_sq_perf7: Added -fname: pmc_cpf_perf: Skipped -fname: pmc_sqc_dcache_perf6: Skipped +fname: pmc_td_perf: Skipped +fname: pmc_tcc2_perf: Skipped fname: pmc_tcp_perf: Skipped fname: pmc_spi_perf: Skipped -fname: pmc_td_perf: Skipped +fname: pmc_sq_perf4: Added +fname: pmc_sqc_perf1: Skipped fname: pmc_tcc_perf: Added -fname: pmc_tcc2_perf: Skipped +fname: pmc_cpf_perf: Skipped +fname: pmc_sq_perf8: Added +fname: pmc_cpc_perf: Skipped fname: pmc_sq_perf1: Added -RPL: on '220527_130730' from '/opt/rocm-5.2.0-9768/rocprofiler' in '/home/amd/xlu/test' -RPL: profiling '""./vcopy 1048576 256""' -RPL: input file 'workloads/vcopy/mi200/perfmon/SQ_IFETCH_LEVEL.txt' -RPL: output dir '/tmp/rpl_data_220527_130730_1788165' -RPL: result dir '/tmp/rpl_data_220527_130730_1788165/input0_results_220527_130730' -Finished allocating vectors on the CPU -ROCProfiler: input from "/tmp/rpl_data_220527_130730_1788165/input0.xml" - -... ... -ROCPRofiler: 1 contexts collected, output directory /tmp/rpl_data_220527_130751_1791421/input_results_220527_130751 -File 'workloads/vcopy/mi200/timestamps.csv' is generating -Total detected GPU devices: 2 -GPU Device 0: Profiling... -... ... +fname: pmc_ta_perf: Skipped +fname: pmc_sq_perf3: Added +fname: pmc_sq_perf6: Added +Log: /home/colramos/GitHub/omniperf-pub/workloads/vcopy/mi200/log.txt +... ``` -### Kernel Filtering +#### Kernel Filtering The following example demonstrates profiling on selected kernels: ```shell $ omniperf profile --name vcopy -k vecCopy -- ./vcopy 1048576 256 +Resolving rocprof ROC Profiler: /usr/bin/rocprof - --------- + + +------------- Profile only --------- - -omniperf ver: v1.0.3 -Path: workloads +------------- + +omniperf ver: 1.0.8-PR1 +Path: /home/colramos/GitHub/omniperf-pub/workloads Target: mi200 -Command: ./vcopy 1048576 256 +Command: /home/colramos/vcopy 1048576 256 Kernel Selection: ['vecCopy'] Dispatch Selection: None IP Blocks: All -RPL: on '220527_164748' from '/opt/rocm-5.2.0-9768/rocprofiler' in '/home/amd/xlu/test' -RPL: profiling '""./vcopy 1048576 256""' -RPL: input file 'workloads/vcopy/mi200/perfmon/SQ_IFETCH_LEVEL.txt' -RPL: output dir '/tmp/rpl_data_220527_164748_1795414' -RPL: result dir '/tmp/rpl_data_220527_164748_1795414/input0_results_220527_164748' +Log: /home/colramos/GitHub/omniperf-pub/workloads/vcopy/mi200/log.txt + +/home/colramos/GitHub/omniperf-pub/workloads/vcopy/mi200/perfmon/SQ_INST_LEVEL_SMEM.txt +RPL: on '230411_170300' from '/opt/rocm-5.2.1' in '/home/colramos/GitHub/omniperf-pub' +RPL: profiling '""/home/colramos/vcopy 1048576 256""' +RPL: input file '/home/colramos/GitHub/omniperf-pub/workloads/vcopy/mi200/perfmon/SQ_INST_LEVEL_SMEM.txt' +RPL: output dir '/tmp/rpl_data_230411_170300_29696' +RPL: result dir '/tmp/rpl_data_230411_170300_29696/input0_results_230411_170300' Finished allocating vectors on the CPU -ROCProfiler: input from "/tmp/rpl_data_220527_164748_1795414/input0.xml" - gpu_index = +ROCProfiler: input from "/tmp/rpl_data_230411_170300_29696/input0.xml" + gpu_index = kernel = vecCopy ... ... ``` -### Dispatch Filtering +#### Dispatch Filtering The following example demonstrates profiling on selected dispatches: ```shell $ omniperf profile --name vcopy -d 0 -- ./vcopy 1048576 256 +Resolving rocprof ROC Profiler: /usr/bin/rocprof - --------- + + +------------- Profile only --------- - -omniperf ver: v1.0 -Path: workloads +------------- + +omniperf ver: 1.0.8-PR1 +Path: /home/colramos/GitHub/omniperf-pub/workloads Target: mi200 -Command: ./vcopy 1048576 256 +Command: /home/colramos/vcopy 1048576 256 Kernel Selection: None Dispatch Selection: ['0'] IP Blocks: All -... ... +Log: /home/colramos/GitHub/omniperf-pub/workloads/vcopy/mi200/log.txt + +/home/colramos/GitHub/omniperf-pub/workloads/vcopy/mi200/perfmon/SQ_INST_LEVEL_SMEM.txt +RPL: on '230411_170356' from '/opt/rocm-5.2.1' in '/home/colramos/GitHub/omniperf-pub' +RPL: profiling '""/home/colramos/vcopy 1048576 256""' +RPL: input file '/home/colramos/GitHub/omniperf-pub/workloads/vcopy/mi200/perfmon/SQ_INST_LEVEL_SMEM.txt' +RPL: output dir '/tmp/rpl_data_230411_170356_30314' +RPL: result dir '/tmp/rpl_data_230411_170356_30314/input0_results_230411_170356' +Finished allocating vectors on the CPU +ROCProfiler: input from "/tmp/rpl_data_230411_170356_30314/input0.xml" + gpu_index = + kernel = + range = 0 +... ``` + + + +### Standalone Roofline +If you're only interested in generating roofline analysis data try using `--roof-only`. This will only collect counters relevent to roofline, as well as generate a standalone .pdf output of your roofline plot. + +Standalone Roofline Options: + +- The `--sort` \ allows you to specify whether you'd like to overlay top kernel or top dispatch data in your roofline plot. + +- The `-m` \ allows you to specify specific level(s) of cache you'd like to include in your roofline plot. + +- The `--device` \ allows you to specify a device id to collect performace data from when running our roofline benchmark on your system. + +- If you'd like to distinguish different kernels in your .pdf roofline plot use `--kernel-names`. This will give each kernel a unique marker identifiable from the plot's key. + + +#### Roofline Only +The following example demonstrates profiling roofline data only: +```shell +$ omniperf profile --name vcopy --roof-only -- ./vcopy 1048576 256 +Resolving rocprof +ROC Profiler: /usr/bin/rocprof + + +-------- +Roofline only +-------- + +Checking for roofline.csv in /home/colramos/GitHub/omniperf-pub/workloads/vcopy/mi200 +No roofline data found. Generating... +Empirical Roofline Calculation +Copyright © 2022 Advanced Micro Devices, Inc. All rights reserved. +Total detected GPU devices: 4 +GPU Device 0: Profiling... + 99% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ] + ... ... +Checking for roofline.csv in /home/colramos/GitHub/omniperf-pub/workloads/mix/mi200 +Checking for sysinfo.csv in /home/colramos/GitHub/omniperf-pub/workloads/mix/mi200 +Checking for pmc_perf.csv in /home/colramos/GitHub/omniperf-pub/workloads/mix/mi200 +Empirical Roofline PDFs saved! +``` +An inspection of our workload output folder shows .pdf plots were generated successfully +```shell +total 176 +drwxrwxr-x 3 colramos colramos 4096 Apr 11 17:18 . +drwxrwxr-x 3 colramos colramos 4096 Apr 11 17:15 .. +-rw-rw-r-- 1 colramos colramos 13271 Apr 11 17:18 empirRoof_gpu-ALL_fp32.pdf +-rw-rw-r-- 1 colramos colramos 13175 Apr 11 17:18 empirRoof_gpu-ALL_int8_fp16.pdf +-rw-rw-r-- 1 colramos colramos 26560 Apr 11 17:16 log.txt +drwxrwxr-x 2 colramos colramos 4096 Apr 11 17:16 perfmon +-rw-rw-r-- 1 colramos colramos 54031 Apr 11 17:16 pmc_perf.csv +-rw-rw-r-- 1 colramos colramos 1714 Apr 11 17:16 roofline.csv +-rw-rw-r-- 1 colramos colramos 457 Apr 11 17:16 sysinfo.csv +-rw-rw-r-- 1 colramos colramos 37521 Apr 11 17:16 timestamps.csv +``` +A sample *empirRoof_gpu-ALL_fp32.pdf* looks something like this: + +![Sample Standalone Roof Plot](images/sample-roof-plot.png)