From 02ce579dfd00a0862217b9bce5dad0b61b79e10d Mon Sep 17 00:00:00 2001 From: chenxizhu Date: Sat, 18 Jul 2026 01:47:50 +0000 Subject: [PATCH] update mla --- .../.20260717093933.db | Bin 0 -> 36864 bytes .../.20260717093957.db | Bin 0 -> 36864 bytes .../.20260717094001.db | Bin 0 -> 36864 bytes .../.20260717094852.db | Bin 0 -> 86016 bytes .../.20260717095613.db | Bin 0 -> 86016 bytes .../FlashinferRaggedPrefill/profiler.log | 2791 +++++++ .../results/opt_012_local_correctness.csv | 7 + .../results/opt_013_local_correctness.csv | 7 + .../results/opt_014_local_correctness.log | 60 + .../results/opt_015_local_correctness.log | 59 + .../tilelang/tilelang_oj_results_opt_012.csv | 16 + .../tilelang/tilelang_oj_results_opt_012.md | 66 + ...ernel_dense_softmax_cleanup_v12_kernel.txt | 46 + ...l_dense_softmax_cleanup_v12_kernel.txt.csv | 17 + ..._dense_softmax_cleanup_v12_kernel.txt.json | 56 + ...tmax_cleanup_v12_kernel_dumped_result.json | 61 + ...ernel_dense_softmax_cleanup_v12_kernel.txt | 46 + ...l_dense_softmax_cleanup_v12_kernel.txt.csv | 17 + ..._dense_softmax_cleanup_v12_kernel.txt.json | 56 + ...tmax_cleanup_v12_kernel_dumped_result.json | 61 + ...U_stall_cycles_layout20260717095701860.png | Bin 0 -> 40785 bytes ...U_stall_cycles_layout20260717095702187.png | Bin 0 -> 39652 bytes ...U_stall_cycles_layout20260717095702353.png | Bin 0 -> 39652 bytes ...U_stall_cycles_layout20260717095702519.png | Bin 0 -> 39636 bytes ...U_stall_cycles_layout20260717095702687.png | Bin 0 -> 39636 bytes .../mcprofiler_opt012_case4_duty/batches.json | 25 + .../event_batch_0.json | 134 + .../mcProfiler.json | 134 + .../opt012_case4_duty.json | 189 + .../mcprofiler_opt012_case4_duty/report.pdf | 94 + .../mcprofiler_opt012_case4_duty/report.txt | 46 + .../report.txt.csv | 17 + .../report.txt.json | 56 + .../report_dumped_result.json | 61 + .../report_js.html | 25 + ...ernel_dense_softmax_cleanup_v12_kernel.txt | 64 + ...l_dense_softmax_cleanup_v12_kernel.txt.csv | 20 + ..._dense_softmax_cleanup_v12_kernel.txt.json | 77 + ...tmax_cleanup_v12_kernel_dumped_result.json | 85 + ...ernel_dense_softmax_cleanup_v12_kernel.txt | 64 + ...l_dense_softmax_cleanup_v12_kernel.txt.csv | 20 + ..._dense_softmax_cleanup_v12_kernel.txt.json | 77 + ...tmax_cleanup_v12_kernel_dumped_result.json | 85 + ...U_stall_cycles_layout20260717094940283.png | Bin 0 -> 40387 bytes ...U_stall_cycles_layout20260717094940634.png | Bin 0 -> 39711 bytes ...U_stall_cycles_layout20260717094940809.png | Bin 0 -> 39711 bytes ...U_stall_cycles_layout20260717094940987.png | Bin 0 -> 39805 bytes ...U_stall_cycles_layout20260717094941164.png | Bin 0 -> 39805 bytes .../batches.json | 40 + .../event_batch_0.json | 208 + .../mcProfiler.json | 208 + .../opt012_case4_targeted.json | 249 + .../report.pdf | 113 + .../report.txt | 64 + .../report.txt.csv | 20 + .../report.txt.json | 77 + .../report_dumped_result.json | 85 + .../report_js.html | 49 + .../tracer_out-98428.json | 6997 +++++++++++++++++ .../tilelang_64g/opt_012_benchmark.csv | 16 + .../tilelang_64g/opt_012_case4_mcprofiler.log | 407 + .../opt_012_case4_mcprofiler_analysis_64g.md | 149 + .../opt_012_case4_mcprofiler_duty.log | 385 + .../opt_012_case4_mctracer_analysis_64g.md | 147 + .../opt_015_case4_device_kernel.cu | 168 + .../tilelang_64g/opt_015_case4_host_kernel.cu | 194 + .../opt_018_case4_device_kernel.cu | 167 + .../tilelang_64g/opt_018_case4_host_kernel.cu | 193 + .../tests/benchmark_tilelang_64g_opt012.py | 178 + .../tests/test_opt_012_formal.py | 108 + ..._012_dense_softmax_cleanup.cpython-312.pyc | Bin 18242 -> 18242 bytes .../opt_013_dispatch_improved.cpython-312.pyc | Bin 0 -> 18600 bytes .../opt_014_pv_fullcol.cpython-312.pyc | Bin 0 -> 18300 bytes ...pt_015_v_prefetch_after_qk.cpython-312.pyc | Bin 0 -> 18216 bytes ..._016_square_warp_partition.cpython-312.pyc | Bin 0 -> 18302 bytes ..._017_skip_identity_rescale.cpython-312.pyc | Bin 0 -> 18272 bytes ...t_018_factor_softmax_scale.cpython-312.pyc | Bin 0 -> 18208 bytes .../__pycache__/run_kernel.cpython-312.pyc | Bin 17581 -> 18223 bytes .../tilelang/opt_014_pv_fullcol.py | 725 ++ .../tilelang/opt_015_v_prefetch_after_qk.py | 719 ++ .../tilelang/opt_016_square_warp_partition.py | 724 ++ .../tilelang/opt_017_skip_identity_rescale.py | 719 ++ .../tilelang/opt_018_factor_softmax_scale.py | 716 ++ .../FlashinferRaggedPrefill/tilelang_opt.md | 209 + .../workflows/references/README.md | 1 + ...tilelang_kernel_optimization_directions.md | 264 + race_tests/mla/README.md | 43 + .../test_tilelang_mla.cpython-312.pyc | Bin 0 -> 20715 bytes race_tests/mla/problem_statement.md | 174 + race_tests/mla/test_cases_mla_batch_ctx.json | 33 + race_tests/mla/test_tilelang_mla.py | 290 + race_tests/mla/tilelang/README.md | 27 + .../baseline_adapter.cpython-312.pyc | Bin 0 -> 973 bytes .../opt_001_adaptive_split.cpython-312.pyc | Bin 0 -> 10356 bytes ...opt_002_batch1_split_table.cpython-312.pyc | Bin 0 -> 10553 bytes .../__pycache__/run_kernel.cpython-312.pyc | Bin 0 -> 10344 bytes race_tests/mla/tilelang/baseline_adapter.py | 41 + race_tests/mla/tilelang/mla_opt.md | 169 + .../mla/tilelang/opt_001_adaptive_split.py | 272 + .../tilelang/opt_002_batch1_split_table.py | 284 + race_tests/mla/tilelang/run_kernel.py | 284 + race_tests/mla/tilelang/test_candidate.py | 118 + race_tests/mla/赛题一mla教程.md | 361 + race_tests/moe/README.md | 38 + race_tests/moe/custom_fusedmoe.py | 211 + race_tests/moe/fusedmoe_benchmark.py | 353 + race_tests/moe/moe_test_configs.json | 42 + race_tests/moe/ref_fusedmoe.py | 116 + race_tests/moe/run.sh | 1 + race_tests/nsa/reference.py | 305 + race_tests/nsa/test_cases_nsa_fwd.json | 1092 +++ race_tests/nsa/test_tilelang_nsa_fwd.py | 310 + .../correctness_and_experiments.md | 40 + .../operator_optimization_lifecycle.md | 51 + .../optimization_decision_tree.md | 18 + ref/01_methodology/performance_modeling.md | 45 + .../metax_c500/architecture_facts.md | 40 + .../metax_c500/execution_and_memory.md | 39 + .../metax_c500/mma_and_resources.md | 28 + ref/02_architecture/metax_c500/sources.md | 29 + .../cudamaca/programming_and_flashinfer.md | 35 + .../tilelang/generated_code_review.md | 41 + .../tilelang/programming_and_compilation.md | 38 + ref/04_profiling/mcprofiler.md | 37 + ref/04_profiling/mctracer.md | 35 + ref/04_profiling/metric_dictionary.md | 19 + ref/04_profiling/profiling_workflow.md | 28 + .../mma_pipeline_and_prefetch.md | 34 + .../reduction_softmax_and_control.md | 27 + .../specialization_and_load_balance.md | 31 + .../tiling_ownership_and_memory.md | 40 + ref/06_failure_catalog/common_failures.md | 35 + .../flashinfer_ragged_prefill/README.md | 31 + .../case4_profiler.md | 39 + .../cudamaca_history.md | 22 + .../tilelang_history.md | 31 + .../tilelang_vs_flashinfer.md | 89 + ref/08_templates/experiment_record.md | 43 + ref/08_templates/new_operator_checklist.md | 38 + ref/08_templates/profiling_report.md | 38 + ref/08_templates/version_decision_log.md | 21 + .../flashinfer_ragged_prefill.md | 66 + ref/README.md | 51 + 143 files changed, 24661 insertions(+) create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/.20260717093933.db create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/.20260717093957.db create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/.20260717094001.db create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/.20260717094852.db create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/.20260717095613.db create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/profiler.log create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_012_local_correctness.csv create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_013_local_correctness.csv create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_014_local_correctness.log create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_015_local_correctness.log create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang/tilelang_oj_results_opt_012.csv create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang/tilelang_oj_results_opt_012.md create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095701860.png create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702187.png create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702353.png create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702519.png create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702687.png create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/batches.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/event_batch_0.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/mcProfiler.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/opt012_case4_duty.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.pdf create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt.csv create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report_dumped_result.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report_js.html create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940283.png create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940634.png create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940809.png create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940987.png create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094941164.png create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/batches.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/event_batch_0.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/mcProfiler.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/opt012_case4_targeted.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.pdf create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt.csv create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report_dumped_result.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report_js.html create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mctracer_opt012_case4/tracer_out-98428.json create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_benchmark.csv create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler.log create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler_analysis_64g.md create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler_duty.log create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mctracer_analysis_64g.md create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_015_case4_device_kernel.cu create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_015_case4_host_kernel.cu create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_018_case4_device_kernel.cu create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_018_case4_host_kernel.cu create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tests/benchmark_tilelang_64g_opt012.py create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tests/test_opt_012_formal.py create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_013_dispatch_improved.cpython-312.pyc create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_014_pv_fullcol.cpython-312.pyc create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_015_v_prefetch_after_qk.cpython-312.pyc create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_016_square_warp_partition.cpython-312.pyc create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_017_skip_identity_rescale.cpython-312.pyc create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_018_factor_softmax_scale.cpython-312.pyc create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_014_pv_fullcol.py create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_015_v_prefetch_after_qk.py create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_016_square_warp_partition.py create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_017_skip_identity_rescale.py create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_018_factor_softmax_scale.py create mode 100644 flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/workflows/references/tilelang_kernel_optimization_directions.md create mode 100644 race_tests/mla/README.md create mode 100644 race_tests/mla/__pycache__/test_tilelang_mla.cpython-312.pyc create mode 100644 race_tests/mla/problem_statement.md create mode 100644 race_tests/mla/test_cases_mla_batch_ctx.json create mode 100644 race_tests/mla/test_tilelang_mla.py create mode 100644 race_tests/mla/tilelang/README.md create mode 100644 race_tests/mla/tilelang/__pycache__/baseline_adapter.cpython-312.pyc create mode 100644 race_tests/mla/tilelang/__pycache__/opt_001_adaptive_split.cpython-312.pyc create mode 100644 race_tests/mla/tilelang/__pycache__/opt_002_batch1_split_table.cpython-312.pyc create mode 100644 race_tests/mla/tilelang/__pycache__/run_kernel.cpython-312.pyc create mode 100644 race_tests/mla/tilelang/baseline_adapter.py create mode 100644 race_tests/mla/tilelang/mla_opt.md create mode 100644 race_tests/mla/tilelang/opt_001_adaptive_split.py create mode 100644 race_tests/mla/tilelang/opt_002_batch1_split_table.py create mode 100644 race_tests/mla/tilelang/run_kernel.py create mode 100644 race_tests/mla/tilelang/test_candidate.py create mode 100644 race_tests/mla/赛题一mla教程.md create mode 100644 race_tests/moe/README.md create mode 100644 race_tests/moe/custom_fusedmoe.py create mode 100644 race_tests/moe/fusedmoe_benchmark.py create mode 100644 race_tests/moe/moe_test_configs.json create mode 100644 race_tests/moe/ref_fusedmoe.py create mode 100644 race_tests/moe/run.sh create mode 100644 race_tests/nsa/reference.py create mode 100644 race_tests/nsa/test_cases_nsa_fwd.json create mode 100644 race_tests/nsa/test_tilelang_nsa_fwd.py create mode 100644 ref/01_methodology/correctness_and_experiments.md create mode 100644 ref/01_methodology/operator_optimization_lifecycle.md create mode 100644 ref/01_methodology/optimization_decision_tree.md create mode 100644 ref/01_methodology/performance_modeling.md create mode 100644 ref/02_architecture/metax_c500/architecture_facts.md create mode 100644 ref/02_architecture/metax_c500/execution_and_memory.md create mode 100644 ref/02_architecture/metax_c500/mma_and_resources.md create mode 100644 ref/02_architecture/metax_c500/sources.md create mode 100644 ref/03_backends/cudamaca/programming_and_flashinfer.md create mode 100644 ref/03_backends/tilelang/generated_code_review.md create mode 100644 ref/03_backends/tilelang/programming_and_compilation.md create mode 100644 ref/04_profiling/mcprofiler.md create mode 100644 ref/04_profiling/mctracer.md create mode 100644 ref/04_profiling/metric_dictionary.md create mode 100644 ref/04_profiling/profiling_workflow.md create mode 100644 ref/05_optimization_patterns/mma_pipeline_and_prefetch.md create mode 100644 ref/05_optimization_patterns/reduction_softmax_and_control.md create mode 100644 ref/05_optimization_patterns/specialization_and_load_balance.md create mode 100644 ref/05_optimization_patterns/tiling_ownership_and_memory.md create mode 100644 ref/06_failure_catalog/common_failures.md create mode 100644 ref/07_case_studies/flashinfer_ragged_prefill/README.md create mode 100644 ref/07_case_studies/flashinfer_ragged_prefill/case4_profiler.md create mode 100644 ref/07_case_studies/flashinfer_ragged_prefill/cudamaca_history.md create mode 100644 ref/07_case_studies/flashinfer_ragged_prefill/tilelang_history.md create mode 100644 ref/07_case_studies/flashinfer_ragged_prefill/tilelang_vs_flashinfer.md create mode 100644 ref/08_templates/experiment_record.md create mode 100644 ref/08_templates/new_operator_checklist.md create mode 100644 ref/08_templates/profiling_report.md create mode 100644 ref/08_templates/version_decision_log.md create mode 100644 ref/09_artifact_index/flashinfer_ragged_prefill.md create mode 100644 ref/README.md diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/.20260717093933.db b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/.20260717093933.db new file mode 100644 index 0000000000000000000000000000000000000000..40000d94e3fc1d852ad016b7d229f6c47b36c2ba GIT binary patch literal 36864 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 literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/.20260717095613.db b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/.20260717095613.db new file mode 100644 index 0000000000000000000000000000000000000000..df5ee4264a6a407706c9360251ddb596ded23788 GIT binary patch literal 86016 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 RPJ`>TjnnU<-x=+x`*-ZnHShoc literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/profiler.log b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/profiler.log new file mode 100644 index 0000000..bfe876c --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/profiler.log @@ -0,0 +1,2791 @@ +2026-07-17 09:39:32,268 DEBUG matplotlib: (private) matplotlib data path: /tmp/_MEINuhn2f/matplotlib/mpl-data +2026-07-17 09:39:32,269 DEBUG matplotlib: matplotlib data path: /tmp/_MEINuhn2f/matplotlib/mpl-data +2026-07-17 09:39:32,273 DEBUG matplotlib: CONFIGDIR=/tmp/tmpg2oj6jsu +2026-07-17 09:39:32,276 DEBUG matplotlib: matplotlib version 3.3.4 +2026-07-17 09:39:32,276 DEBUG matplotlib: interactive is False +2026-07-17 09:39:32,276 DEBUG matplotlib: platform is linux +2026-07-17 09:39:32,276 DEBUG matplotlib: loaded modules: ['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread', '_weakref', '_frozen_importlib_external', '_io', 'marshal', 'posix', 'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.ascii', '_signal', '__main__', 'encodings.utf_8', 'encodings.latin_1', 'io', 'abc', '_weakrefset', '_bootlocale', '_locale', 'struct', '_struct', 'pyimod01_os_path', 'pyimod02_archive', 'zlib', 'pyimod03_importers', 'pyimod04_ctypes', 'os', 'errno', 'stat', '_stat', 'posixpath', 'genericpath', 'os.path', '_collections_abc', 'ctypes', '_ctypes', 'ctypes._endian', 'pkgutil', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'functools', '_functools', 'types', 'collections.abc', 'weakref', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib.util', 'importlib.abc', 'importlib.machinery', 'contextlib', 'inspect', 'ast', '_ast', 'dis', 'opcode', '_opcode', 'enum', 'linecache', 'tokenize', 're', 'sre_compile', '_sre', 'sre_parse', 'sre_constants', 'copyreg', 'token', 'pathlib', 'fnmatch', 'ntpath', 'urllib', 'urllib.parse', 'pkg_resources', 'time', 'zipfile', 'shutil', 'bz2', '_compression', 'threading', 'traceback', '_bz2', 'lzma', '_lzma', 'pwd', 'grp', 'binascii', 'platform', 'subprocess', 'signal', '_posixsubprocess', 'select', 'selectors', 'math', 'plistlib', 'datetime', '_datetime', 'xml', 'xml.parsers', 'xml.parsers.expat', 'pyexpat.errors', 'pyexpat.model', 'pyexpat', 'xml.parsers.expat.model', 'xml.parsers.expat.errors', 'email', 'email.parser', 'email.feedparser', 'email.errors', 'email._policybase', 'email.header', 'email.quoprimime', 'string', '_string', 'email.base64mime', 'base64', 'email.charset', 'email.encoders', 'quopri', 'email.utils', 'random', 'hashlib', '_hashlib', '_blake2', '_sha3', 'bisect', '_bisect', '_random', 'socket', '_socket', 'email._parseaddr', 'calendar', 'locale', 'tempfile', 'textwrap', 'pkg_resources.extern', 'pkg_resources._vendor', 'pkg_resources._vendor.appdirs', 'pkg_resources.extern.appdirs', 'pkg_resources._vendor.packaging', 'pkg_resources._vendor.packaging.__about__', 'pkg_resources.extern.packaging', 'pkg_resources.extern.packaging.version', 'typing', 'typing.io', 'typing.re', 'pkg_resources.extern.packaging._structures', 'pkg_resources.extern.packaging.specifiers', 'pkg_resources.extern.packaging.utils', 'pkg_resources.extern.packaging.tags', 'logging', 'atexit', 'sysconfig', 'pkg_resources._vendor.packaging._manylinux', 'pkg_resources._vendor.packaging._musllinux', 'pkg_resources.extern.packaging.requirements', 'pkg_resources._vendor.pyparsing', 'copy', 'pprint', 'pkg_resources.extern.pyparsing', 'pkg_resources.extern.packaging.markers', 'multiprocessing', 'multiprocessing.context', 'multiprocessing.process', 'multiprocessing.reduction', 'pickle', '_compat_pickle', '_pickle', 'array', '__mp_main__', 'multiprocessing.spawn', 'runpy', 'multiprocessing.util', 'multiprocessing.popen_fork', 'multiprocessing.popen_spawn_posix', 'concurrent', 'concurrent.futures', 'concurrent.futures._base', 'concurrent.futures.process', 'queue', 'multiprocessing.connection', '_multiprocessing', 'concurrent.futures.thread', 'argparse', 'gettext', 'common', 'common.api_common', 'json', 'json.decoder', 'json.scanner', '_json', 'json.encoder', 'paramiko', 'paramiko._version', 'paramiko.transport', 'cryptography', 'cryptography.__about__', 'cryptography.utils', 'cryptography.hazmat', 'cryptography.hazmat.backends', 'cryptography.hazmat.primitives', 'cryptography.hazmat.primitives.ciphers', 'cryptography.hazmat.primitives._cipheralgorithm', 'cryptography.hazmat.primitives.ciphers.base', 'cryptography.exceptions', 'cryptography.hazmat.primitives.ciphers.modes', 'cryptography.hazmat.primitives.ciphers.algorithms', 'paramiko.util', 'paramiko.common', 'paramiko.config', 'getpass', 'termios', 'shlex', 'paramiko.ssh_exception', 'paramiko.auth_handler', 'paramiko.message', 'paramiko.server', 'paramiko.ssh_gss', 'paramiko.channel', 'paramiko.file', 'paramiko.buffered_pipe', 'paramiko.pipe', 'paramiko.compress', 'paramiko.dsskey', 'cryptography.hazmat.primitives.hashes', 'cryptography.hazmat.primitives.serialization', 'cryptography.hazmat.primitives._serialization', 'cryptography.hazmat.primitives.serialization.base', 'cryptography.hazmat.primitives.asymmetric', 'cryptography.hazmat.primitives.asymmetric.dh', 'cryptography.hazmat.primitives.asymmetric.types', 'cryptography.hazmat.primitives.asymmetric.dsa', 'cryptography.hazmat.primitives.asymmetric.utils', 'cryptography.hazmat.bindings', '_cffi_backend', '_openssl.lib', '_openssl', 'cryptography.hazmat.bindings._rust', 'cryptography.hazmat.primitives.asymmetric.ec', 'cryptography.hazmat._oid', 'cryptography.hazmat.primitives.asymmetric.ed448', 'cryptography.hazmat.primitives.asymmetric.ed25519', 'cryptography.hazmat.primitives.asymmetric.rsa', 'cryptography.hazmat.primitives._asymmetric', 'cryptography.hazmat.primitives.asymmetric.x448', 'cryptography.hazmat.primitives.asymmetric.x25519', 'cryptography.hazmat.primitives.serialization.ssh', 'cryptography.hazmat.primitives.asymmetric.padding', 'bcrypt', '__future__', 'hmac', 'bcrypt.__about__', 'bcrypt._bcrypt', 'paramiko.ber', 'paramiko.sftp', 'paramiko.pkey', 'paramiko.ed25519key', 'nacl', 'nacl.signing', 'nacl.bindings', 'nacl.bindings.crypto_aead', 'nacl.exceptions', '_sodium.lib', '_sodium', 'nacl._sodium', 'nacl.bindings.crypto_box', 'nacl.bindings.crypto_core', 'nacl.bindings.crypto_generichash', 'nacl.bindings.crypto_hash', 'nacl.bindings.crypto_kx', 'nacl.bindings.crypto_pwhash', 'nacl.bindings.crypto_scalarmult', 'nacl.bindings.crypto_secretbox', 'nacl.bindings.crypto_secretstream', 'nacl.bindings.crypto_shorthash', 'nacl.bindings.crypto_sign', 'nacl.bindings.randombytes', 'nacl.bindings.sodium_core', 'nacl.bindings.utils', 'nacl.encoding', 'nacl.public', 'nacl.utils', 'paramiko.kex_curve25519', 'cryptography.hazmat.primitives.constant_time', 'paramiko.kex_gex', 'paramiko.kex_group1', 'paramiko.kex_group14', 'paramiko.kex_group16', 'paramiko.kex_ecdh_nist', 'paramiko.kex_gss', 'paramiko.packet', 'paramiko.primes', 'paramiko.rsakey', 'paramiko.ecdsakey', 'paramiko.sftp_client', 'paramiko.sftp_attr', 'paramiko.sftp_file', 'cryptography.hazmat.backends.openssl', 'cryptography.hazmat.backends.openssl.backend', 'cryptography.x509', 'cryptography.x509.certificate_transparency', 'cryptography.x509.base', 'cryptography.x509.extensions', 'ipaddress', 'cryptography.x509.general_name', 'cryptography.x509.name', 'cryptography.x509.oid', 'cryptography.hazmat.backends.openssl.aead', 'cryptography.hazmat.backends.openssl.ciphers', 'cryptography.hazmat.backends.openssl.cmac', 'cryptography.hazmat.backends.openssl.dh', 'cryptography.hazmat.backends.openssl.dsa', 'cryptography.hazmat.backends.openssl.utils', 'cryptography.hazmat.backends.openssl.ec', 'cryptography.hazmat.backends.openssl.ed448', 'cryptography.hazmat.backends.openssl.ed25519', 'cryptography.hazmat.backends.openssl.hashes', 'cryptography.hazmat.backends.openssl.hmac', 'cryptography.hazmat.backends.openssl.poly1305', 'cryptography.hazmat.backends.openssl.rsa', 'cryptography.hazmat.backends.openssl.x448', 'cryptography.hazmat.bindings.openssl', 'cryptography.hazmat.bindings.openssl.binding', 'cryptography.hazmat.bindings.openssl._conditional', 'cryptography.hazmat.primitives.kdf', 'cryptography.hazmat.primitives.kdf.scrypt', 'cryptography.hazmat.primitives.serialization.pkcs12', 'paramiko.client', 'paramiko.agent', 'paramiko.hostkeys', 'paramiko.auth_strategy', 'paramiko.sftp_server', 'paramiko.sftp_si', 'paramiko.sftp_handle', 'paramiko.proxy', 'sshtunnel', 'socketserver', 'utils', 'utils.exceptions', 'utils.logging', 'utils.complier', 'utils.rawdata_elements', 'common.pc_piechart', 'matplotlib', 'distutils', 'distutils.version', 'matplotlib.cbook', 'gzip', 'numpy', 'numpy._globals', 'numpy.__config__', 'numpy.version', 'numpy._distributor_init', 'numpy.core', 'numpy.core.multiarray', 'numpy.core.overrides', 'numpy.core._multiarray_umath', 'numpy.compat', 'numpy.compat._inspect', 'numpy.compat.py3k', 'numpy.core.umath', 'numpy.core.numerictypes', 'numbers', 'numpy.core._string_helpers', 'numpy.core._type_aliases', 'numpy.core._dtype', 'numpy.core.numeric', 'numpy.core.shape_base', 'numpy.core._asarray', 'numpy.core.fromnumeric', 'numpy.core._methods', 'numpy.core._exceptions', 'numpy.core._ufunc_config', 'numpy.core.arrayprint', 'numpy.core.defchararray', 'numpy.core.records', 'numpy.core.memmap', 'numpy.core.function_base', 'numpy.core.machar', 'numpy.core.getlimits', 'numpy.core.einsumfunc', 'numpy.core._add_newdocs', 'numpy.core._multiarray_tests', 'numpy.core._dtype_ctypes', 'numpy.core._internal', 'numpy._pytesttester', 'numpy.lib', 'numpy.lib.mixins', 'numpy.lib.scimath', 'numpy.lib.type_check', 'numpy.lib.ufunclike', 'numpy.lib.index_tricks', 'numpy.matrixlib', 'numpy.matrixlib.defmatrix', 'numpy.linalg', 'numpy.linalg.linalg', 'numpy.lib.twodim_base', 'numpy.linalg.lapack_lite', 'numpy.linalg._umath_linalg', 'numpy.lib.function_base', 'numpy.lib.histograms', 'numpy.lib.stride_tricks', 'numpy.lib.nanfunctions', 'numpy.lib.shape_base', 'numpy.lib.polynomial', 'numpy.lib.utils', 'numpy.lib.arraysetops', 'numpy.lib.npyio', 'numpy.lib.format', 'numpy.lib._datasource', 'numpy.lib._iotools', 'numpy.lib.financial', 'decimal', '_decimal', 'numpy.lib.arrayterator', 'numpy.lib.arraypad', 'numpy.lib._version', 'numpy.fft', 'numpy.fft._pocketfft', 'numpy.fft._pocketfft_internal', 'numpy.fft.helper', 'numpy.polynomial', 'numpy.polynomial.polynomial', 'numpy.polynomial.polyutils', 'numpy.polynomial._polybase', 'numpy.polynomial.chebyshev', 'numpy.polynomial.legendre', 'numpy.polynomial.hermite', 'numpy.polynomial.hermite_e', 'numpy.polynomial.laguerre', 'numpy.random', 'numpy.random._pickle', 'numpy.random.mtrand', 'cython_runtime', 'numpy.random.bit_generator', '_cython_0_29_21', 'numpy.random._common', 'secrets', 'numpy.random._bounded_integers', 'numpy.random._mt19937', 'numpy.random._philox', 'numpy.random._pcg64', 'numpy.random._sfc64', 'numpy.random._generator', 'numpy.ctypeslib', 'numpy.ma', 'numpy.ma.core', 'numpy.ma.extras', 'numpy.testing', 'unittest', 'unittest.result', 'unittest.util', 'unittest.case', 'difflib', 'unittest.suite', 'unittest.loader', 'unittest.main', 'unittest.runner', 'unittest.signals', 'numpy.testing._private', 'numpy.testing._private.utils', 'gc', 'numpy.testing._private.decorators', 'numpy.testing._private.nosetester', 'matplotlib.cbook.deprecation', 'matplotlib.rcsetup', 'matplotlib.animation', 'uuid', 'ctypes.util', 'matplotlib._animation_data', 'matplotlib.fontconfig_pattern', 'pyparsing', 'pyparsing.util', 'pyparsing.exceptions', 'pyparsing.unicode', 'pyparsing.actions', 'pyparsing.core', 'pyparsing.results', 'pyparsing.helpers', 'html', 'html.entities', 'pyparsing.testing', 'pyparsing.common', 'matplotlib.colors', 'matplotlib.docstring', 'matplotlib._color_data', 'cycler', 'matplotlib._version', 'matplotlib.ft2font', 'dateutil', 'dateutil._version', 'kiwisolver'] +2026-07-17 09:39:32,318 DEBUG matplotlib: CACHEDIR=/tmp/tmpg2oj6jsu +2026-07-17 09:39:32,318 INFO matplotlib.font_manager: Generating new fontManager, this may take some time... +2026-07-17 09:39:32,319 DEBUG matplotlib.font_manager: font search path [PosixPath('/tmp/_MEINuhn2f/matplotlib/mpl-data/fonts/ttf'), PosixPath('/tmp/_MEINuhn2f/matplotlib/mpl-data/fonts/afm'), PosixPath('/tmp/_MEINuhn2f/matplotlib/mpl-data/fonts/pdfcorefonts')] +2026-07-17 09:39:32,696 DEBUG matplotlib.pyplot: Loaded backend agg version unknown. +2026-07-17 09:39:56,280 DEBUG matplotlib: (private) matplotlib data path: /tmp/_MEIilSE0F/matplotlib/mpl-data +2026-07-17 09:39:56,280 DEBUG matplotlib: matplotlib data path: /tmp/_MEIilSE0F/matplotlib/mpl-data +2026-07-17 09:39:56,285 DEBUG matplotlib: CONFIGDIR=/tmp/tmpa9avz4c7 +2026-07-17 09:39:56,287 DEBUG matplotlib: matplotlib version 3.3.4 +2026-07-17 09:39:56,287 DEBUG matplotlib: interactive is False +2026-07-17 09:39:56,288 DEBUG matplotlib: platform is linux +2026-07-17 09:39:56,288 DEBUG matplotlib: loaded modules: ['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread', '_weakref', '_frozen_importlib_external', '_io', 'marshal', 'posix', 'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.ascii', '_signal', '__main__', 'encodings.utf_8', 'encodings.latin_1', 'io', 'abc', '_weakrefset', '_bootlocale', '_locale', 'struct', '_struct', 'pyimod01_os_path', 'pyimod02_archive', 'zlib', 'pyimod03_importers', 'pyimod04_ctypes', 'os', 'errno', 'stat', '_stat', 'posixpath', 'genericpath', 'os.path', '_collections_abc', 'ctypes', '_ctypes', 'ctypes._endian', 'pkgutil', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'functools', '_functools', 'types', 'collections.abc', 'weakref', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib.util', 'importlib.abc', 'importlib.machinery', 'contextlib', 'inspect', 'ast', '_ast', 'dis', 'opcode', '_opcode', 'enum', 'linecache', 'tokenize', 're', 'sre_compile', '_sre', 'sre_parse', 'sre_constants', 'copyreg', 'token', 'pathlib', 'fnmatch', 'ntpath', 'urllib', 'urllib.parse', 'pkg_resources', 'time', 'zipfile', 'shutil', 'bz2', '_compression', 'threading', 'traceback', '_bz2', 'lzma', '_lzma', 'pwd', 'grp', 'binascii', 'platform', 'subprocess', 'signal', '_posixsubprocess', 'select', 'selectors', 'math', 'plistlib', 'datetime', '_datetime', 'xml', 'xml.parsers', 'xml.parsers.expat', 'pyexpat.errors', 'pyexpat.model', 'pyexpat', 'xml.parsers.expat.model', 'xml.parsers.expat.errors', 'email', 'email.parser', 'email.feedparser', 'email.errors', 'email._policybase', 'email.header', 'email.quoprimime', 'string', '_string', 'email.base64mime', 'base64', 'email.charset', 'email.encoders', 'quopri', 'email.utils', 'random', 'hashlib', '_hashlib', '_blake2', '_sha3', 'bisect', '_bisect', '_random', 'socket', '_socket', 'email._parseaddr', 'calendar', 'locale', 'tempfile', 'textwrap', 'pkg_resources.extern', 'pkg_resources._vendor', 'pkg_resources._vendor.appdirs', 'pkg_resources.extern.appdirs', 'pkg_resources._vendor.packaging', 'pkg_resources._vendor.packaging.__about__', 'pkg_resources.extern.packaging', 'pkg_resources.extern.packaging.version', 'typing', 'typing.io', 'typing.re', 'pkg_resources.extern.packaging._structures', 'pkg_resources.extern.packaging.specifiers', 'pkg_resources.extern.packaging.utils', 'pkg_resources.extern.packaging.tags', 'logging', 'atexit', 'sysconfig', 'pkg_resources._vendor.packaging._manylinux', 'pkg_resources._vendor.packaging._musllinux', 'pkg_resources.extern.packaging.requirements', 'pkg_resources._vendor.pyparsing', 'copy', 'pprint', 'pkg_resources.extern.pyparsing', 'pkg_resources.extern.packaging.markers', 'multiprocessing', 'multiprocessing.context', 'multiprocessing.process', 'multiprocessing.reduction', 'pickle', '_compat_pickle', '_pickle', 'array', '__mp_main__', 'multiprocessing.spawn', 'runpy', 'multiprocessing.util', 'multiprocessing.popen_fork', 'multiprocessing.popen_spawn_posix', 'concurrent', 'concurrent.futures', 'concurrent.futures._base', 'concurrent.futures.process', 'queue', 'multiprocessing.connection', '_multiprocessing', 'concurrent.futures.thread', 'argparse', 'gettext', 'common', 'common.api_common', 'json', 'json.decoder', 'json.scanner', '_json', 'json.encoder', 'paramiko', 'paramiko._version', 'paramiko.transport', 'cryptography', 'cryptography.__about__', 'cryptography.utils', 'cryptography.hazmat', 'cryptography.hazmat.backends', 'cryptography.hazmat.primitives', 'cryptography.hazmat.primitives.ciphers', 'cryptography.hazmat.primitives._cipheralgorithm', 'cryptography.hazmat.primitives.ciphers.base', 'cryptography.exceptions', 'cryptography.hazmat.primitives.ciphers.modes', 'cryptography.hazmat.primitives.ciphers.algorithms', 'paramiko.util', 'paramiko.common', 'paramiko.config', 'getpass', 'termios', 'shlex', 'paramiko.ssh_exception', 'paramiko.auth_handler', 'paramiko.message', 'paramiko.server', 'paramiko.ssh_gss', 'paramiko.channel', 'paramiko.file', 'paramiko.buffered_pipe', 'paramiko.pipe', 'paramiko.compress', 'paramiko.dsskey', 'cryptography.hazmat.primitives.hashes', 'cryptography.hazmat.primitives.serialization', 'cryptography.hazmat.primitives._serialization', 'cryptography.hazmat.primitives.serialization.base', 'cryptography.hazmat.primitives.asymmetric', 'cryptography.hazmat.primitives.asymmetric.dh', 'cryptography.hazmat.primitives.asymmetric.types', 'cryptography.hazmat.primitives.asymmetric.dsa', 'cryptography.hazmat.primitives.asymmetric.utils', 'cryptography.hazmat.bindings', '_cffi_backend', '_openssl.lib', '_openssl', 'cryptography.hazmat.bindings._rust', 'cryptography.hazmat.primitives.asymmetric.ec', 'cryptography.hazmat._oid', 'cryptography.hazmat.primitives.asymmetric.ed448', 'cryptography.hazmat.primitives.asymmetric.ed25519', 'cryptography.hazmat.primitives.asymmetric.rsa', 'cryptography.hazmat.primitives._asymmetric', 'cryptography.hazmat.primitives.asymmetric.x448', 'cryptography.hazmat.primitives.asymmetric.x25519', 'cryptography.hazmat.primitives.serialization.ssh', 'cryptography.hazmat.primitives.asymmetric.padding', 'bcrypt', '__future__', 'hmac', 'bcrypt.__about__', 'bcrypt._bcrypt', 'paramiko.ber', 'paramiko.sftp', 'paramiko.pkey', 'paramiko.ed25519key', 'nacl', 'nacl.signing', 'nacl.bindings', 'nacl.bindings.crypto_aead', 'nacl.exceptions', '_sodium.lib', '_sodium', 'nacl._sodium', 'nacl.bindings.crypto_box', 'nacl.bindings.crypto_core', 'nacl.bindings.crypto_generichash', 'nacl.bindings.crypto_hash', 'nacl.bindings.crypto_kx', 'nacl.bindings.crypto_pwhash', 'nacl.bindings.crypto_scalarmult', 'nacl.bindings.crypto_secretbox', 'nacl.bindings.crypto_secretstream', 'nacl.bindings.crypto_shorthash', 'nacl.bindings.crypto_sign', 'nacl.bindings.randombytes', 'nacl.bindings.sodium_core', 'nacl.bindings.utils', 'nacl.encoding', 'nacl.public', 'nacl.utils', 'paramiko.kex_curve25519', 'cryptography.hazmat.primitives.constant_time', 'paramiko.kex_gex', 'paramiko.kex_group1', 'paramiko.kex_group14', 'paramiko.kex_group16', 'paramiko.kex_ecdh_nist', 'paramiko.kex_gss', 'paramiko.packet', 'paramiko.primes', 'paramiko.rsakey', 'paramiko.ecdsakey', 'paramiko.sftp_client', 'paramiko.sftp_attr', 'paramiko.sftp_file', 'cryptography.hazmat.backends.openssl', 'cryptography.hazmat.backends.openssl.backend', 'cryptography.x509', 'cryptography.x509.certificate_transparency', 'cryptography.x509.base', 'cryptography.x509.extensions', 'ipaddress', 'cryptography.x509.general_name', 'cryptography.x509.name', 'cryptography.x509.oid', 'cryptography.hazmat.backends.openssl.aead', 'cryptography.hazmat.backends.openssl.ciphers', 'cryptography.hazmat.backends.openssl.cmac', 'cryptography.hazmat.backends.openssl.dh', 'cryptography.hazmat.backends.openssl.dsa', 'cryptography.hazmat.backends.openssl.utils', 'cryptography.hazmat.backends.openssl.ec', 'cryptography.hazmat.backends.openssl.ed448', 'cryptography.hazmat.backends.openssl.ed25519', 'cryptography.hazmat.backends.openssl.hashes', 'cryptography.hazmat.backends.openssl.hmac', 'cryptography.hazmat.backends.openssl.poly1305', 'cryptography.hazmat.backends.openssl.rsa', 'cryptography.hazmat.backends.openssl.x448', 'cryptography.hazmat.bindings.openssl', 'cryptography.hazmat.bindings.openssl.binding', 'cryptography.hazmat.bindings.openssl._conditional', 'cryptography.hazmat.primitives.kdf', 'cryptography.hazmat.primitives.kdf.scrypt', 'cryptography.hazmat.primitives.serialization.pkcs12', 'paramiko.client', 'paramiko.agent', 'paramiko.hostkeys', 'paramiko.auth_strategy', 'paramiko.sftp_server', 'paramiko.sftp_si', 'paramiko.sftp_handle', 'paramiko.proxy', 'sshtunnel', 'socketserver', 'utils', 'utils.exceptions', 'utils.logging', 'utils.complier', 'utils.rawdata_elements', 'common.pc_piechart', 'matplotlib', 'distutils', 'distutils.version', 'matplotlib.cbook', 'gzip', 'numpy', 'numpy._globals', 'numpy.__config__', 'numpy.version', 'numpy._distributor_init', 'numpy.core', 'numpy.core.multiarray', 'numpy.core.overrides', 'numpy.core._multiarray_umath', 'numpy.compat', 'numpy.compat._inspect', 'numpy.compat.py3k', 'numpy.core.umath', 'numpy.core.numerictypes', 'numbers', 'numpy.core._string_helpers', 'numpy.core._type_aliases', 'numpy.core._dtype', 'numpy.core.numeric', 'numpy.core.shape_base', 'numpy.core._asarray', 'numpy.core.fromnumeric', 'numpy.core._methods', 'numpy.core._exceptions', 'numpy.core._ufunc_config', 'numpy.core.arrayprint', 'numpy.core.defchararray', 'numpy.core.records', 'numpy.core.memmap', 'numpy.core.function_base', 'numpy.core.machar', 'numpy.core.getlimits', 'numpy.core.einsumfunc', 'numpy.core._add_newdocs', 'numpy.core._multiarray_tests', 'numpy.core._dtype_ctypes', 'numpy.core._internal', 'numpy._pytesttester', 'numpy.lib', 'numpy.lib.mixins', 'numpy.lib.scimath', 'numpy.lib.type_check', 'numpy.lib.ufunclike', 'numpy.lib.index_tricks', 'numpy.matrixlib', 'numpy.matrixlib.defmatrix', 'numpy.linalg', 'numpy.linalg.linalg', 'numpy.lib.twodim_base', 'numpy.linalg.lapack_lite', 'numpy.linalg._umath_linalg', 'numpy.lib.function_base', 'numpy.lib.histograms', 'numpy.lib.stride_tricks', 'numpy.lib.nanfunctions', 'numpy.lib.shape_base', 'numpy.lib.polynomial', 'numpy.lib.utils', 'numpy.lib.arraysetops', 'numpy.lib.npyio', 'numpy.lib.format', 'numpy.lib._datasource', 'numpy.lib._iotools', 'numpy.lib.financial', 'decimal', '_decimal', 'numpy.lib.arrayterator', 'numpy.lib.arraypad', 'numpy.lib._version', 'numpy.fft', 'numpy.fft._pocketfft', 'numpy.fft._pocketfft_internal', 'numpy.fft.helper', 'numpy.polynomial', 'numpy.polynomial.polynomial', 'numpy.polynomial.polyutils', 'numpy.polynomial._polybase', 'numpy.polynomial.chebyshev', 'numpy.polynomial.legendre', 'numpy.polynomial.hermite', 'numpy.polynomial.hermite_e', 'numpy.polynomial.laguerre', 'numpy.random', 'numpy.random._pickle', 'numpy.random.mtrand', 'cython_runtime', 'numpy.random.bit_generator', '_cython_0_29_21', 'numpy.random._common', 'secrets', 'numpy.random._bounded_integers', 'numpy.random._mt19937', 'numpy.random._philox', 'numpy.random._pcg64', 'numpy.random._sfc64', 'numpy.random._generator', 'numpy.ctypeslib', 'numpy.ma', 'numpy.ma.core', 'numpy.ma.extras', 'numpy.testing', 'unittest', 'unittest.result', 'unittest.util', 'unittest.case', 'difflib', 'unittest.suite', 'unittest.loader', 'unittest.main', 'unittest.runner', 'unittest.signals', 'numpy.testing._private', 'numpy.testing._private.utils', 'gc', 'numpy.testing._private.decorators', 'numpy.testing._private.nosetester', 'matplotlib.cbook.deprecation', 'matplotlib.rcsetup', 'matplotlib.animation', 'uuid', 'ctypes.util', 'matplotlib._animation_data', 'matplotlib.fontconfig_pattern', 'pyparsing', 'pyparsing.util', 'pyparsing.exceptions', 'pyparsing.unicode', 'pyparsing.actions', 'pyparsing.core', 'pyparsing.results', 'pyparsing.helpers', 'html', 'html.entities', 'pyparsing.testing', 'pyparsing.common', 'matplotlib.colors', 'matplotlib.docstring', 'matplotlib._color_data', 'cycler', 'matplotlib._version', 'matplotlib.ft2font', 'dateutil', 'dateutil._version', 'kiwisolver'] +2026-07-17 09:39:56,330 DEBUG matplotlib: CACHEDIR=/tmp/tmpa9avz4c7 +2026-07-17 09:39:56,330 INFO matplotlib.font_manager: Generating new fontManager, this may take some time... +2026-07-17 09:39:56,330 DEBUG matplotlib.font_manager: font search path [PosixPath('/tmp/_MEIilSE0F/matplotlib/mpl-data/fonts/ttf'), PosixPath('/tmp/_MEIilSE0F/matplotlib/mpl-data/fonts/afm'), PosixPath('/tmp/_MEIilSE0F/matplotlib/mpl-data/fonts/pdfcorefonts')] +2026-07-17 09:39:56,706 DEBUG matplotlib.pyplot: Loaded backend agg version unknown. +2026-07-17 09:40:00,566 DEBUG matplotlib: (private) matplotlib data path: /tmp/_MEIctKeRl/matplotlib/mpl-data +2026-07-17 09:40:00,567 DEBUG matplotlib: matplotlib data path: /tmp/_MEIctKeRl/matplotlib/mpl-data +2026-07-17 09:40:00,571 DEBUG matplotlib: CONFIGDIR=/tmp/tmpg_7btxa2 +2026-07-17 09:40:00,573 DEBUG matplotlib: matplotlib version 3.3.4 +2026-07-17 09:40:00,574 DEBUG matplotlib: interactive is False +2026-07-17 09:40:00,574 DEBUG matplotlib: platform is linux +2026-07-17 09:40:00,574 DEBUG matplotlib: loaded modules: ['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread', '_weakref', '_frozen_importlib_external', '_io', 'marshal', 'posix', 'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.ascii', '_signal', '__main__', 'encodings.utf_8', 'encodings.latin_1', 'io', 'abc', '_weakrefset', '_bootlocale', '_locale', 'struct', '_struct', 'pyimod01_os_path', 'pyimod02_archive', 'zlib', 'pyimod03_importers', 'pyimod04_ctypes', 'os', 'errno', 'stat', '_stat', 'posixpath', 'genericpath', 'os.path', '_collections_abc', 'ctypes', '_ctypes', 'ctypes._endian', 'pkgutil', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'functools', '_functools', 'types', 'collections.abc', 'weakref', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib.util', 'importlib.abc', 'importlib.machinery', 'contextlib', 'inspect', 'ast', '_ast', 'dis', 'opcode', '_opcode', 'enum', 'linecache', 'tokenize', 're', 'sre_compile', '_sre', 'sre_parse', 'sre_constants', 'copyreg', 'token', 'pathlib', 'fnmatch', 'ntpath', 'urllib', 'urllib.parse', 'pkg_resources', 'time', 'zipfile', 'shutil', 'bz2', '_compression', 'threading', 'traceback', '_bz2', 'lzma', '_lzma', 'pwd', 'grp', 'binascii', 'platform', 'subprocess', 'signal', '_posixsubprocess', 'select', 'selectors', 'math', 'plistlib', 'datetime', '_datetime', 'xml', 'xml.parsers', 'xml.parsers.expat', 'pyexpat.errors', 'pyexpat.model', 'pyexpat', 'xml.parsers.expat.model', 'xml.parsers.expat.errors', 'email', 'email.parser', 'email.feedparser', 'email.errors', 'email._policybase', 'email.header', 'email.quoprimime', 'string', '_string', 'email.base64mime', 'base64', 'email.charset', 'email.encoders', 'quopri', 'email.utils', 'random', 'hashlib', '_hashlib', '_blake2', '_sha3', 'bisect', '_bisect', '_random', 'socket', '_socket', 'email._parseaddr', 'calendar', 'locale', 'tempfile', 'textwrap', 'pkg_resources.extern', 'pkg_resources._vendor', 'pkg_resources._vendor.appdirs', 'pkg_resources.extern.appdirs', 'pkg_resources._vendor.packaging', 'pkg_resources._vendor.packaging.__about__', 'pkg_resources.extern.packaging', 'pkg_resources.extern.packaging.version', 'typing', 'typing.io', 'typing.re', 'pkg_resources.extern.packaging._structures', 'pkg_resources.extern.packaging.specifiers', 'pkg_resources.extern.packaging.utils', 'pkg_resources.extern.packaging.tags', 'logging', 'atexit', 'sysconfig', 'pkg_resources._vendor.packaging._manylinux', 'pkg_resources._vendor.packaging._musllinux', 'pkg_resources.extern.packaging.requirements', 'pkg_resources._vendor.pyparsing', 'copy', 'pprint', 'pkg_resources.extern.pyparsing', 'pkg_resources.extern.packaging.markers', 'multiprocessing', 'multiprocessing.context', 'multiprocessing.process', 'multiprocessing.reduction', 'pickle', '_compat_pickle', '_pickle', 'array', '__mp_main__', 'multiprocessing.spawn', 'runpy', 'multiprocessing.util', 'multiprocessing.popen_fork', 'multiprocessing.popen_spawn_posix', 'concurrent', 'concurrent.futures', 'concurrent.futures._base', 'concurrent.futures.process', 'queue', 'multiprocessing.connection', '_multiprocessing', 'concurrent.futures.thread', 'argparse', 'gettext', 'common', 'common.api_common', 'json', 'json.decoder', 'json.scanner', '_json', 'json.encoder', 'paramiko', 'paramiko._version', 'paramiko.transport', 'cryptography', 'cryptography.__about__', 'cryptography.utils', 'cryptography.hazmat', 'cryptography.hazmat.backends', 'cryptography.hazmat.primitives', 'cryptography.hazmat.primitives.ciphers', 'cryptography.hazmat.primitives._cipheralgorithm', 'cryptography.hazmat.primitives.ciphers.base', 'cryptography.exceptions', 'cryptography.hazmat.primitives.ciphers.modes', 'cryptography.hazmat.primitives.ciphers.algorithms', 'paramiko.util', 'paramiko.common', 'paramiko.config', 'getpass', 'termios', 'shlex', 'paramiko.ssh_exception', 'paramiko.auth_handler', 'paramiko.message', 'paramiko.server', 'paramiko.ssh_gss', 'paramiko.channel', 'paramiko.file', 'paramiko.buffered_pipe', 'paramiko.pipe', 'paramiko.compress', 'paramiko.dsskey', 'cryptography.hazmat.primitives.hashes', 'cryptography.hazmat.primitives.serialization', 'cryptography.hazmat.primitives._serialization', 'cryptography.hazmat.primitives.serialization.base', 'cryptography.hazmat.primitives.asymmetric', 'cryptography.hazmat.primitives.asymmetric.dh', 'cryptography.hazmat.primitives.asymmetric.types', 'cryptography.hazmat.primitives.asymmetric.dsa', 'cryptography.hazmat.primitives.asymmetric.utils', 'cryptography.hazmat.bindings', '_cffi_backend', '_openssl.lib', '_openssl', 'cryptography.hazmat.bindings._rust', 'cryptography.hazmat.primitives.asymmetric.ec', 'cryptography.hazmat._oid', 'cryptography.hazmat.primitives.asymmetric.ed448', 'cryptography.hazmat.primitives.asymmetric.ed25519', 'cryptography.hazmat.primitives.asymmetric.rsa', 'cryptography.hazmat.primitives._asymmetric', 'cryptography.hazmat.primitives.asymmetric.x448', 'cryptography.hazmat.primitives.asymmetric.x25519', 'cryptography.hazmat.primitives.serialization.ssh', 'cryptography.hazmat.primitives.asymmetric.padding', 'bcrypt', '__future__', 'hmac', 'bcrypt.__about__', 'bcrypt._bcrypt', 'paramiko.ber', 'paramiko.sftp', 'paramiko.pkey', 'paramiko.ed25519key', 'nacl', 'nacl.signing', 'nacl.bindings', 'nacl.bindings.crypto_aead', 'nacl.exceptions', '_sodium.lib', '_sodium', 'nacl._sodium', 'nacl.bindings.crypto_box', 'nacl.bindings.crypto_core', 'nacl.bindings.crypto_generichash', 'nacl.bindings.crypto_hash', 'nacl.bindings.crypto_kx', 'nacl.bindings.crypto_pwhash', 'nacl.bindings.crypto_scalarmult', 'nacl.bindings.crypto_secretbox', 'nacl.bindings.crypto_secretstream', 'nacl.bindings.crypto_shorthash', 'nacl.bindings.crypto_sign', 'nacl.bindings.randombytes', 'nacl.bindings.sodium_core', 'nacl.bindings.utils', 'nacl.encoding', 'nacl.public', 'nacl.utils', 'paramiko.kex_curve25519', 'cryptography.hazmat.primitives.constant_time', 'paramiko.kex_gex', 'paramiko.kex_group1', 'paramiko.kex_group14', 'paramiko.kex_group16', 'paramiko.kex_ecdh_nist', 'paramiko.kex_gss', 'paramiko.packet', 'paramiko.primes', 'paramiko.rsakey', 'paramiko.ecdsakey', 'paramiko.sftp_client', 'paramiko.sftp_attr', 'paramiko.sftp_file', 'cryptography.hazmat.backends.openssl', 'cryptography.hazmat.backends.openssl.backend', 'cryptography.x509', 'cryptography.x509.certificate_transparency', 'cryptography.x509.base', 'cryptography.x509.extensions', 'ipaddress', 'cryptography.x509.general_name', 'cryptography.x509.name', 'cryptography.x509.oid', 'cryptography.hazmat.backends.openssl.aead', 'cryptography.hazmat.backends.openssl.ciphers', 'cryptography.hazmat.backends.openssl.cmac', 'cryptography.hazmat.backends.openssl.dh', 'cryptography.hazmat.backends.openssl.dsa', 'cryptography.hazmat.backends.openssl.utils', 'cryptography.hazmat.backends.openssl.ec', 'cryptography.hazmat.backends.openssl.ed448', 'cryptography.hazmat.backends.openssl.ed25519', 'cryptography.hazmat.backends.openssl.hashes', 'cryptography.hazmat.backends.openssl.hmac', 'cryptography.hazmat.backends.openssl.poly1305', 'cryptography.hazmat.backends.openssl.rsa', 'cryptography.hazmat.backends.openssl.x448', 'cryptography.hazmat.bindings.openssl', 'cryptography.hazmat.bindings.openssl.binding', 'cryptography.hazmat.bindings.openssl._conditional', 'cryptography.hazmat.primitives.kdf', 'cryptography.hazmat.primitives.kdf.scrypt', 'cryptography.hazmat.primitives.serialization.pkcs12', 'paramiko.client', 'paramiko.agent', 'paramiko.hostkeys', 'paramiko.auth_strategy', 'paramiko.sftp_server', 'paramiko.sftp_si', 'paramiko.sftp_handle', 'paramiko.proxy', 'sshtunnel', 'socketserver', 'utils', 'utils.exceptions', 'utils.logging', 'utils.complier', 'utils.rawdata_elements', 'common.pc_piechart', 'matplotlib', 'distutils', 'distutils.version', 'matplotlib.cbook', 'gzip', 'numpy', 'numpy._globals', 'numpy.__config__', 'numpy.version', 'numpy._distributor_init', 'numpy.core', 'numpy.core.multiarray', 'numpy.core.overrides', 'numpy.core._multiarray_umath', 'numpy.compat', 'numpy.compat._inspect', 'numpy.compat.py3k', 'numpy.core.umath', 'numpy.core.numerictypes', 'numbers', 'numpy.core._string_helpers', 'numpy.core._type_aliases', 'numpy.core._dtype', 'numpy.core.numeric', 'numpy.core.shape_base', 'numpy.core._asarray', 'numpy.core.fromnumeric', 'numpy.core._methods', 'numpy.core._exceptions', 'numpy.core._ufunc_config', 'numpy.core.arrayprint', 'numpy.core.defchararray', 'numpy.core.records', 'numpy.core.memmap', 'numpy.core.function_base', 'numpy.core.machar', 'numpy.core.getlimits', 'numpy.core.einsumfunc', 'numpy.core._add_newdocs', 'numpy.core._multiarray_tests', 'numpy.core._dtype_ctypes', 'numpy.core._internal', 'numpy._pytesttester', 'numpy.lib', 'numpy.lib.mixins', 'numpy.lib.scimath', 'numpy.lib.type_check', 'numpy.lib.ufunclike', 'numpy.lib.index_tricks', 'numpy.matrixlib', 'numpy.matrixlib.defmatrix', 'numpy.linalg', 'numpy.linalg.linalg', 'numpy.lib.twodim_base', 'numpy.linalg.lapack_lite', 'numpy.linalg._umath_linalg', 'numpy.lib.function_base', 'numpy.lib.histograms', 'numpy.lib.stride_tricks', 'numpy.lib.nanfunctions', 'numpy.lib.shape_base', 'numpy.lib.polynomial', 'numpy.lib.utils', 'numpy.lib.arraysetops', 'numpy.lib.npyio', 'numpy.lib.format', 'numpy.lib._datasource', 'numpy.lib._iotools', 'numpy.lib.financial', 'decimal', '_decimal', 'numpy.lib.arrayterator', 'numpy.lib.arraypad', 'numpy.lib._version', 'numpy.fft', 'numpy.fft._pocketfft', 'numpy.fft._pocketfft_internal', 'numpy.fft.helper', 'numpy.polynomial', 'numpy.polynomial.polynomial', 'numpy.polynomial.polyutils', 'numpy.polynomial._polybase', 'numpy.polynomial.chebyshev', 'numpy.polynomial.legendre', 'numpy.polynomial.hermite', 'numpy.polynomial.hermite_e', 'numpy.polynomial.laguerre', 'numpy.random', 'numpy.random._pickle', 'numpy.random.mtrand', 'cython_runtime', 'numpy.random.bit_generator', '_cython_0_29_21', 'numpy.random._common', 'secrets', 'numpy.random._bounded_integers', 'numpy.random._mt19937', 'numpy.random._philox', 'numpy.random._pcg64', 'numpy.random._sfc64', 'numpy.random._generator', 'numpy.ctypeslib', 'numpy.ma', 'numpy.ma.core', 'numpy.ma.extras', 'numpy.testing', 'unittest', 'unittest.result', 'unittest.util', 'unittest.case', 'difflib', 'unittest.suite', 'unittest.loader', 'unittest.main', 'unittest.runner', 'unittest.signals', 'numpy.testing._private', 'numpy.testing._private.utils', 'gc', 'numpy.testing._private.decorators', 'numpy.testing._private.nosetester', 'matplotlib.cbook.deprecation', 'matplotlib.rcsetup', 'matplotlib.animation', 'uuid', 'ctypes.util', 'matplotlib._animation_data', 'matplotlib.fontconfig_pattern', 'pyparsing', 'pyparsing.util', 'pyparsing.exceptions', 'pyparsing.unicode', 'pyparsing.actions', 'pyparsing.core', 'pyparsing.results', 'pyparsing.helpers', 'html', 'html.entities', 'pyparsing.testing', 'pyparsing.common', 'matplotlib.colors', 'matplotlib.docstring', 'matplotlib._color_data', 'cycler', 'matplotlib._version', 'matplotlib.ft2font', 'dateutil', 'dateutil._version', 'kiwisolver'] +2026-07-17 09:40:00,616 DEBUG matplotlib: CACHEDIR=/tmp/tmpg_7btxa2 +2026-07-17 09:40:00,616 INFO matplotlib.font_manager: Generating new fontManager, this may take some time... +2026-07-17 09:40:00,616 DEBUG matplotlib.font_manager: font search path [PosixPath('/tmp/_MEIctKeRl/matplotlib/mpl-data/fonts/ttf'), PosixPath('/tmp/_MEIctKeRl/matplotlib/mpl-data/fonts/afm'), PosixPath('/tmp/_MEIctKeRl/matplotlib/mpl-data/fonts/pdfcorefonts')] +2026-07-17 09:40:00,990 DEBUG matplotlib.pyplot: Loaded backend agg version unknown. +2026-07-17 09:40:02,005 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/ce_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:40:02,005 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/compute_workload.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:40:02,005 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/gpu_throughput_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:40:02,006 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/instruction_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:40:02,006 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/isu_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:40:02,007 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/memory_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:40:02,008 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/occupancy.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:40:02,009 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/summary.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:40:02,010 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/workgroup_memory.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:48:50,884 DEBUG matplotlib: (private) matplotlib data path: /tmp/_MEI4fqWsX/matplotlib/mpl-data +2026-07-17 09:48:50,885 DEBUG matplotlib: matplotlib data path: /tmp/_MEI4fqWsX/matplotlib/mpl-data +2026-07-17 09:48:50,889 DEBUG matplotlib: CONFIGDIR=/tmp/tmpj8cvq4oj +2026-07-17 09:48:50,891 DEBUG matplotlib: matplotlib version 3.3.4 +2026-07-17 09:48:50,891 DEBUG matplotlib: interactive is False +2026-07-17 09:48:50,892 DEBUG matplotlib: platform is linux +2026-07-17 09:48:50,892 DEBUG matplotlib: loaded modules: ['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread', '_weakref', '_frozen_importlib_external', '_io', 'marshal', 'posix', 'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.ascii', '_signal', '__main__', 'encodings.utf_8', 'encodings.latin_1', 'io', 'abc', '_weakrefset', '_bootlocale', '_locale', 'struct', '_struct', 'pyimod01_os_path', 'pyimod02_archive', 'zlib', 'pyimod03_importers', 'pyimod04_ctypes', 'os', 'errno', 'stat', '_stat', 'posixpath', 'genericpath', 'os.path', '_collections_abc', 'ctypes', '_ctypes', 'ctypes._endian', 'pkgutil', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'functools', '_functools', 'types', 'collections.abc', 'weakref', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib.util', 'importlib.abc', 'importlib.machinery', 'contextlib', 'inspect', 'ast', '_ast', 'dis', 'opcode', '_opcode', 'enum', 'linecache', 'tokenize', 're', 'sre_compile', '_sre', 'sre_parse', 'sre_constants', 'copyreg', 'token', 'pathlib', 'fnmatch', 'ntpath', 'urllib', 'urllib.parse', 'pkg_resources', 'time', 'zipfile', 'shutil', 'bz2', '_compression', 'threading', 'traceback', '_bz2', 'lzma', '_lzma', 'pwd', 'grp', 'binascii', 'platform', 'subprocess', 'signal', '_posixsubprocess', 'select', 'selectors', 'math', 'plistlib', 'datetime', '_datetime', 'xml', 'xml.parsers', 'xml.parsers.expat', 'pyexpat.errors', 'pyexpat.model', 'pyexpat', 'xml.parsers.expat.model', 'xml.parsers.expat.errors', 'email', 'email.parser', 'email.feedparser', 'email.errors', 'email._policybase', 'email.header', 'email.quoprimime', 'string', '_string', 'email.base64mime', 'base64', 'email.charset', 'email.encoders', 'quopri', 'email.utils', 'random', 'hashlib', '_hashlib', '_blake2', '_sha3', 'bisect', '_bisect', '_random', 'socket', '_socket', 'email._parseaddr', 'calendar', 'locale', 'tempfile', 'textwrap', 'pkg_resources.extern', 'pkg_resources._vendor', 'pkg_resources._vendor.appdirs', 'pkg_resources.extern.appdirs', 'pkg_resources._vendor.packaging', 'pkg_resources._vendor.packaging.__about__', 'pkg_resources.extern.packaging', 'pkg_resources.extern.packaging.version', 'typing', 'typing.io', 'typing.re', 'pkg_resources.extern.packaging._structures', 'pkg_resources.extern.packaging.specifiers', 'pkg_resources.extern.packaging.utils', 'pkg_resources.extern.packaging.tags', 'logging', 'atexit', 'sysconfig', 'pkg_resources._vendor.packaging._manylinux', 'pkg_resources._vendor.packaging._musllinux', 'pkg_resources.extern.packaging.requirements', 'pkg_resources._vendor.pyparsing', 'copy', 'pprint', 'pkg_resources.extern.pyparsing', 'pkg_resources.extern.packaging.markers', 'multiprocessing', 'multiprocessing.context', 'multiprocessing.process', 'multiprocessing.reduction', 'pickle', '_compat_pickle', '_pickle', 'array', '__mp_main__', 'multiprocessing.spawn', 'runpy', 'multiprocessing.util', 'multiprocessing.popen_fork', 'multiprocessing.popen_spawn_posix', 'concurrent', 'concurrent.futures', 'concurrent.futures._base', 'concurrent.futures.process', 'queue', 'multiprocessing.connection', '_multiprocessing', 'concurrent.futures.thread', 'argparse', 'gettext', 'common', 'common.api_common', 'json', 'json.decoder', 'json.scanner', '_json', 'json.encoder', 'paramiko', 'paramiko._version', 'paramiko.transport', 'cryptography', 'cryptography.__about__', 'cryptography.utils', 'cryptography.hazmat', 'cryptography.hazmat.backends', 'cryptography.hazmat.primitives', 'cryptography.hazmat.primitives.ciphers', 'cryptography.hazmat.primitives._cipheralgorithm', 'cryptography.hazmat.primitives.ciphers.base', 'cryptography.exceptions', 'cryptography.hazmat.primitives.ciphers.modes', 'cryptography.hazmat.primitives.ciphers.algorithms', 'paramiko.util', 'paramiko.common', 'paramiko.config', 'getpass', 'termios', 'shlex', 'paramiko.ssh_exception', 'paramiko.auth_handler', 'paramiko.message', 'paramiko.server', 'paramiko.ssh_gss', 'paramiko.channel', 'paramiko.file', 'paramiko.buffered_pipe', 'paramiko.pipe', 'paramiko.compress', 'paramiko.dsskey', 'cryptography.hazmat.primitives.hashes', 'cryptography.hazmat.primitives.serialization', 'cryptography.hazmat.primitives._serialization', 'cryptography.hazmat.primitives.serialization.base', 'cryptography.hazmat.primitives.asymmetric', 'cryptography.hazmat.primitives.asymmetric.dh', 'cryptography.hazmat.primitives.asymmetric.types', 'cryptography.hazmat.primitives.asymmetric.dsa', 'cryptography.hazmat.primitives.asymmetric.utils', 'cryptography.hazmat.bindings', '_cffi_backend', '_openssl.lib', '_openssl', 'cryptography.hazmat.bindings._rust', 'cryptography.hazmat.primitives.asymmetric.ec', 'cryptography.hazmat._oid', 'cryptography.hazmat.primitives.asymmetric.ed448', 'cryptography.hazmat.primitives.asymmetric.ed25519', 'cryptography.hazmat.primitives.asymmetric.rsa', 'cryptography.hazmat.primitives._asymmetric', 'cryptography.hazmat.primitives.asymmetric.x448', 'cryptography.hazmat.primitives.asymmetric.x25519', 'cryptography.hazmat.primitives.serialization.ssh', 'cryptography.hazmat.primitives.asymmetric.padding', 'bcrypt', '__future__', 'hmac', 'bcrypt.__about__', 'bcrypt._bcrypt', 'paramiko.ber', 'paramiko.sftp', 'paramiko.pkey', 'paramiko.ed25519key', 'nacl', 'nacl.signing', 'nacl.bindings', 'nacl.bindings.crypto_aead', 'nacl.exceptions', '_sodium.lib', '_sodium', 'nacl._sodium', 'nacl.bindings.crypto_box', 'nacl.bindings.crypto_core', 'nacl.bindings.crypto_generichash', 'nacl.bindings.crypto_hash', 'nacl.bindings.crypto_kx', 'nacl.bindings.crypto_pwhash', 'nacl.bindings.crypto_scalarmult', 'nacl.bindings.crypto_secretbox', 'nacl.bindings.crypto_secretstream', 'nacl.bindings.crypto_shorthash', 'nacl.bindings.crypto_sign', 'nacl.bindings.randombytes', 'nacl.bindings.sodium_core', 'nacl.bindings.utils', 'nacl.encoding', 'nacl.public', 'nacl.utils', 'paramiko.kex_curve25519', 'cryptography.hazmat.primitives.constant_time', 'paramiko.kex_gex', 'paramiko.kex_group1', 'paramiko.kex_group14', 'paramiko.kex_group16', 'paramiko.kex_ecdh_nist', 'paramiko.kex_gss', 'paramiko.packet', 'paramiko.primes', 'paramiko.rsakey', 'paramiko.ecdsakey', 'paramiko.sftp_client', 'paramiko.sftp_attr', 'paramiko.sftp_file', 'cryptography.hazmat.backends.openssl', 'cryptography.hazmat.backends.openssl.backend', 'cryptography.x509', 'cryptography.x509.certificate_transparency', 'cryptography.x509.base', 'cryptography.x509.extensions', 'ipaddress', 'cryptography.x509.general_name', 'cryptography.x509.name', 'cryptography.x509.oid', 'cryptography.hazmat.backends.openssl.aead', 'cryptography.hazmat.backends.openssl.ciphers', 'cryptography.hazmat.backends.openssl.cmac', 'cryptography.hazmat.backends.openssl.dh', 'cryptography.hazmat.backends.openssl.dsa', 'cryptography.hazmat.backends.openssl.utils', 'cryptography.hazmat.backends.openssl.ec', 'cryptography.hazmat.backends.openssl.ed448', 'cryptography.hazmat.backends.openssl.ed25519', 'cryptography.hazmat.backends.openssl.hashes', 'cryptography.hazmat.backends.openssl.hmac', 'cryptography.hazmat.backends.openssl.poly1305', 'cryptography.hazmat.backends.openssl.rsa', 'cryptography.hazmat.backends.openssl.x448', 'cryptography.hazmat.bindings.openssl', 'cryptography.hazmat.bindings.openssl.binding', 'cryptography.hazmat.bindings.openssl._conditional', 'cryptography.hazmat.primitives.kdf', 'cryptography.hazmat.primitives.kdf.scrypt', 'cryptography.hazmat.primitives.serialization.pkcs12', 'paramiko.client', 'paramiko.agent', 'paramiko.hostkeys', 'paramiko.auth_strategy', 'paramiko.sftp_server', 'paramiko.sftp_si', 'paramiko.sftp_handle', 'paramiko.proxy', 'sshtunnel', 'socketserver', 'utils', 'utils.exceptions', 'utils.logging', 'utils.complier', 'utils.rawdata_elements', 'common.pc_piechart', 'matplotlib', 'distutils', 'distutils.version', 'matplotlib.cbook', 'gzip', 'numpy', 'numpy._globals', 'numpy.__config__', 'numpy.version', 'numpy._distributor_init', 'numpy.core', 'numpy.core.multiarray', 'numpy.core.overrides', 'numpy.core._multiarray_umath', 'numpy.compat', 'numpy.compat._inspect', 'numpy.compat.py3k', 'numpy.core.umath', 'numpy.core.numerictypes', 'numbers', 'numpy.core._string_helpers', 'numpy.core._type_aliases', 'numpy.core._dtype', 'numpy.core.numeric', 'numpy.core.shape_base', 'numpy.core._asarray', 'numpy.core.fromnumeric', 'numpy.core._methods', 'numpy.core._exceptions', 'numpy.core._ufunc_config', 'numpy.core.arrayprint', 'numpy.core.defchararray', 'numpy.core.records', 'numpy.core.memmap', 'numpy.core.function_base', 'numpy.core.machar', 'numpy.core.getlimits', 'numpy.core.einsumfunc', 'numpy.core._add_newdocs', 'numpy.core._multiarray_tests', 'numpy.core._dtype_ctypes', 'numpy.core._internal', 'numpy._pytesttester', 'numpy.lib', 'numpy.lib.mixins', 'numpy.lib.scimath', 'numpy.lib.type_check', 'numpy.lib.ufunclike', 'numpy.lib.index_tricks', 'numpy.matrixlib', 'numpy.matrixlib.defmatrix', 'numpy.linalg', 'numpy.linalg.linalg', 'numpy.lib.twodim_base', 'numpy.linalg.lapack_lite', 'numpy.linalg._umath_linalg', 'numpy.lib.function_base', 'numpy.lib.histograms', 'numpy.lib.stride_tricks', 'numpy.lib.nanfunctions', 'numpy.lib.shape_base', 'numpy.lib.polynomial', 'numpy.lib.utils', 'numpy.lib.arraysetops', 'numpy.lib.npyio', 'numpy.lib.format', 'numpy.lib._datasource', 'numpy.lib._iotools', 'numpy.lib.financial', 'decimal', '_decimal', 'numpy.lib.arrayterator', 'numpy.lib.arraypad', 'numpy.lib._version', 'numpy.fft', 'numpy.fft._pocketfft', 'numpy.fft._pocketfft_internal', 'numpy.fft.helper', 'numpy.polynomial', 'numpy.polynomial.polynomial', 'numpy.polynomial.polyutils', 'numpy.polynomial._polybase', 'numpy.polynomial.chebyshev', 'numpy.polynomial.legendre', 'numpy.polynomial.hermite', 'numpy.polynomial.hermite_e', 'numpy.polynomial.laguerre', 'numpy.random', 'numpy.random._pickle', 'numpy.random.mtrand', 'cython_runtime', 'numpy.random.bit_generator', '_cython_0_29_21', 'numpy.random._common', 'secrets', 'numpy.random._bounded_integers', 'numpy.random._mt19937', 'numpy.random._philox', 'numpy.random._pcg64', 'numpy.random._sfc64', 'numpy.random._generator', 'numpy.ctypeslib', 'numpy.ma', 'numpy.ma.core', 'numpy.ma.extras', 'numpy.testing', 'unittest', 'unittest.result', 'unittest.util', 'unittest.case', 'difflib', 'unittest.suite', 'unittest.loader', 'unittest.main', 'unittest.runner', 'unittest.signals', 'numpy.testing._private', 'numpy.testing._private.utils', 'gc', 'numpy.testing._private.decorators', 'numpy.testing._private.nosetester', 'matplotlib.cbook.deprecation', 'matplotlib.rcsetup', 'matplotlib.animation', 'uuid', 'ctypes.util', 'matplotlib._animation_data', 'matplotlib.fontconfig_pattern', 'pyparsing', 'pyparsing.util', 'pyparsing.exceptions', 'pyparsing.unicode', 'pyparsing.actions', 'pyparsing.core', 'pyparsing.results', 'pyparsing.helpers', 'html', 'html.entities', 'pyparsing.testing', 'pyparsing.common', 'matplotlib.colors', 'matplotlib.docstring', 'matplotlib._color_data', 'cycler', 'matplotlib._version', 'matplotlib.ft2font', 'dateutil', 'dateutil._version', 'kiwisolver'] +2026-07-17 09:48:50,934 DEBUG matplotlib: CACHEDIR=/tmp/tmpj8cvq4oj +2026-07-17 09:48:50,934 INFO matplotlib.font_manager: Generating new fontManager, this may take some time... +2026-07-17 09:48:50,934 DEBUG matplotlib.font_manager: font search path [PosixPath('/tmp/_MEI4fqWsX/matplotlib/mpl-data/fonts/ttf'), PosixPath('/tmp/_MEI4fqWsX/matplotlib/mpl-data/fonts/afm'), PosixPath('/tmp/_MEI4fqWsX/matplotlib/mpl-data/fonts/pdfcorefonts')] +2026-07-17 09:48:51,310 DEBUG matplotlib.pyplot: Loaded backend agg version unknown. +2026-07-17 09:48:52,336 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/ce_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:48:52,338 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:48:52,339 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/compute_workload.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:48:52,340 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/gpu_throughput_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:48:52,340 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/instruction_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:48:52,341 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/isu_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:48:52,341 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/memory_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:48:52,343 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/occupancy.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:48:52,343 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/summary.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:48:52,344 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/workgroup_memory.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:48:52,354 INFO werkzeug: * Running on http://127.0.0.1:50123/ (Press CTRL+C to quit) +2026-07-17 09:48:52,841 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:48:52,843 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:48:52] "GET / HTTP/1.1" 200 - +2026-07-17 09:48:52,843 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET / HTTP/1.1" 200 29 +2026-07-17 09:48:52,845 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:48:52,847 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:48:52] "GET /show_metrics HTTP/1.1" 200 - +2026-07-17 09:48:52,847 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /show_metrics HTTP/1.1" 200 1976 +2026-07-17 09:48:52,849 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:48:52,864 INFO phttp.http_server: start a new perf exec thread +2026-07-17 09:48:52,865 INFO phttp.server_backend: start perf_exec +2026-07-17 09:48:52,865 INFO phttp.http_server: new exec 054b0685-1efd-4049-82d2-21af8938b66e:('python tests/trace_tilelang_64g_case4.py', 'opt012_case4_targeted', ['Total Cycles', 'AP busy Duty', 'AP MMA Duty ratio', 'ISU stall cycles layout', 'VL1 Hit Rate', 'L2C Hit Rate', 'Global Memory Read bytes', 'Global Memory Write bytes', 'shared memory access efficiency', 'Achieved waves', 'Dispatched waves']) +2026-07-17 09:48:52,866 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:48:52] "POST /perf_exec HTTP/1.1" 200 - +2026-07-17 09:48:52,868 INFO common.api_common: ret_code cmdline_str: env +2026-07-17 09:48:52,868 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "POST /perf_exec HTTP/1.1" 200 51 +2026-07-17 09:48:52,879 INFO common.api_common: ret_code cmdline_str: ls /sys/devices/virtual/mxcd/ +2026-07-17 09:48:52,886 INFO common.api_common: ret_code cmdline_str: ls /sys/devices/virtual/mxcd/mxcd/layout/nodes/ +2026-07-17 09:48:52,893 INFO phttp.server_backend: get_device_info.layout nodes: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] +2026-07-17 09:48:52,893 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//0/gpu_id +2026-07-17 09:48:52,898 INFO phttp.server_backend: get_device_info.node 0 gpu_id 0 +2026-07-17 09:48:52,899 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//1/gpu_id +2026-07-17 09:48:52,904 INFO phttp.server_backend: get_device_info.node 1 gpu_id 0 +2026-07-17 09:48:52,904 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//2/gpu_id +2026-07-17 09:48:52,910 INFO phttp.server_backend: get_device_info.node 2 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//2/gpu_id: Operation not permitted +2026-07-17 09:48:52,910 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//3/gpu_id +2026-07-17 09:48:52,916 INFO phttp.server_backend: get_device_info.node 3 gpu_id 51332 +2026-07-17 09:48:52,916 INFO phttp.server_backend: get_device_info.using node id 3 +2026-07-17 09:48:52,916 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//4/gpu_id +2026-07-17 09:48:52,922 INFO phttp.server_backend: get_device_info.node 4 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//4/gpu_id: Operation not permitted +2026-07-17 09:48:52,922 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//5/gpu_id +2026-07-17 09:48:52,927 INFO phttp.server_backend: get_device_info.node 5 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//5/gpu_id: Operation not permitted +2026-07-17 09:48:52,928 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//6/gpu_id +2026-07-17 09:48:52,933 INFO phttp.server_backend: get_device_info.node 6 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//6/gpu_id: Operation not permitted +2026-07-17 09:48:52,933 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//7/gpu_id +2026-07-17 09:48:52,939 INFO phttp.server_backend: get_device_info.node 7 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//7/gpu_id: Operation not permitted +2026-07-17 09:48:52,939 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//8/gpu_id +2026-07-17 09:48:52,945 INFO phttp.server_backend: get_device_info.node 8 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//8/gpu_id: Operation not permitted +2026-07-17 09:48:52,945 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//9/gpu_id +2026-07-17 09:48:52,950 INFO phttp.server_backend: get_device_info.node 9 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//9/gpu_id: Operation not permitted +2026-07-17 09:48:52,951 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//3/properties +2026-07-17 09:48:52,956 ERROR phttp.server_backend: get_device_info.parse 3 device info vbios_version 1.33.5.0 error. +2026-07-17 09:48:52,957 INFO phttp.server_backend: get_device_info.device_info: {'3': {'gpu_id': '51332', 'cpu_cores_count': 0, 'mem_banks_count': 1, 'direct_link_count': 4, 'indirect_link_count': 8, 'vendor_id': 39321, 'device_id': 16385, 'drm_render_minor': 129, 'isa_major': 10, 'isa_minor': 0, 'is_vf': 0, 'max_vf_nums': 8, 'domain': 0, 'location_id': 3840, 'num_sdma_engines': 5, 'num_sdma_queues_per_engine': 9, 'num_vpue_cores': 1, 'num_vpud_cores': 8, 'caches_count': 157, 'peu_id_base': 0, 'peu_count': 416, 'max_waves_per_peu': 8, 'wsm_size_in_kb': 64, 'wave_front_size': 64, 'dpc_count': 8, 'dpc0_ap_mask': 8191, 'dpc1_ap_mask': 73727, 'dpc2_ap_mask': 139263, 'dpc3_ap_mask': 204799, 'dpc4_ap_mask': 270335, 'dpc5_ap_mask': 335871, 'dpc6_ap_mask': 401407, 'dpc7_ap_mask': 466943, 'dpc_arrays': 1, 'ap_per_dpc': 13, 'peu_per_ap': 4, 'pri_mem_per_thread': 4, 'max_slots_private_ap': 32, 'num_ce_queues': 16, 'max_engine_clk_gpu': 1600, 'max_engine_clk_cpu': 3600, 'mgpu_id': 0, 'topology_id': 2, 'socket_id': 3, 'hbmecc': 1, 'local_mem_size': 68719476736, 'capability': 4432512, 'maxprocess': 10}} +2026-07-17 09:48:52,957 INFO phttp.server_backend: start generate batch files +2026-07-17 09:48:52,958 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:48:52,958 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,958 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,958 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:48:52,958 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,959 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,960 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:48:52,961 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,962 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,962 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,962 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@vl1_hit_rate'}] +2026-07-17 09:48:52,962 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,962 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,962 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@l2c_hit_rate'}] +2026-07-17 09:48:52,962 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,963 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_32B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_128B}}'}] +2026-07-17 09:48:52,963 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,963 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,963 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_low}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_high}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_128B}}'}] +2026-07-17 09:48:52,964 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,964 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,964 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_RD_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_WR_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_ATOMIC_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_CONFLICT_CYCLES}}'}] +2026-07-17 09:48:52,965 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,965 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,965 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_WAVES}}'}] +2026-07-17 09:48:52,966 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,966 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,966 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P0}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P1}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P2}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P3}}'}] +2026-07-17 09:48:52,966 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,966 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,966 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:48:52,966 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,967 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,967 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:48:52,967 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,968 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:48:52,968 INFO utils.complier: analyse formula:[] +2026-07-17 09:48:52,968 INFO common.api_common: f_var:RM.RM_PERF_DISPATCHED_WAVES_P3 +2026-07-17 09:48:52,968 INFO common.api_common: f_var:ISU.AP_PERF_BSM_ATOMIC_CYCLES +2026-07-17 09:48:52,968 INFO common.api_common: f_var:L2C.perf_dnoc_wrreq_128B +2026-07-17 09:48:52,968 INFO common.api_common: f_var:L2C.perf_dnoc_wrreq_32B_low +2026-07-17 09:48:52,968 INFO common.api_common: f_var:L2C.perf_dnoc_wrreq_32B_high +2026-07-17 09:48:52,968 INFO common.api_common: f_var:L2C.perf_dnoc_rdreq_32B +2026-07-17 09:48:52,968 INFO common.api_common: f_var:RM.RM_PERF_DISPATCHED_WAVES_P0 +2026-07-17 09:48:52,968 INFO common.api_common: f_var:ISU.AP_PERF_ISU_ARB_VLS_STALL +2026-07-17 09:48:52,968 INFO common.api_common: f_var:ISU.AP_PERF_BSM_CONFLICT_CYCLES +2026-07-17 09:48:52,968 INFO common.api_common: f_var:L2C.perf_hit +2026-07-17 09:48:52,968 INFO common.api_common: f_var:ISU.AP_PERF_ISU_ARB_DATA_STALL +2026-07-17 09:48:52,968 INFO common.api_common: f_var:ISU.AP_PERF_BSM_RD_CYCLES +2026-07-17 09:48:52,968 INFO common.api_common: f_var:ISU.AP_PERF_BSM_WR_CYCLES +2026-07-17 09:48:52,968 INFO common.api_common: f_var:L2C.perf_dnoc_rdreq_128B +2026-07-17 09:48:52,968 INFO common.api_common: f_var:VL1.p_perf_thread_req_cnt +2026-07-17 09:48:52,968 INFO common.api_common: f_var:ISU.AP_PERF_ISU_ARB_WSM_STALL +2026-07-17 09:48:52,968 INFO common.api_common: f_var:L2C.perf_dnoc_wrreq_64B +2026-07-17 09:48:52,968 INFO common.api_common: f_var:L2C.perf_miss +2026-07-17 09:48:52,968 INFO common.api_common: f_var:VL1.p_perf_miss_cnt +2026-07-17 09:48:52,968 INFO common.api_common: f_var:L2C.perf_dnoc_rdreq_64B +2026-07-17 09:48:52,968 INFO common.api_common: f_var:L2C.perf_sector_hit +2026-07-17 09:48:52,968 INFO common.api_common: f_var:RM.RM_PERF_DISPATCHED_WAVES_P1 +2026-07-17 09:48:52,968 INFO common.api_common: f_var:ISU.AP_PERF_WAVES +2026-07-17 09:48:52,968 INFO common.api_common: f_var:ISU.AP_PERF_INST_CYCLES_MMA +2026-07-17 09:48:52,968 INFO common.api_common: f_var:ISU.AP_PERF_ISU_ARB_VALU_STALL +2026-07-17 09:48:52,968 INFO common.api_common: f_var:CE.CE_PERF_BUSY_CYCLES +2026-07-17 09:48:52,969 INFO common.api_common: f_var:RM.RM_PERF_DISPATCHED_WAVES_P2 +2026-07-17 09:48:52,969 INFO common.api_common: f_var:ISU.AP_PERF_ISU_AP_BUSY +2026-07-17 09:48:52,970 INFO tools.events_generator.batches_generator: output path is: /opt/mcProfiler-ubuntu18.04/output20260717094852 +2026-07-17 09:48:52,970 INFO tools.events_generator.batches_generator: generate event_batch_0.json successfully! +2026-07-17 09:48:52,971 INFO phttp.server_backend: generate batch files done +2026-07-17 09:48:52,971 INFO common.api_common: ret_code cmdline_str: rm -f /root/mcRpcPort.ini +2026-07-17 09:48:52,976 INFO common.api_common: ret_code cmdline_str: cp /opt/mcProfiler-ubuntu18.04/output20260717094852/event_batch_0.json /opt/mcProfiler-ubuntu18.04/output20260717094852/mcProfiler.json +2026-07-17 09:48:52,985 INFO common.api_common: ret_code cmdline_str: cd /data/operator_task_package/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill; export MCTX_TARGET_INIT=true; export MACA_ETC_PATH=/opt/mcProfiler-ubuntu18.04/output20260717094852; export MACA_LAUNCH_BLOCKING=1; export MXLOG_LEVEL=info; python tests/trace_tilelang_64g_case4.py +2026-07-17 09:48:52,985 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:48:52,996 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:48:53,397 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:48:53,406 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:48:53,906 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:48:53,913 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:48:54,514 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:48:54,520 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:48:55,221 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:48:55,227 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:48:56,028 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:48:56,037 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:48:56,938 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:48:56,945 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:48:57,881 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:48:57,886 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:48:57] "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 - +2026-07-17 09:48:57,886 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 780 +2026-07-17 09:48:57,946 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:48:57,952 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:48:58,954 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:48:58,960 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:48:59,961 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:48:59,967 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:00,968 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:00,974 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:01,976 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:01,982 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:02,894 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:49:02,898 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:49:02] "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 - +2026-07-17 09:49:02,899 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 780 +2026-07-17 09:49:02,983 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:02,989 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:03,990 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:03,996 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:04,997 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:05,002 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:06,004 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:06,009 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:07,011 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:07,016 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:07,906 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:49:07,911 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:49:07] "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 - +2026-07-17 09:49:07,911 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 1713 +2026-07-17 09:49:08,017 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:08,023 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:09,024 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:09,030 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:10,031 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:10,037 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:11,038 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:11,044 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:12,045 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:12,051 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:12,919 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:49:12,923 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:49:12] "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 - +2026-07-17 09:49:12,923 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 1713 +2026-07-17 09:49:13,052 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:13,058 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:14,059 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:14,065 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:15,066 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:15,072 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:16,073 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:16,078 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:17,080 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:17,085 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:17,930 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:49:17,935 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:49:17] "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 - +2026-07-17 09:49:17,935 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 1713 +2026-07-17 09:49:18,086 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:18,092 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:19,093 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:19,099 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:20,100 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:21,117 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:21,120 INFO prpc_client.mctool_client: MctxStreamProfilerCountDataGet Start +2026-07-17 09:49:21,121 INFO prpc_client.mctool_client: MctxStreamProfilerCountDataGet Loop +2026-07-17 09:49:22,124 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:22,944 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:49:22,953 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:49:22] "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 - +2026-07-17 09:49:22,953 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 1713 +2026-07-17 09:49:23,131 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:24,138 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:25,145 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:26,152 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:27,159 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:27,518 INFO prpc_client.mctool_client: MctxStreamProfilerCountDataGet Loop +2026-07-17 09:49:27,718 INFO prpc_client.mctool_client: MctxStreamProfilerCountDataGet Loop +2026-07-17 09:49:27,961 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:49:27,965 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:49:27] "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 - +2026-07-17 09:49:27,965 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 1713 +2026-07-17 09:49:28,166 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:29,173 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:29,182 INFO prpc_client.mctool_client: MctxStreamProfilerCountDataGet Loop +2026-07-17 09:49:30,180 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:31,187 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:31,194 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:32,195 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:32,201 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:32,972 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:49:32,976 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:49:32] "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 - +2026-07-17 09:49:32,976 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 1713 +2026-07-17 09:49:33,202 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:33,208 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:34,209 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:34,216 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:35,217 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:35,223 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:36,224 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:36,230 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:37,232 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:37,238 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:37,980 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:49:37,984 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:49:37] "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 - +2026-07-17 09:49:37,985 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 1713 +2026-07-17 09:49:38,239 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:38,245 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:39,247 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:49:39,253 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:49:40,256 INFO phttp.server_backend: profiling task 054b0685-1efd-4049-82d2-21af8938b66e +2026-07-17 09:49:40,256 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:49:40,257 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,257 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,257 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_SALU in ISU +2026-07-17 09:49:40,257 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_SALU in ISU +2026-07-17 09:49:40,257 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:49:40,257 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,257 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,257 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_GVM in ISU +2026-07-17 09:49:40,257 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_GVM in ISU +2026-07-17 09:49:40,257 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,258 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:49:40,258 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,258 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:49:40,258 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:49:40,258 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:40,258 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:49:40,258 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,258 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:49:40,258 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:49:40,258 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_RD}}'}] +2026-07-17 09:49:40,258 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,258 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,258 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:49:40,258 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:49:40,258 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_WR}}'}] +2026-07-17 09:49:40,258 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,259 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,259 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:49:40,259 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:49:40,259 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_RD}}'}] +2026-07-17 09:49:40,259 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,259 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,259 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:49:40,259 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:49:40,259 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_WR}}'}] +2026-07-17 09:49:40,259 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,259 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,259 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:49:40,259 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:49:40,259 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_RD}}'}] +2026-07-17 09:49:40,259 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,259 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,260 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:49:40,260 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:49:40,260 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_WR}}'}] +2026-07-17 09:49:40,260 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,260 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,260 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:49:40,260 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:49:40,260 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:49:40,260 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,260 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,260 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:49:40,260 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:49:40,260 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_RD}}'}] +2026-07-17 09:49:40,260 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,260 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,260 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:49:40,260 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:49:40,261 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_WR}}'}] +2026-07-17 09:49:40,261 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,261 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,261 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:49:40,261 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:49:40,261 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_read_instruction_event}}'}] +2026-07-17 09:49:40,261 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,261 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,261 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_read_instruction_event in VL1 +2026-07-17 09:49:40,261 ERROR utils.pc_base: cannot calculate: can not fine value p_total_read_instruction_event in VL1 +2026-07-17 09:49:40,261 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_write_instruction_event}}'}] +2026-07-17 09:49:40,261 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,261 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,261 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_write_instruction_event in VL1 +2026-07-17 09:49:40,261 ERROR utils.pc_base: cannot calculate: can not fine value p_total_write_instruction_event in VL1 +2026-07-17 09:49:40,262 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:49:40,262 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,262 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,263 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$vl1hit'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$vl1hit'}] +2026-07-17 09:49:40,264 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,264 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:49:40,265 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,266 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,267 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_rd_req}}'}] +2026-07-17 09:49:40,267 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,267 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,267 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_rd_req in L2C +2026-07-17 09:49:40,267 ERROR utils.pc_base: cannot calculate: can not fine value perf_rd_req in L2C +2026-07-17 09:49:40,267 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_wr_req}}'}] +2026-07-17 09:49:40,267 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,267 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,267 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_wr_req in L2C +2026-07-17 09:49:40,267 ERROR utils.pc_base: cannot calculate: can not fine value perf_wr_req in L2C +2026-07-17 09:49:40,267 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:49:40,268 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,268 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,268 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$hit_events'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$hit_events'}, {'type': 'PROC_VAR', 'value': '$hit_events'}] +2026-07-17 09:49:40,269 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,270 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:49:40,271 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,273 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,273 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_on_miss_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_miss_event}}'}] +2026-07-17 09:49:40,273 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,274 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,274 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:49:40,274 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:49:40,274 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_rd}}'}] +2026-07-17 09:49:40,274 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,274 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,274 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_rd +2026-07-17 09:49:40,274 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_rd +2026-07-17 09:49:40,274 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_l2_rd}}'}] +2026-07-17 09:49:40,274 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,274 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,274 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_l2_rd +2026-07-17 09:49:40,274 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_l2_rd +2026-07-17 09:49:40,275 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:49:40,275 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,275 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,275 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:49:40,275 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:49:40,275 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,275 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,276 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,276 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,276 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,276 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,276 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,277 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,277 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,277 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,277 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,278 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,278 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,278 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,278 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,279 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,280 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:49:40,281 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,282 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,284 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,285 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,286 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:49:40,288 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,289 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,318 DEBUG matplotlib.font_manager: findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=12.0. +2026-07-17 09:49:40,319 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:49:40,319 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,319 DEBUG matplotlib.font_manager: findfont: score() = 1.05 +2026-07-17 09:49:40,319 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 1.335 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 0.33499999999999996 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,320 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 0.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 0.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 0.33499999999999996 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,321 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:49:40,322 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,322 DEBUG matplotlib.font_manager: findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=12.0 to DejaVu Sans ('/tmp/_MEI4fqWsX/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf') with score of 0.050000. +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0. +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 1.05 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 1.335 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 0.33499999999999996 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:49:40,326 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 0.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:49:40,327 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,328 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,328 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,328 DEBUG matplotlib.font_manager: findfont: score() = 0.05 +2026-07-17 09:49:40,328 DEBUG matplotlib.font_manager: findfont: score() = 0.33499999999999996 +2026-07-17 09:49:40,328 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,328 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:49:40,328 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:49:40,328 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,328 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:49:40,328 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:49:40,328 DEBUG matplotlib.font_manager: findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to DejaVu Sans ('/tmp/_MEI4fqWsX/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf') with score of 0.050000. +2026-07-17 09:49:40,425 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,425 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,425 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@vl1_hit_rate'}] +2026-07-17 09:49:40,425 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,425 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,425 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,425 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@vl1_hit_rate'}] +2026-07-17 09:49:40,426 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,426 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,426 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,426 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@l2c_hit_rate'}] +2026-07-17 09:49:40,426 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,426 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,426 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,427 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@l2c_hit_rate'}] +2026-07-17 09:49:40,427 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,427 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_32B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_128B}}'}] +2026-07-17 09:49:40,427 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,427 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,428 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,428 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,428 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_32B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_128B}}'}] +2026-07-17 09:49:40,429 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,430 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,430 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_low}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_high}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_128B}}'}] +2026-07-17 09:49:40,430 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,430 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,431 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,431 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,431 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_low}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_high}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_128B}}'}] +2026-07-17 09:49:40,432 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,433 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,434 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_RD_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_WR_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_ATOMIC_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_CONFLICT_CYCLES}}'}] +2026-07-17 09:49:40,434 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,435 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,435 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$conflict_cycle'}, {'type': 'PROC_VAR', 'value': '$rate'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$conflict_cycle'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$rate'}] +2026-07-17 09:49:40,437 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,439 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_RD_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_WR_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_ATOMIC_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_CONFLICT_CYCLES}}'}] +2026-07-17 09:49:40,442 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,445 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,445 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_WAVES}}'}] +2026-07-17 09:49:40,445 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,445 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,445 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,445 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,445 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_WAVES}}'}] +2026-07-17 09:49:40,446 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,446 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,446 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P0}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P1}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P2}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P3}}'}] +2026-07-17 09:49:40,446 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,446 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,447 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,447 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,447 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P0}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P1}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P2}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P3}}'}] +2026-07-17 09:49:40,448 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,449 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,449 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:40,449 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,449 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,449 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,450 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,450 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:40,450 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,451 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,451 INFO common.report_asm: report infomation: ############################## +Sub-module: Summary +------------------------------ +Name: Total Cycles +Description: cycles use by kernel +Value: 10,581,470.54(Kcycles) +------------------------------ +Name: AP busy Duty +Description: average AP busy duty of total cycles +Value: 15.15% +############################## +Sub-module: ISU Statistics +------------------------------ +Name: ISU stall cycles layout +Description: ISU stall cycles layout +Value: { + "data": { + "wsm_stall": 38538769129.22506, + "vls_pipeline_stall": 4604570054.1626835, + "vls_wdata_stall": 72943813.86809078, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717094852/ISU_stall_cycles_layout20260717094940283.png" +} +############################## +Sub-module: Memory Statistics +------------------------------ +Name: VL1 Hit Rate +Description: hit rate of all instructions in all VL1s +Value: 87.34% +------------------------------ +Name: L2C Hit Rate +Description: hit rate of all instructions in all L2Cs +Value: 97.30% +------------------------------ +Name: Global Memory Read bytes +Description: bytes read from global memory +Value: 10,241,134,592.0byte +------------------------------ +Name: Global Memory Write bytes +Description: bytes write from global memory +Value: 4,664,074,240.0byte +############################## +Sub-module: Workgroup Memory +------------------------------ +Name: shared memory access efficiency +Description: Proportion of NON-CONFLICT access +Value: 74.04% +############################## +Sub-module: Occupancy +------------------------------ +Name: Achieved waves +Description: number of achieved waves +Value: 1,554,177.00 +------------------------------ +Name: Dispatched waves +Description: number of dispatched waves +Value: 1,554,176.0 +############################## +Sub-module: GPU Throughput Statistics +------------------------------ +Name: AP MMA Duty ratio +Description: MMA Duty ratio relative to AP active +Value: 20.12% +2026-07-17 09:49:40,460 DEBUG PIL.PngImagePlugin: STREAM b'IHDR' 16 13 +2026-07-17 09:49:40,460 DEBUG PIL.PngImagePlugin: STREAM b'tEXt' 41 57 +2026-07-17 09:49:40,460 DEBUG PIL.PngImagePlugin: STREAM b'pHYs' 110 9 +2026-07-17 09:49:40,460 DEBUG PIL.PngImagePlugin: STREAM b'IDAT' 131 40240 +2026-07-17 09:49:40,608 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:49:40,608 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,608 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,608 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_SALU in ISU +2026-07-17 09:49:40,608 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_SALU in ISU +2026-07-17 09:49:40,608 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:49:40,609 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,609 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,609 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_GVM in ISU +2026-07-17 09:49:40,609 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_GVM in ISU +2026-07-17 09:49:40,609 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,609 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:49:40,609 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,609 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:49:40,609 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:49:40,609 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:40,609 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:49:40,609 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,609 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:49:40,609 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:49:40,610 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_RD}}'}] +2026-07-17 09:49:40,610 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,610 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,610 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:49:40,610 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:49:40,610 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_WR}}'}] +2026-07-17 09:49:40,610 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,610 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,610 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:49:40,610 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:49:40,610 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_RD}}'}] +2026-07-17 09:49:40,610 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,610 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,610 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:49:40,610 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:49:40,610 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_WR}}'}] +2026-07-17 09:49:40,611 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,611 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,611 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:49:40,611 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:49:40,611 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_RD}}'}] +2026-07-17 09:49:40,611 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,611 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,611 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:49:40,611 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:49:40,611 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_WR}}'}] +2026-07-17 09:49:40,611 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,611 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,611 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:49:40,611 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:49:40,611 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:49:40,612 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,612 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,612 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:49:40,612 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:49:40,612 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_RD}}'}] +2026-07-17 09:49:40,612 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,612 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,612 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:49:40,612 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:49:40,612 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_WR}}'}] +2026-07-17 09:49:40,612 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,612 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,612 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:49:40,612 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:49:40,612 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_read_instruction_event}}'}] +2026-07-17 09:49:40,612 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,613 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,613 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_read_instruction_event in VL1 +2026-07-17 09:49:40,613 ERROR utils.pc_base: cannot calculate: can not fine value p_total_read_instruction_event in VL1 +2026-07-17 09:49:40,613 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_write_instruction_event}}'}] +2026-07-17 09:49:40,613 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,613 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,613 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_write_instruction_event in VL1 +2026-07-17 09:49:40,613 ERROR utils.pc_base: cannot calculate: can not fine value p_total_write_instruction_event in VL1 +2026-07-17 09:49:40,613 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:49:40,614 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,614 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,614 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$vl1hit'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$vl1hit'}] +2026-07-17 09:49:40,615 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,616 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:49:40,617 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,618 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,618 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_rd_req}}'}] +2026-07-17 09:49:40,618 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,618 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,618 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_rd_req in L2C +2026-07-17 09:49:40,618 ERROR utils.pc_base: cannot calculate: can not fine value perf_rd_req in L2C +2026-07-17 09:49:40,618 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_wr_req}}'}] +2026-07-17 09:49:40,619 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,619 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,619 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_wr_req in L2C +2026-07-17 09:49:40,619 ERROR utils.pc_base: cannot calculate: can not fine value perf_wr_req in L2C +2026-07-17 09:49:40,619 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:49:40,619 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,619 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,620 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$hit_events'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$hit_events'}, {'type': 'PROC_VAR', 'value': '$hit_events'}] +2026-07-17 09:49:40,621 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,622 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:49:40,623 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,624 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,625 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_on_miss_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_miss_event}}'}] +2026-07-17 09:49:40,625 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,625 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,625 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:49:40,625 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:49:40,625 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_rd}}'}] +2026-07-17 09:49:40,625 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,625 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,625 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_rd +2026-07-17 09:49:40,626 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_rd +2026-07-17 09:49:40,626 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_l2_rd}}'}] +2026-07-17 09:49:40,626 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,626 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,626 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_l2_rd +2026-07-17 09:49:40,626 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_l2_rd +2026-07-17 09:49:40,626 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:49:40,626 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,627 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,627 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:49:40,627 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:49:40,627 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,627 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,627 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,627 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,627 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,628 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,628 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,628 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,628 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,628 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,629 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,629 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,629 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,629 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,630 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,630 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,631 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:49:40,632 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,634 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,635 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,636 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,637 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:49:40,639 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,641 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,756 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,756 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,756 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@vl1_hit_rate'}] +2026-07-17 09:49:40,756 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,756 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,756 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,757 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@vl1_hit_rate'}] +2026-07-17 09:49:40,757 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,757 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,757 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,757 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@l2c_hit_rate'}] +2026-07-17 09:49:40,757 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,757 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,758 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,758 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@l2c_hit_rate'}] +2026-07-17 09:49:40,758 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,758 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_32B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_128B}}'}] +2026-07-17 09:49:40,758 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,759 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,759 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,759 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,759 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_32B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_128B}}'}] +2026-07-17 09:49:40,760 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,761 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,761 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_low}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_high}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_128B}}'}] +2026-07-17 09:49:40,761 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,762 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,762 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,762 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,763 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_low}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_high}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_128B}}'}] +2026-07-17 09:49:40,763 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,764 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,765 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_RD_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_WR_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_ATOMIC_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_CONFLICT_CYCLES}}'}] +2026-07-17 09:49:40,765 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,766 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,766 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$conflict_cycle'}, {'type': 'PROC_VAR', 'value': '$rate'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$conflict_cycle'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$rate'}] +2026-07-17 09:49:40,769 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,771 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_RD_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_WR_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_ATOMIC_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_CONFLICT_CYCLES}}'}] +2026-07-17 09:49:40,773 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,776 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,776 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_WAVES}}'}] +2026-07-17 09:49:40,776 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,776 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,776 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,776 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,777 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_WAVES}}'}] +2026-07-17 09:49:40,777 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,777 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,777 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P0}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P1}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P2}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P3}}'}] +2026-07-17 09:49:40,778 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,778 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,778 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,778 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,778 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P0}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P1}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P2}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P3}}'}] +2026-07-17 09:49:40,779 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,780 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,780 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:40,780 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,780 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,781 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,781 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,781 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:40,782 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,782 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,783 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:49:40,783 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,784 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,784 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_SALU in ISU +2026-07-17 09:49:40,784 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_SALU in ISU +2026-07-17 09:49:40,784 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:49:40,784 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,784 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,784 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_GVM in ISU +2026-07-17 09:49:40,784 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_GVM in ISU +2026-07-17 09:49:40,784 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,784 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:49:40,784 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,784 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:49:40,784 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:49:40,785 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:40,785 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:49:40,785 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,785 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:49:40,785 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:49:40,785 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_RD}}'}] +2026-07-17 09:49:40,785 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,785 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,785 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:49:40,785 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:49:40,785 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_WR}}'}] +2026-07-17 09:49:40,785 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,785 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,785 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:49:40,785 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:49:40,785 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_RD}}'}] +2026-07-17 09:49:40,786 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,786 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,786 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:49:40,786 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:49:40,786 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_WR}}'}] +2026-07-17 09:49:40,786 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,786 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,786 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:49:40,786 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:49:40,786 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_RD}}'}] +2026-07-17 09:49:40,786 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,786 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,786 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:49:40,786 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:49:40,786 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_WR}}'}] +2026-07-17 09:49:40,786 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,787 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,787 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:49:40,787 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:49:40,787 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:49:40,787 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,787 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,787 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:49:40,787 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:49:40,787 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_RD}}'}] +2026-07-17 09:49:40,787 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,787 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,787 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:49:40,787 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:49:40,787 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_WR}}'}] +2026-07-17 09:49:40,787 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,787 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,787 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:49:40,788 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:49:40,788 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_read_instruction_event}}'}] +2026-07-17 09:49:40,788 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,788 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,788 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_read_instruction_event in VL1 +2026-07-17 09:49:40,788 ERROR utils.pc_base: cannot calculate: can not fine value p_total_read_instruction_event in VL1 +2026-07-17 09:49:40,788 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_write_instruction_event}}'}] +2026-07-17 09:49:40,788 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,788 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,788 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_write_instruction_event in VL1 +2026-07-17 09:49:40,788 ERROR utils.pc_base: cannot calculate: can not fine value p_total_write_instruction_event in VL1 +2026-07-17 09:49:40,788 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:49:40,789 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,789 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,790 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$vl1hit'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$vl1hit'}] +2026-07-17 09:49:40,790 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,791 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:49:40,792 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,793 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,793 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_rd_req}}'}] +2026-07-17 09:49:40,793 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,793 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,793 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_rd_req in L2C +2026-07-17 09:49:40,793 ERROR utils.pc_base: cannot calculate: can not fine value perf_rd_req in L2C +2026-07-17 09:49:40,794 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_wr_req}}'}] +2026-07-17 09:49:40,794 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,794 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,794 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_wr_req in L2C +2026-07-17 09:49:40,794 ERROR utils.pc_base: cannot calculate: can not fine value perf_wr_req in L2C +2026-07-17 09:49:40,794 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:49:40,794 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,795 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,795 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$hit_events'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$hit_events'}, {'type': 'PROC_VAR', 'value': '$hit_events'}] +2026-07-17 09:49:40,796 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,797 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:49:40,798 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,799 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,800 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_on_miss_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_miss_event}}'}] +2026-07-17 09:49:40,800 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,800 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,800 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:49:40,800 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:49:40,800 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_rd}}'}] +2026-07-17 09:49:40,800 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,801 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,801 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_rd +2026-07-17 09:49:40,801 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_rd +2026-07-17 09:49:40,801 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_l2_rd}}'}] +2026-07-17 09:49:40,801 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,801 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,801 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_l2_rd +2026-07-17 09:49:40,801 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_l2_rd +2026-07-17 09:49:40,801 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:49:40,802 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,802 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,802 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:49:40,802 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:49:40,802 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,802 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,802 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,802 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,803 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,803 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,803 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,803 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,804 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,804 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,804 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,804 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,804 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,804 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,805 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,805 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,807 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:49:40,808 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,809 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,810 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,811 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,812 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:49:40,814 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,816 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,928 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,928 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,929 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@vl1_hit_rate'}] +2026-07-17 09:49:40,929 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,929 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,929 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,929 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@vl1_hit_rate'}] +2026-07-17 09:49:40,929 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,930 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,930 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,930 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@l2c_hit_rate'}] +2026-07-17 09:49:40,930 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,930 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,930 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,930 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@l2c_hit_rate'}] +2026-07-17 09:49:40,931 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,931 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_32B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_128B}}'}] +2026-07-17 09:49:40,931 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,931 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,931 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,932 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,932 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_32B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_128B}}'}] +2026-07-17 09:49:40,933 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,933 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,934 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_low}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_high}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_128B}}'}] +2026-07-17 09:49:40,934 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,934 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,935 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,935 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,935 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_low}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_high}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_128B}}'}] +2026-07-17 09:49:40,936 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,937 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,938 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_RD_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_WR_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_ATOMIC_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_CONFLICT_CYCLES}}'}] +2026-07-17 09:49:40,938 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,939 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,939 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$conflict_cycle'}, {'type': 'PROC_VAR', 'value': '$rate'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$conflict_cycle'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$rate'}] +2026-07-17 09:49:40,941 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,943 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_RD_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_WR_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_ATOMIC_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_CONFLICT_CYCLES}}'}] +2026-07-17 09:49:40,946 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,949 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,949 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_WAVES}}'}] +2026-07-17 09:49:40,949 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,949 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,949 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,949 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,949 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_WAVES}}'}] +2026-07-17 09:49:40,950 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,950 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,950 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P0}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P1}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P2}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P3}}'}] +2026-07-17 09:49:40,950 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,951 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,951 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,951 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,951 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P0}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P1}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P2}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P3}}'}] +2026-07-17 09:49:40,952 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,953 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,953 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:40,953 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,953 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,954 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,954 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,954 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:40,955 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,955 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,961 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:49:40,961 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,961 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,961 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_SALU in ISU +2026-07-17 09:49:40,961 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_SALU in ISU +2026-07-17 09:49:40,961 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:49:40,961 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,962 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,962 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_GVM in ISU +2026-07-17 09:49:40,962 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_GVM in ISU +2026-07-17 09:49:40,962 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,962 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:49:40,962 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,962 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:49:40,962 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:49:40,962 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:40,962 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:49:40,962 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,962 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:49:40,962 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:49:40,962 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_RD}}'}] +2026-07-17 09:49:40,962 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,963 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,963 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:49:40,963 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:49:40,963 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_WR}}'}] +2026-07-17 09:49:40,963 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,963 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,963 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:49:40,963 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:49:40,963 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_RD}}'}] +2026-07-17 09:49:40,963 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,963 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,963 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:49:40,963 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:49:40,963 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_WR}}'}] +2026-07-17 09:49:40,963 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,963 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,964 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:49:40,964 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:49:40,964 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_RD}}'}] +2026-07-17 09:49:40,964 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,964 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,964 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:49:40,964 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:49:40,964 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_WR}}'}] +2026-07-17 09:49:40,964 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,964 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,964 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:49:40,964 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:49:40,964 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:49:40,964 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,964 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,964 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:49:40,964 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:49:40,965 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_RD}}'}] +2026-07-17 09:49:40,965 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,965 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,965 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:49:40,965 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:49:40,965 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_WR}}'}] +2026-07-17 09:49:40,965 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,965 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,965 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:49:40,965 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:49:40,965 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_read_instruction_event}}'}] +2026-07-17 09:49:40,965 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,965 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,965 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_read_instruction_event in VL1 +2026-07-17 09:49:40,965 ERROR utils.pc_base: cannot calculate: can not fine value p_total_read_instruction_event in VL1 +2026-07-17 09:49:40,965 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_write_instruction_event}}'}] +2026-07-17 09:49:40,966 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,966 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,966 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_write_instruction_event in VL1 +2026-07-17 09:49:40,966 ERROR utils.pc_base: cannot calculate: can not fine value p_total_write_instruction_event in VL1 +2026-07-17 09:49:40,966 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:49:40,966 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,967 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,967 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$vl1hit'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$vl1hit'}] +2026-07-17 09:49:40,968 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,969 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:49:40,970 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,971 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,971 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_rd_req}}'}] +2026-07-17 09:49:40,971 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,971 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,971 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_rd_req in L2C +2026-07-17 09:49:40,971 ERROR utils.pc_base: cannot calculate: can not fine value perf_rd_req in L2C +2026-07-17 09:49:40,971 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_wr_req}}'}] +2026-07-17 09:49:40,971 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,971 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,971 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_wr_req in L2C +2026-07-17 09:49:40,971 ERROR utils.pc_base: cannot calculate: can not fine value perf_wr_req in L2C +2026-07-17 09:49:40,972 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:49:40,972 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,972 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,973 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$hit_events'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$hit_events'}, {'type': 'PROC_VAR', 'value': '$hit_events'}] +2026-07-17 09:49:40,973 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,974 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:49:40,976 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,977 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,977 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_on_miss_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_miss_event}}'}] +2026-07-17 09:49:40,978 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,978 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,978 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:49:40,978 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:49:40,978 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_rd}}'}] +2026-07-17 09:49:40,978 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,978 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,978 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_rd +2026-07-17 09:49:40,978 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_rd +2026-07-17 09:49:40,978 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_l2_rd}}'}] +2026-07-17 09:49:40,978 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,979 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,979 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_l2_rd +2026-07-17 09:49:40,979 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_l2_rd +2026-07-17 09:49:40,979 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:49:40,979 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,979 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,979 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:49:40,979 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:49:40,980 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,980 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,980 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,980 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,980 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,980 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,981 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,981 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,981 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,981 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,981 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,982 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,982 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,982 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:40,982 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,983 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,984 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:49:40,985 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,986 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,988 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:40,989 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,990 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:49:40,992 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:40,993 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,111 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,111 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,111 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@vl1_hit_rate'}] +2026-07-17 09:49:41,111 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,111 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,111 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,112 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@vl1_hit_rate'}] +2026-07-17 09:49:41,112 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,112 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,112 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,112 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@l2c_hit_rate'}] +2026-07-17 09:49:41,112 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,112 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,113 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,113 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@l2c_hit_rate'}] +2026-07-17 09:49:41,113 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,113 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_32B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_128B}}'}] +2026-07-17 09:49:41,113 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,114 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,114 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,114 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,114 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_32B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_128B}}'}] +2026-07-17 09:49:41,115 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,116 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,116 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_low}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_high}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_128B}}'}] +2026-07-17 09:49:41,116 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,117 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,117 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,117 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,118 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_low}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_high}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_128B}}'}] +2026-07-17 09:49:41,118 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,119 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,120 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_RD_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_WR_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_ATOMIC_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_CONFLICT_CYCLES}}'}] +2026-07-17 09:49:41,120 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,121 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,121 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$conflict_cycle'}, {'type': 'PROC_VAR', 'value': '$rate'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$conflict_cycle'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$rate'}] +2026-07-17 09:49:41,124 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,126 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_RD_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_WR_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_ATOMIC_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_CONFLICT_CYCLES}}'}] +2026-07-17 09:49:41,128 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,131 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,131 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_WAVES}}'}] +2026-07-17 09:49:41,131 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,131 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,131 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,131 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,132 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_WAVES}}'}] +2026-07-17 09:49:41,132 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,132 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,132 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P0}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P1}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P2}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P3}}'}] +2026-07-17 09:49:41,132 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,133 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,133 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,133 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,133 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P0}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P1}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P2}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P3}}'}] +2026-07-17 09:49:41,134 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,135 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,135 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:41,135 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,135 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,136 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,136 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,136 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:41,137 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,137 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,138 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:49:41,138 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,139 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,139 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_SALU in ISU +2026-07-17 09:49:41,139 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_SALU in ISU +2026-07-17 09:49:41,139 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:49:41,139 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,139 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,139 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_GVM in ISU +2026-07-17 09:49:41,139 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_GVM in ISU +2026-07-17 09:49:41,139 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,139 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:49:41,139 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,139 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:49:41,139 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:49:41,140 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:41,140 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:49:41,140 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,140 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:49:41,140 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:49:41,140 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_RD}}'}] +2026-07-17 09:49:41,140 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,140 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,140 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:49:41,140 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:49:41,140 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_WR}}'}] +2026-07-17 09:49:41,140 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,140 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,140 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:49:41,140 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:49:41,141 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_RD}}'}] +2026-07-17 09:49:41,141 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,141 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,141 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:49:41,141 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:49:41,141 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_WR}}'}] +2026-07-17 09:49:41,141 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,141 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,141 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:49:41,141 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:49:41,141 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_RD}}'}] +2026-07-17 09:49:41,141 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,141 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,141 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:49:41,141 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:49:41,141 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_WR}}'}] +2026-07-17 09:49:41,142 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,142 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,142 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:49:41,142 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:49:41,142 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:49:41,142 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,142 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,142 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:49:41,142 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:49:41,142 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_RD}}'}] +2026-07-17 09:49:41,142 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,142 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,142 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:49:41,142 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:49:41,142 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_WR}}'}] +2026-07-17 09:49:41,142 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,143 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,143 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:49:41,143 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:49:41,143 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_read_instruction_event}}'}] +2026-07-17 09:49:41,143 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,143 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,143 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_read_instruction_event in VL1 +2026-07-17 09:49:41,143 ERROR utils.pc_base: cannot calculate: can not fine value p_total_read_instruction_event in VL1 +2026-07-17 09:49:41,143 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_write_instruction_event}}'}] +2026-07-17 09:49:41,143 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,143 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,143 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_write_instruction_event in VL1 +2026-07-17 09:49:41,143 ERROR utils.pc_base: cannot calculate: can not fine value p_total_write_instruction_event in VL1 +2026-07-17 09:49:41,144 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:49:41,144 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,144 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,145 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$vl1hit'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$vl1hit'}] +2026-07-17 09:49:41,145 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,146 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:49:41,147 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,148 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,148 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_rd_req}}'}] +2026-07-17 09:49:41,148 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,149 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,149 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_rd_req in L2C +2026-07-17 09:49:41,149 ERROR utils.pc_base: cannot calculate: can not fine value perf_rd_req in L2C +2026-07-17 09:49:41,149 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_wr_req}}'}] +2026-07-17 09:49:41,149 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,149 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,149 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_wr_req in L2C +2026-07-17 09:49:41,149 ERROR utils.pc_base: cannot calculate: can not fine value perf_wr_req in L2C +2026-07-17 09:49:41,149 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:49:41,149 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,150 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,150 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$hit_events'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$hit_events'}, {'type': 'PROC_VAR', 'value': '$hit_events'}] +2026-07-17 09:49:41,151 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,152 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:49:41,153 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,155 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,155 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_on_miss_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_miss_event}}'}] +2026-07-17 09:49:41,155 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,155 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,156 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:49:41,156 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:49:41,156 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_rd}}'}] +2026-07-17 09:49:41,156 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,156 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,156 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_rd +2026-07-17 09:49:41,156 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_rd +2026-07-17 09:49:41,156 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_l2_rd}}'}] +2026-07-17 09:49:41,156 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,156 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,156 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_l2_rd +2026-07-17 09:49:41,156 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_l2_rd +2026-07-17 09:49:41,156 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:49:41,157 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,157 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,157 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:49:41,157 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:49:41,157 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:41,157 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,157 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,157 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,158 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,158 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:41,158 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,159 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,159 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:41,159 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,159 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,159 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,159 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,160 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:49:41,160 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,161 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,162 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:49:41,163 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,164 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,165 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,166 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,168 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:49:41,169 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,171 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,285 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,285 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,285 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@vl1_hit_rate'}] +2026-07-17 09:49:41,285 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,286 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,286 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,286 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@vl1_hit_rate'}] +2026-07-17 09:49:41,286 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,286 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,286 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,286 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@l2c_hit_rate'}] +2026-07-17 09:49:41,286 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,287 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,287 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,287 INFO utils.complier: analyse formula:[{'type': 'PRE_VAR', 'value': '@l2c_hit_rate'}] +2026-07-17 09:49:41,287 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,287 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_32B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_128B}}'}] +2026-07-17 09:49:41,288 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,288 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,288 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,288 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,289 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_32B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_rdreq_128B}}'}] +2026-07-17 09:49:41,289 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,290 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,290 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_low}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_high}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_128B}}'}] +2026-07-17 09:49:41,291 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,291 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,291 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,292 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,292 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_low}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_32B_high}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_64B}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_dnoc_wrreq_128B}}'}] +2026-07-17 09:49:41,293 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,294 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,294 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_RD_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_WR_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_ATOMIC_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_CONFLICT_CYCLES}}'}] +2026-07-17 09:49:41,295 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,295 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,296 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$conflict_cycle'}, {'type': 'PROC_VAR', 'value': '$rate'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$conflict_cycle'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$all_cycle'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$rate'}] +2026-07-17 09:49:41,298 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,300 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_RD_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_WR_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_ATOMIC_CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_BSM_CONFLICT_CYCLES}}'}] +2026-07-17 09:49:41,303 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,305 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,305 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_WAVES}}'}] +2026-07-17 09:49:41,305 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,305 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,306 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,306 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,306 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_WAVES}}'}] +2026-07-17 09:49:41,306 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,307 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,307 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P0}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P1}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P2}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P3}}'}] +2026-07-17 09:49:41,307 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,307 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,307 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,308 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,308 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P0}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P1}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P2}}'}, {'type': 'VARIABLE', 'value': '{{RM.RM_PERF_DISPATCHED_WAVES_P3}}'}] +2026-07-17 09:49:41,309 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,309 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,310 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:41,310 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,310 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,310 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:49:41,310 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,311 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:49:41,311 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,312 INFO utils.complier: analyse formula:[] +2026-07-17 09:49:41,317 INFO phttp.server_backend: complete task 054b0685-1efd-4049-82d2-21af8938b66e +2026-07-17 09:49:42,990 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:49:43,001 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:49:43] "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 - +2026-07-17 09:49:43,002 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=054b0685-1efd-4049-82d2-21af8938b66e HTTP/1.1" 200 1708 +2026-07-17 09:49:51,012 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:49:51,013 ERROR phttp.http_server: remove .pkey failed +2026-07-17 09:49:51,014 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:49:51] "GET /stop HTTP/1.1" 200 - +2026-07-17 09:49:51,014 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /stop HTTP/1.1" 200 29 +2026-07-17 09:56:12,479 DEBUG matplotlib: (private) matplotlib data path: /tmp/_MEI0UzLWv/matplotlib/mpl-data +2026-07-17 09:56:12,480 DEBUG matplotlib: matplotlib data path: /tmp/_MEI0UzLWv/matplotlib/mpl-data +2026-07-17 09:56:12,484 DEBUG matplotlib: CONFIGDIR=/tmp/tmp8418b4cu +2026-07-17 09:56:12,486 DEBUG matplotlib: matplotlib version 3.3.4 +2026-07-17 09:56:12,486 DEBUG matplotlib: interactive is False +2026-07-17 09:56:12,487 DEBUG matplotlib: platform is linux +2026-07-17 09:56:12,487 DEBUG matplotlib: loaded modules: ['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread', '_weakref', '_frozen_importlib_external', '_io', 'marshal', 'posix', 'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.ascii', '_signal', '__main__', 'encodings.utf_8', 'encodings.latin_1', 'io', 'abc', '_weakrefset', '_bootlocale', '_locale', 'struct', '_struct', 'pyimod01_os_path', 'pyimod02_archive', 'zlib', 'pyimod03_importers', 'pyimod04_ctypes', 'os', 'errno', 'stat', '_stat', 'posixpath', 'genericpath', 'os.path', '_collections_abc', 'ctypes', '_ctypes', 'ctypes._endian', 'pkgutil', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'functools', '_functools', 'types', 'collections.abc', 'weakref', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib.util', 'importlib.abc', 'importlib.machinery', 'contextlib', 'inspect', 'ast', '_ast', 'dis', 'opcode', '_opcode', 'enum', 'linecache', 'tokenize', 're', 'sre_compile', '_sre', 'sre_parse', 'sre_constants', 'copyreg', 'token', 'pathlib', 'fnmatch', 'ntpath', 'urllib', 'urllib.parse', 'pkg_resources', 'time', 'zipfile', 'shutil', 'bz2', '_compression', 'threading', 'traceback', '_bz2', 'lzma', '_lzma', 'pwd', 'grp', 'binascii', 'platform', 'subprocess', 'signal', '_posixsubprocess', 'select', 'selectors', 'math', 'plistlib', 'datetime', '_datetime', 'xml', 'xml.parsers', 'xml.parsers.expat', 'pyexpat.errors', 'pyexpat.model', 'pyexpat', 'xml.parsers.expat.model', 'xml.parsers.expat.errors', 'email', 'email.parser', 'email.feedparser', 'email.errors', 'email._policybase', 'email.header', 'email.quoprimime', 'string', '_string', 'email.base64mime', 'base64', 'email.charset', 'email.encoders', 'quopri', 'email.utils', 'random', 'hashlib', '_hashlib', '_blake2', '_sha3', 'bisect', '_bisect', '_random', 'socket', '_socket', 'email._parseaddr', 'calendar', 'locale', 'tempfile', 'textwrap', 'pkg_resources.extern', 'pkg_resources._vendor', 'pkg_resources._vendor.appdirs', 'pkg_resources.extern.appdirs', 'pkg_resources._vendor.packaging', 'pkg_resources._vendor.packaging.__about__', 'pkg_resources.extern.packaging', 'pkg_resources.extern.packaging.version', 'typing', 'typing.io', 'typing.re', 'pkg_resources.extern.packaging._structures', 'pkg_resources.extern.packaging.specifiers', 'pkg_resources.extern.packaging.utils', 'pkg_resources.extern.packaging.tags', 'logging', 'atexit', 'sysconfig', 'pkg_resources._vendor.packaging._manylinux', 'pkg_resources._vendor.packaging._musllinux', 'pkg_resources.extern.packaging.requirements', 'pkg_resources._vendor.pyparsing', 'copy', 'pprint', 'pkg_resources.extern.pyparsing', 'pkg_resources.extern.packaging.markers', 'multiprocessing', 'multiprocessing.context', 'multiprocessing.process', 'multiprocessing.reduction', 'pickle', '_compat_pickle', '_pickle', 'array', '__mp_main__', 'multiprocessing.spawn', 'runpy', 'multiprocessing.util', 'multiprocessing.popen_fork', 'multiprocessing.popen_spawn_posix', 'concurrent', 'concurrent.futures', 'concurrent.futures._base', 'concurrent.futures.process', 'queue', 'multiprocessing.connection', '_multiprocessing', 'concurrent.futures.thread', 'argparse', 'gettext', 'common', 'common.api_common', 'json', 'json.decoder', 'json.scanner', '_json', 'json.encoder', 'paramiko', 'paramiko._version', 'paramiko.transport', 'cryptography', 'cryptography.__about__', 'cryptography.utils', 'cryptography.hazmat', 'cryptography.hazmat.backends', 'cryptography.hazmat.primitives', 'cryptography.hazmat.primitives.ciphers', 'cryptography.hazmat.primitives._cipheralgorithm', 'cryptography.hazmat.primitives.ciphers.base', 'cryptography.exceptions', 'cryptography.hazmat.primitives.ciphers.modes', 'cryptography.hazmat.primitives.ciphers.algorithms', 'paramiko.util', 'paramiko.common', 'paramiko.config', 'getpass', 'termios', 'shlex', 'paramiko.ssh_exception', 'paramiko.auth_handler', 'paramiko.message', 'paramiko.server', 'paramiko.ssh_gss', 'paramiko.channel', 'paramiko.file', 'paramiko.buffered_pipe', 'paramiko.pipe', 'paramiko.compress', 'paramiko.dsskey', 'cryptography.hazmat.primitives.hashes', 'cryptography.hazmat.primitives.serialization', 'cryptography.hazmat.primitives._serialization', 'cryptography.hazmat.primitives.serialization.base', 'cryptography.hazmat.primitives.asymmetric', 'cryptography.hazmat.primitives.asymmetric.dh', 'cryptography.hazmat.primitives.asymmetric.types', 'cryptography.hazmat.primitives.asymmetric.dsa', 'cryptography.hazmat.primitives.asymmetric.utils', 'cryptography.hazmat.bindings', '_cffi_backend', '_openssl.lib', '_openssl', 'cryptography.hazmat.bindings._rust', 'cryptography.hazmat.primitives.asymmetric.ec', 'cryptography.hazmat._oid', 'cryptography.hazmat.primitives.asymmetric.ed448', 'cryptography.hazmat.primitives.asymmetric.ed25519', 'cryptography.hazmat.primitives.asymmetric.rsa', 'cryptography.hazmat.primitives._asymmetric', 'cryptography.hazmat.primitives.asymmetric.x448', 'cryptography.hazmat.primitives.asymmetric.x25519', 'cryptography.hazmat.primitives.serialization.ssh', 'cryptography.hazmat.primitives.asymmetric.padding', 'bcrypt', '__future__', 'hmac', 'bcrypt.__about__', 'bcrypt._bcrypt', 'paramiko.ber', 'paramiko.sftp', 'paramiko.pkey', 'paramiko.ed25519key', 'nacl', 'nacl.signing', 'nacl.bindings', 'nacl.bindings.crypto_aead', 'nacl.exceptions', '_sodium.lib', '_sodium', 'nacl._sodium', 'nacl.bindings.crypto_box', 'nacl.bindings.crypto_core', 'nacl.bindings.crypto_generichash', 'nacl.bindings.crypto_hash', 'nacl.bindings.crypto_kx', 'nacl.bindings.crypto_pwhash', 'nacl.bindings.crypto_scalarmult', 'nacl.bindings.crypto_secretbox', 'nacl.bindings.crypto_secretstream', 'nacl.bindings.crypto_shorthash', 'nacl.bindings.crypto_sign', 'nacl.bindings.randombytes', 'nacl.bindings.sodium_core', 'nacl.bindings.utils', 'nacl.encoding', 'nacl.public', 'nacl.utils', 'paramiko.kex_curve25519', 'cryptography.hazmat.primitives.constant_time', 'paramiko.kex_gex', 'paramiko.kex_group1', 'paramiko.kex_group14', 'paramiko.kex_group16', 'paramiko.kex_ecdh_nist', 'paramiko.kex_gss', 'paramiko.packet', 'paramiko.primes', 'paramiko.rsakey', 'paramiko.ecdsakey', 'paramiko.sftp_client', 'paramiko.sftp_attr', 'paramiko.sftp_file', 'cryptography.hazmat.backends.openssl', 'cryptography.hazmat.backends.openssl.backend', 'cryptography.x509', 'cryptography.x509.certificate_transparency', 'cryptography.x509.base', 'cryptography.x509.extensions', 'ipaddress', 'cryptography.x509.general_name', 'cryptography.x509.name', 'cryptography.x509.oid', 'cryptography.hazmat.backends.openssl.aead', 'cryptography.hazmat.backends.openssl.ciphers', 'cryptography.hazmat.backends.openssl.cmac', 'cryptography.hazmat.backends.openssl.dh', 'cryptography.hazmat.backends.openssl.dsa', 'cryptography.hazmat.backends.openssl.utils', 'cryptography.hazmat.backends.openssl.ec', 'cryptography.hazmat.backends.openssl.ed448', 'cryptography.hazmat.backends.openssl.ed25519', 'cryptography.hazmat.backends.openssl.hashes', 'cryptography.hazmat.backends.openssl.hmac', 'cryptography.hazmat.backends.openssl.poly1305', 'cryptography.hazmat.backends.openssl.rsa', 'cryptography.hazmat.backends.openssl.x448', 'cryptography.hazmat.bindings.openssl', 'cryptography.hazmat.bindings.openssl.binding', 'cryptography.hazmat.bindings.openssl._conditional', 'cryptography.hazmat.primitives.kdf', 'cryptography.hazmat.primitives.kdf.scrypt', 'cryptography.hazmat.primitives.serialization.pkcs12', 'paramiko.client', 'paramiko.agent', 'paramiko.hostkeys', 'paramiko.auth_strategy', 'paramiko.sftp_server', 'paramiko.sftp_si', 'paramiko.sftp_handle', 'paramiko.proxy', 'sshtunnel', 'socketserver', 'utils', 'utils.exceptions', 'utils.logging', 'utils.complier', 'utils.rawdata_elements', 'common.pc_piechart', 'matplotlib', 'distutils', 'distutils.version', 'matplotlib.cbook', 'gzip', 'numpy', 'numpy._globals', 'numpy.__config__', 'numpy.version', 'numpy._distributor_init', 'numpy.core', 'numpy.core.multiarray', 'numpy.core.overrides', 'numpy.core._multiarray_umath', 'numpy.compat', 'numpy.compat._inspect', 'numpy.compat.py3k', 'numpy.core.umath', 'numpy.core.numerictypes', 'numbers', 'numpy.core._string_helpers', 'numpy.core._type_aliases', 'numpy.core._dtype', 'numpy.core.numeric', 'numpy.core.shape_base', 'numpy.core._asarray', 'numpy.core.fromnumeric', 'numpy.core._methods', 'numpy.core._exceptions', 'numpy.core._ufunc_config', 'numpy.core.arrayprint', 'numpy.core.defchararray', 'numpy.core.records', 'numpy.core.memmap', 'numpy.core.function_base', 'numpy.core.machar', 'numpy.core.getlimits', 'numpy.core.einsumfunc', 'numpy.core._add_newdocs', 'numpy.core._multiarray_tests', 'numpy.core._dtype_ctypes', 'numpy.core._internal', 'numpy._pytesttester', 'numpy.lib', 'numpy.lib.mixins', 'numpy.lib.scimath', 'numpy.lib.type_check', 'numpy.lib.ufunclike', 'numpy.lib.index_tricks', 'numpy.matrixlib', 'numpy.matrixlib.defmatrix', 'numpy.linalg', 'numpy.linalg.linalg', 'numpy.lib.twodim_base', 'numpy.linalg.lapack_lite', 'numpy.linalg._umath_linalg', 'numpy.lib.function_base', 'numpy.lib.histograms', 'numpy.lib.stride_tricks', 'numpy.lib.nanfunctions', 'numpy.lib.shape_base', 'numpy.lib.polynomial', 'numpy.lib.utils', 'numpy.lib.arraysetops', 'numpy.lib.npyio', 'numpy.lib.format', 'numpy.lib._datasource', 'numpy.lib._iotools', 'numpy.lib.financial', 'decimal', '_decimal', 'numpy.lib.arrayterator', 'numpy.lib.arraypad', 'numpy.lib._version', 'numpy.fft', 'numpy.fft._pocketfft', 'numpy.fft._pocketfft_internal', 'numpy.fft.helper', 'numpy.polynomial', 'numpy.polynomial.polynomial', 'numpy.polynomial.polyutils', 'numpy.polynomial._polybase', 'numpy.polynomial.chebyshev', 'numpy.polynomial.legendre', 'numpy.polynomial.hermite', 'numpy.polynomial.hermite_e', 'numpy.polynomial.laguerre', 'numpy.random', 'numpy.random._pickle', 'numpy.random.mtrand', 'cython_runtime', 'numpy.random.bit_generator', '_cython_0_29_21', 'numpy.random._common', 'secrets', 'numpy.random._bounded_integers', 'numpy.random._mt19937', 'numpy.random._philox', 'numpy.random._pcg64', 'numpy.random._sfc64', 'numpy.random._generator', 'numpy.ctypeslib', 'numpy.ma', 'numpy.ma.core', 'numpy.ma.extras', 'numpy.testing', 'unittest', 'unittest.result', 'unittest.util', 'unittest.case', 'difflib', 'unittest.suite', 'unittest.loader', 'unittest.main', 'unittest.runner', 'unittest.signals', 'numpy.testing._private', 'numpy.testing._private.utils', 'gc', 'numpy.testing._private.decorators', 'numpy.testing._private.nosetester', 'matplotlib.cbook.deprecation', 'matplotlib.rcsetup', 'matplotlib.animation', 'uuid', 'ctypes.util', 'matplotlib._animation_data', 'matplotlib.fontconfig_pattern', 'pyparsing', 'pyparsing.util', 'pyparsing.exceptions', 'pyparsing.unicode', 'pyparsing.actions', 'pyparsing.core', 'pyparsing.results', 'pyparsing.helpers', 'html', 'html.entities', 'pyparsing.testing', 'pyparsing.common', 'matplotlib.colors', 'matplotlib.docstring', 'matplotlib._color_data', 'cycler', 'matplotlib._version', 'matplotlib.ft2font', 'dateutil', 'dateutil._version', 'kiwisolver'] +2026-07-17 09:56:12,529 DEBUG matplotlib: CACHEDIR=/tmp/tmp8418b4cu +2026-07-17 09:56:12,529 INFO matplotlib.font_manager: Generating new fontManager, this may take some time... +2026-07-17 09:56:12,529 DEBUG matplotlib.font_manager: font search path [PosixPath('/tmp/_MEI0UzLWv/matplotlib/mpl-data/fonts/ttf'), PosixPath('/tmp/_MEI0UzLWv/matplotlib/mpl-data/fonts/afm'), PosixPath('/tmp/_MEI0UzLWv/matplotlib/mpl-data/fonts/pdfcorefonts')] +2026-07-17 09:56:12,903 DEBUG matplotlib.pyplot: Loaded backend agg version unknown. +2026-07-17 09:56:13,922 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:13,922 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/ce_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:56:13,923 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/compute_workload.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:56:13,923 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/gpu_throughput_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:56:13,924 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/instruction_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:56:13,924 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/isu_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:56:13,925 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/memory_statistics.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:56:13,926 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/occupancy.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:56:13,927 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/summary.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:56:13,927 INFO common.api_common: load json file /opt/mcProfiler-ubuntu18.04/config/workgroup_memory.pcd error, so try to decrypt: Expecting value: line 1 column 1 (char 0) +2026-07-17 09:56:13,938 INFO werkzeug: * Running on http://127.0.0.1:50123/ (Press CTRL+C to quit) +2026-07-17 09:56:14,424 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:14,426 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:14] "GET / HTTP/1.1" 200 - +2026-07-17 09:56:14,427 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET / HTTP/1.1" 200 29 +2026-07-17 09:56:14,428 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:14,430 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:14] "GET /show_metrics HTTP/1.1" 200 - +2026-07-17 09:56:14,431 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /show_metrics HTTP/1.1" 200 1976 +2026-07-17 09:56:14,432 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:14,448 INFO phttp.http_server: start a new perf exec thread +2026-07-17 09:56:14,448 INFO phttp.server_backend: start perf_exec +2026-07-17 09:56:14,448 INFO phttp.http_server: new exec 577aafc1-d8d5-4d8f-9372-43de52e48907:('python tests/trace_tilelang_64g_case4.py', 'opt012_case4_duty', ['Total Cycles', 'AP busy Duty', 'ISU stall cycles layout', 'AP MTE Duty ratio', 'AP STE Duty ratio', 'AP MMA Duty ratio', 'VLS Duty ratio', 'L2C Duty ratio']) +2026-07-17 09:56:14,450 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:14] "POST /perf_exec HTTP/1.1" 200 - +2026-07-17 09:56:14,451 INFO common.api_common: ret_code cmdline_str: env +2026-07-17 09:56:14,452 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "POST /perf_exec HTTP/1.1" 200 51 +2026-07-17 09:56:14,462 INFO common.api_common: ret_code cmdline_str: ls /sys/devices/virtual/mxcd/ +2026-07-17 09:56:14,470 INFO common.api_common: ret_code cmdline_str: ls /sys/devices/virtual/mxcd/mxcd/layout/nodes/ +2026-07-17 09:56:14,476 INFO phttp.server_backend: get_device_info.layout nodes: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] +2026-07-17 09:56:14,476 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//0/gpu_id +2026-07-17 09:56:14,482 INFO phttp.server_backend: get_device_info.node 0 gpu_id 0 +2026-07-17 09:56:14,482 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//1/gpu_id +2026-07-17 09:56:14,488 INFO phttp.server_backend: get_device_info.node 1 gpu_id 0 +2026-07-17 09:56:14,488 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//2/gpu_id +2026-07-17 09:56:14,494 INFO phttp.server_backend: get_device_info.node 2 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//2/gpu_id: Operation not permitted +2026-07-17 09:56:14,494 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//3/gpu_id +2026-07-17 09:56:14,500 INFO phttp.server_backend: get_device_info.node 3 gpu_id 51332 +2026-07-17 09:56:14,500 INFO phttp.server_backend: get_device_info.using node id 3 +2026-07-17 09:56:14,500 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//4/gpu_id +2026-07-17 09:56:14,506 INFO phttp.server_backend: get_device_info.node 4 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//4/gpu_id: Operation not permitted +2026-07-17 09:56:14,506 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//5/gpu_id +2026-07-17 09:56:14,512 INFO phttp.server_backend: get_device_info.node 5 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//5/gpu_id: Operation not permitted +2026-07-17 09:56:14,512 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//6/gpu_id +2026-07-17 09:56:14,517 INFO phttp.server_backend: get_device_info.node 6 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//6/gpu_id: Operation not permitted +2026-07-17 09:56:14,518 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//7/gpu_id +2026-07-17 09:56:14,523 INFO phttp.server_backend: get_device_info.node 7 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//7/gpu_id: Operation not permitted +2026-07-17 09:56:14,523 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//8/gpu_id +2026-07-17 09:56:14,529 INFO phttp.server_backend: get_device_info.node 8 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//8/gpu_id: Operation not permitted +2026-07-17 09:56:14,529 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//9/gpu_id +2026-07-17 09:56:14,535 INFO phttp.server_backend: get_device_info.node 9 gpu_id cat: /sys/devices/virtual/mxcd/mxcd/layout/nodes//9/gpu_id: Operation not permitted +2026-07-17 09:56:14,535 INFO common.api_common: ret_code cmdline_str: cat /sys/devices/virtual/mxcd/mxcd/layout/nodes//3/properties +2026-07-17 09:56:14,541 ERROR phttp.server_backend: get_device_info.parse 3 device info vbios_version 1.33.5.0 error. +2026-07-17 09:56:14,541 INFO phttp.server_backend: get_device_info.device_info: {'3': {'gpu_id': '51332', 'cpu_cores_count': 0, 'mem_banks_count': 1, 'direct_link_count': 4, 'indirect_link_count': 8, 'vendor_id': 39321, 'device_id': 16385, 'drm_render_minor': 129, 'isa_major': 10, 'isa_minor': 0, 'is_vf': 0, 'max_vf_nums': 8, 'domain': 0, 'location_id': 3840, 'num_sdma_engines': 5, 'num_sdma_queues_per_engine': 9, 'num_vpue_cores': 1, 'num_vpud_cores': 8, 'caches_count': 157, 'peu_id_base': 0, 'peu_count': 416, 'max_waves_per_peu': 8, 'wsm_size_in_kb': 64, 'wave_front_size': 64, 'dpc_count': 8, 'dpc0_ap_mask': 8191, 'dpc1_ap_mask': 73727, 'dpc2_ap_mask': 139263, 'dpc3_ap_mask': 204799, 'dpc4_ap_mask': 270335, 'dpc5_ap_mask': 335871, 'dpc6_ap_mask': 401407, 'dpc7_ap_mask': 466943, 'dpc_arrays': 1, 'ap_per_dpc': 13, 'peu_per_ap': 4, 'pri_mem_per_thread': 4, 'max_slots_private_ap': 32, 'num_ce_queues': 16, 'max_engine_clk_gpu': 1600, 'max_engine_clk_cpu': 3600, 'mgpu_id': 0, 'topology_id': 2, 'socket_id': 3, 'hbmecc': 1, 'local_mem_size': 68719476736, 'capability': 4432512, 'maxprocess': 10}} +2026-07-17 09:56:14,541 INFO phttp.server_backend: start generate batch files +2026-07-17 09:56:14,542 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:56:14,542 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,542 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,543 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:56:14,543 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,543 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,544 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:56:14,545 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,546 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,547 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP16}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP32}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_MTE_PI_SEG_SEL_F64}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:56:14,547 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,548 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,548 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:56:14,548 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,548 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,548 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:56:14,548 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,548 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,549 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VLS.PERFEVENT_VLS_ACTIVE}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:56:14,549 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,549 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,549 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_req}}'}, {'type': 'VARIABLE', 'value': '{{L2C.1_b1}}'}] +2026-07-17 09:56:14,549 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,549 INFO utils.complier: analyse formula:[] +2026-07-17 09:56:14,549 INFO common.api_common: f_var:CE.CE_PERF_BUSY_CYCLES +2026-07-17 09:56:14,549 INFO common.api_common: f_var:ISU.AP_PERF_ISU_ARB_VALU_STALL +2026-07-17 09:56:14,549 INFO common.api_common: f_var:ISU.AP_PERF_INST_TRANS_FP16 +2026-07-17 09:56:14,549 INFO common.api_common: f_var:ISU.AP_PERF_ISU_ARB_WSM_STALL +2026-07-17 09:56:14,549 INFO common.api_common: f_var:ISU.AP_PERF_INSTS_SALU +2026-07-17 09:56:14,549 INFO common.api_common: f_var:ISU.AP_PERF_INST_TRANS_FP32 +2026-07-17 09:56:14,549 INFO common.api_common: f_var:ISU.AP_PERF_ISU_ARB_DATA_STALL +2026-07-17 09:56:14,549 INFO common.api_common: f_var:VLS.PERFEVENT_VLS_ACTIVE +2026-07-17 09:56:14,549 INFO common.api_common: f_var:L2C.1_b1 +2026-07-17 09:56:14,549 INFO common.api_common: f_var:ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES +2026-07-17 09:56:14,549 INFO common.api_common: f_var:ISU.AP_PERF_ISU_AP_BUSY +2026-07-17 09:56:14,550 INFO common.api_common: f_var:ISU.AP_PERF_MTE_PI_SEG_SEL_F64 +2026-07-17 09:56:14,550 INFO common.api_common: f_var:ISU.AP_PERF_ISU_ARB_VLS_STALL +2026-07-17 09:56:14,550 INFO common.api_common: f_var:ISU.AP_PERF_INST_CYCLES_MMA +2026-07-17 09:56:14,550 INFO common.api_common: f_var:L2C.perf_req +2026-07-17 09:56:14,551 INFO tools.events_generator.batches_generator: output path is: /opt/mcProfiler-ubuntu18.04/output20260717095614 +2026-07-17 09:56:14,551 INFO tools.events_generator.batches_generator: generate event_batch_0.json successfully! +2026-07-17 09:56:14,552 INFO phttp.server_backend: generate batch files done +2026-07-17 09:56:14,552 INFO common.api_common: ret_code cmdline_str: rm -f /root/mcRpcPort.ini +2026-07-17 09:56:14,558 INFO common.api_common: ret_code cmdline_str: cp /opt/mcProfiler-ubuntu18.04/output20260717095614/event_batch_0.json /opt/mcProfiler-ubuntu18.04/output20260717095614/mcProfiler.json +2026-07-17 09:56:14,564 INFO common.api_common: ret_code cmdline_str: cd /data/operator_task_package/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill; export MCTX_TARGET_INIT=true; export MACA_ETC_PATH=/opt/mcProfiler-ubuntu18.04/output20260717095614; export MACA_LAUNCH_BLOCKING=1; export MXLOG_LEVEL=info; python tests/trace_tilelang_64g_case4.py +2026-07-17 09:56:14,564 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:14,574 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:14,974 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:14,982 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:15,483 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:15,490 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:16,091 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:16,097 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:16,798 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:16,804 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:17,605 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:17,611 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:18,512 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:18,518 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:19,465 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:19,470 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:19] "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 - +2026-07-17 09:56:19,470 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 695 +2026-07-17 09:56:19,519 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:19,525 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:20,526 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:20,532 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:21,533 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:21,539 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:22,540 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:22,546 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:23,548 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:23,553 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:24,478 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:24,485 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:24] "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 - +2026-07-17 09:56:24,487 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 695 +2026-07-17 09:56:24,555 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:24,561 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:25,562 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:25,568 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:26,569 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:26,575 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:27,576 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:27,585 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:28,586 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:28,593 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:29,497 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:29,504 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:29] "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 - +2026-07-17 09:56:29,504 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 1628 +2026-07-17 09:56:29,594 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:29,600 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:30,601 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:30,607 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:31,609 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:31,614 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:32,616 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:32,622 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:33,623 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:33,629 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:34,512 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:34,524 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:34] "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 - +2026-07-17 09:56:34,524 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 1628 +2026-07-17 09:56:34,630 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:34,636 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:35,637 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:35,643 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:36,644 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:36,650 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:37,651 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:37,657 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:38,658 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:38,664 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:39,532 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:39,538 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:39] "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 - +2026-07-17 09:56:39,538 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 1628 +2026-07-17 09:56:39,665 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:39,671 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:40,673 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:40,679 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:41,680 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:41,686 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:42,687 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:43,704 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:43,704 INFO prpc_client.mctool_client: MctxStreamProfilerCountDataGet Start +2026-07-17 09:56:43,708 INFO prpc_client.mctool_client: MctxStreamProfilerCountDataGet Loop +2026-07-17 09:56:44,543 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:44,547 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:44] "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 - +2026-07-17 09:56:44,548 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 1628 +2026-07-17 09:56:44,711 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:45,721 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:46,729 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:47,736 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:48,744 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:49,556 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:49,562 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:49] "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 - +2026-07-17 09:56:49,562 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 1628 +2026-07-17 09:56:49,585 INFO prpc_client.mctool_client: MctxStreamProfilerCountDataGet Loop +2026-07-17 09:56:49,751 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:49,785 INFO prpc_client.mctool_client: MctxStreamProfilerCountDataGet Loop +2026-07-17 09:56:50,758 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:51,171 INFO prpc_client.mctool_client: MctxStreamProfilerCountDataGet Loop +2026-07-17 09:56:51,765 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:52,773 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:52,779 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:53,781 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:53,787 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:54,570 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:54,575 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:54] "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 - +2026-07-17 09:56:54,575 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 1628 +2026-07-17 09:56:54,788 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:54,794 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:55,795 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:55,802 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:56,803 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:56,809 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:57,810 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:57,817 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:58,818 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:58,824 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:56:59,584 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:56:59,589 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:56:59] "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 - +2026-07-17 09:56:59,590 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 1628 +2026-07-17 09:56:59,825 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:56:59,832 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:57:00,833 INFO common.api_common: ret_code cmdline_str: cat /root/mcRpcPort.ini +2026-07-17 09:57:00,839 WARNING phttp.server_backend: get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +2026-07-17 09:57:01,842 INFO phttp.server_backend: profiling task 577aafc1-d8d5-4d8f-9372-43de52e48907 +2026-07-17 09:57:01,842 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:57:01,842 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,843 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,843 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:57:01,843 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:57:01,843 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:57:01,843 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,843 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,843 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:01,843 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:01,843 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,843 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:57:01,843 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,843 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:57:01,844 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:57:01,844 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:01,844 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:57:01,844 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,844 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:57:01,844 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:57:01,844 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_RD}}'}] +2026-07-17 09:57:01,844 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,844 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,844 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:57:01,844 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:57:01,844 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_WR}}'}] +2026-07-17 09:57:01,844 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,844 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,844 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:57:01,844 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:57:01,845 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_RD}}'}] +2026-07-17 09:57:01,845 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,845 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,845 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:57:01,845 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:57:01,845 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_WR}}'}] +2026-07-17 09:57:01,845 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,845 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,845 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:57:01,845 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:57:01,845 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_RD}}'}] +2026-07-17 09:57:01,845 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,845 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,845 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:57:01,845 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:57:01,846 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_WR}}'}] +2026-07-17 09:57:01,846 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,846 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,846 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:57:01,846 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:57:01,846 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:57:01,846 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,846 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,846 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:01,846 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:01,846 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_RD}}'}] +2026-07-17 09:57:01,846 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,846 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,846 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:57:01,846 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:57:01,846 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_WR}}'}] +2026-07-17 09:57:01,846 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,847 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,847 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:57:01,847 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:57:01,847 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_read_instruction_event}}'}] +2026-07-17 09:57:01,847 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,847 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,847 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_read_instruction_event +2026-07-17 09:57:01,847 ERROR utils.pc_base: cannot calculate: can not fine value p_total_read_instruction_event +2026-07-17 09:57:01,847 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_write_instruction_event}}'}] +2026-07-17 09:57:01,847 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,847 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,847 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_write_instruction_event +2026-07-17 09:57:01,847 ERROR utils.pc_base: cannot calculate: can not fine value p_total_write_instruction_event +2026-07-17 09:57:01,848 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:57:01,848 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,848 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,848 ERROR utils.pc_base: get_varvalues failed: can not fine value p_perf_miss_cnt +2026-07-17 09:57:01,848 ERROR utils.pc_base: cannot calculate: can not fine value p_perf_miss_cnt +2026-07-17 09:57:01,848 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_rd_req}}'}] +2026-07-17 09:57:01,848 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,849 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,849 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_rd_req in L2C +2026-07-17 09:57:01,849 ERROR utils.pc_base: cannot calculate: can not fine value perf_rd_req in L2C +2026-07-17 09:57:01,849 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_wr_req}}'}] +2026-07-17 09:57:01,849 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,849 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,849 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_wr_req in L2C +2026-07-17 09:57:01,849 ERROR utils.pc_base: cannot calculate: can not fine value perf_wr_req in L2C +2026-07-17 09:57:01,849 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:57:01,849 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,850 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,850 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_miss in L2C +2026-07-17 09:57:01,850 ERROR utils.pc_base: cannot calculate: can not fine value perf_miss in L2C +2026-07-17 09:57:01,850 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_on_miss_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_miss_event}}'}] +2026-07-17 09:57:01,850 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,851 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,851 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:57:01,851 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:57:01,851 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_rd}}'}] +2026-07-17 09:57:01,851 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,851 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,851 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_rd +2026-07-17 09:57:01,851 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_rd +2026-07-17 09:57:01,851 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_l2_rd}}'}] +2026-07-17 09:57:01,851 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,851 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,851 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_l2_rd +2026-07-17 09:57:01,851 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_l2_rd +2026-07-17 09:57:01,851 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:57:01,852 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,852 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,852 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_MISC in ISU +2026-07-17 09:57:01,852 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_MISC in ISU +2026-07-17 09:57:01,852 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:01,852 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,852 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,853 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:01,853 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,853 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:01,853 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,854 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,854 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:01,854 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,854 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,854 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:01,855 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,855 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:01,855 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,856 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,857 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:57:01,858 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,859 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,860 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:01,862 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,863 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:57:01,864 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,866 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:01,896 DEBUG matplotlib.font_manager: findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=12.0. +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 0.05 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 1.05 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 1.335 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:57:01,897 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 0.33499999999999996 +2026-07-17 09:57:01,898 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,899 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,899 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,899 DEBUG matplotlib.font_manager: findfont: score() = 0.33499999999999996 +2026-07-17 09:57:01,899 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,899 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,899 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,899 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:57:01,899 DEBUG matplotlib.font_manager: findfont: score() = 0.05 +2026-07-17 09:57:01,899 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:57:01,899 DEBUG matplotlib.font_manager: findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=12.0 to DejaVu Sans ('/tmp/_MEI0UzLWv/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf') with score of 0.050000. +2026-07-17 09:57:01,903 DEBUG matplotlib.font_manager: findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0. +2026-07-17 09:57:01,903 DEBUG matplotlib.font_manager: findfont: score() = 0.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 1.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 1.335 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,904 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 0.33499999999999996 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 0.33499999999999996 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.05 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,905 DEBUG matplotlib.font_manager: findfont: score() = 10.335 +2026-07-17 09:57:01,906 DEBUG matplotlib.font_manager: findfont: score() = 11.05 +2026-07-17 09:57:01,906 DEBUG matplotlib.font_manager: findfont: score() = 0.05 +2026-07-17 09:57:01,906 DEBUG matplotlib.font_manager: findfont: score() = 11.335 +2026-07-17 09:57:01,906 DEBUG matplotlib.font_manager: findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to DejaVu Sans ('/tmp/_MEI0UzLWv/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf') with score of 0.050000. +2026-07-17 09:57:02,003 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP16}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP32}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_MTE_PI_SEG_SEL_F64}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,004 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,005 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,005 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$ap_trans_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real_16'}, {'type': 'PROC_VAR', 'value': '$ap_trans_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real_16'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real'}] +2026-07-17 09:57:02,008 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,011 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP16}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP32}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_MTE_PI_SEG_SEL_F64}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,014 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,018 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,018 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,018 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,018 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,019 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,019 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,019 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,019 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,020 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,020 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,020 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,020 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,021 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,021 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,021 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,022 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,022 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,022 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VLS.PERFEVENT_VLS_ACTIVE}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,022 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,022 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,023 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,023 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,023 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VLS.PERFEVENT_VLS_ACTIVE}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,024 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,024 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,024 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_req}}'}, {'type': 'VARIABLE', 'value': '{{L2C.1_b1}}'}] +2026-07-17 09:57:02,024 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,024 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,025 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,025 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,025 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_req}}'}, {'type': 'VARIABLE', 'value': '{{L2C.1_b1}}'}] +2026-07-17 09:57:02,025 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,026 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,026 INFO common.report_asm: report infomation: ############################## +Sub-module: Summary +------------------------------ +Name: Total Cycles +Description: cycles use by kernel +Value: 10,608,946.19(Kcycles) +------------------------------ +Name: AP busy Duty +Description: average AP busy duty of total cycles +Value: 15.14% +############################## +Sub-module: ISU Statistics +------------------------------ +Name: ISU stall cycles layout +Description: ISU stall cycles layout +Value: { + "data": { + "wsm_stall": 38700923661.67748, + "vls_pipeline_stall": 4588363494.652634, + "vls_wdata_stall": 72671888.53685898, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717095614/ISU_stall_cycles_layout20260717095701860.png" +} +############################## +Sub-module: GPU Throughput Statistics +------------------------------ +Name: AP MTE Duty ratio +Description: MTE Duty ratio relative to AP active +Value: 38.53% +------------------------------ +Name: AP STE Duty ratio +Description: STE Duty ratio relative to AP active +Value: 1.13% +------------------------------ +Name: AP MMA Duty ratio +Description: MMA Duty ratio relative to AP active +Value: 20.09% +------------------------------ +Name: VLS Duty ratio +Description: VLS Duty ratio relative to AP active +Value: 0.0% +------------------------------ +Name: L2C Duty ratio +Description: L2C Duty ratio relative to L2C active +Value: 1.28% +2026-07-17 09:57:02,033 DEBUG PIL.PngImagePlugin: STREAM b'IHDR' 16 13 +2026-07-17 09:57:02,033 DEBUG PIL.PngImagePlugin: STREAM b'tEXt' 41 57 +2026-07-17 09:57:02,033 DEBUG PIL.PngImagePlugin: STREAM b'pHYs' 110 9 +2026-07-17 09:57:02,033 DEBUG PIL.PngImagePlugin: STREAM b'IDAT' 131 40638 +2026-07-17 09:57:02,170 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:57:02,170 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,170 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,171 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:57:02,171 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:57:02,171 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:57:02,171 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,171 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,171 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,171 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,171 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,171 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:57:02,171 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,171 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:57:02,171 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:57:02,171 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,172 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:57:02,172 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,172 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:57:02,172 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:57:02,172 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_RD}}'}] +2026-07-17 09:57:02,172 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,172 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,172 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:57:02,172 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:57:02,172 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_WR}}'}] +2026-07-17 09:57:02,172 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,172 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,172 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:57:02,172 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:57:02,172 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_RD}}'}] +2026-07-17 09:57:02,172 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,173 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,173 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:57:02,173 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:57:02,173 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_WR}}'}] +2026-07-17 09:57:02,173 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,173 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,173 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:57:02,173 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:57:02,173 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_RD}}'}] +2026-07-17 09:57:02,173 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,173 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,173 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:57:02,173 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:57:02,173 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_WR}}'}] +2026-07-17 09:57:02,173 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,173 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,173 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:57:02,174 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:57:02,174 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:57:02,174 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,174 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,174 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,174 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,174 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_RD}}'}] +2026-07-17 09:57:02,174 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,174 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,174 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:57:02,174 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:57:02,174 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_WR}}'}] +2026-07-17 09:57:02,174 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,174 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,174 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:57:02,174 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:57:02,174 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_read_instruction_event}}'}] +2026-07-17 09:57:02,175 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,175 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,175 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_read_instruction_event +2026-07-17 09:57:02,175 ERROR utils.pc_base: cannot calculate: can not fine value p_total_read_instruction_event +2026-07-17 09:57:02,175 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_write_instruction_event}}'}] +2026-07-17 09:57:02,175 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,175 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,175 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_write_instruction_event +2026-07-17 09:57:02,175 ERROR utils.pc_base: cannot calculate: can not fine value p_total_write_instruction_event +2026-07-17 09:57:02,175 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:57:02,176 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,176 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,176 ERROR utils.pc_base: get_varvalues failed: can not fine value p_perf_miss_cnt +2026-07-17 09:57:02,176 ERROR utils.pc_base: cannot calculate: can not fine value p_perf_miss_cnt +2026-07-17 09:57:02,176 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_rd_req}}'}] +2026-07-17 09:57:02,176 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,176 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,176 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_rd_req in L2C +2026-07-17 09:57:02,176 ERROR utils.pc_base: cannot calculate: can not fine value perf_rd_req in L2C +2026-07-17 09:57:02,176 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_wr_req}}'}] +2026-07-17 09:57:02,177 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,177 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,177 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_wr_req in L2C +2026-07-17 09:57:02,177 ERROR utils.pc_base: cannot calculate: can not fine value perf_wr_req in L2C +2026-07-17 09:57:02,177 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:57:02,177 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,177 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,177 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_miss in L2C +2026-07-17 09:57:02,177 ERROR utils.pc_base: cannot calculate: can not fine value perf_miss in L2C +2026-07-17 09:57:02,178 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_on_miss_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_miss_event}}'}] +2026-07-17 09:57:02,178 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,178 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,178 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:57:02,178 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:57:02,179 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_rd}}'}] +2026-07-17 09:57:02,179 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,179 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,179 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_rd +2026-07-17 09:57:02,179 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_rd +2026-07-17 09:57:02,179 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_l2_rd}}'}] +2026-07-17 09:57:02,179 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,179 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,179 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_l2_rd +2026-07-17 09:57:02,179 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_l2_rd +2026-07-17 09:57:02,179 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:57:02,180 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,180 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,180 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_MISC in ISU +2026-07-17 09:57:02,180 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_MISC in ISU +2026-07-17 09:57:02,180 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,180 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,180 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,180 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,181 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,181 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,181 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,181 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,182 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,182 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,182 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,182 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,182 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,183 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,183 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,183 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,185 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:57:02,186 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,187 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,188 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,189 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,191 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:57:02,193 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,194 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,312 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP16}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP32}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_MTE_PI_SEG_SEL_F64}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,312 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,313 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,313 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$ap_trans_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real_16'}, {'type': 'PROC_VAR', 'value': '$ap_trans_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real_16'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real'}] +2026-07-17 09:57:02,316 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,319 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP16}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP32}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_MTE_PI_SEG_SEL_F64}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,323 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,326 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,326 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,327 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,327 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,327 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,327 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,327 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,328 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,328 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,328 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,329 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,329 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,329 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,329 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,329 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,330 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,330 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,331 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VLS.PERFEVENT_VLS_ACTIVE}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,331 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,331 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,331 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,331 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,332 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VLS.PERFEVENT_VLS_ACTIVE}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,332 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,332 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,333 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_req}}'}, {'type': 'VARIABLE', 'value': '{{L2C.1_b1}}'}] +2026-07-17 09:57:02,333 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,333 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,333 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,333 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,334 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_req}}'}, {'type': 'VARIABLE', 'value': '{{L2C.1_b1}}'}] +2026-07-17 09:57:02,334 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,334 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,335 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:57:02,336 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,336 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,336 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:57:02,336 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:57:02,336 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:57:02,336 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,336 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,336 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,336 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,336 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,336 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:57:02,337 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,337 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:57:02,337 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:57:02,337 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,337 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:57:02,337 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,337 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:57:02,337 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:57:02,337 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_RD}}'}] +2026-07-17 09:57:02,337 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,337 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,337 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:57:02,337 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:57:02,337 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_WR}}'}] +2026-07-17 09:57:02,337 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,338 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,338 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:57:02,338 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:57:02,338 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_RD}}'}] +2026-07-17 09:57:02,338 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,338 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,338 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:57:02,338 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:57:02,338 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_WR}}'}] +2026-07-17 09:57:02,338 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,338 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,338 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:57:02,338 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:57:02,338 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_RD}}'}] +2026-07-17 09:57:02,338 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,338 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,338 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:57:02,338 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:57:02,339 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_WR}}'}] +2026-07-17 09:57:02,339 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,339 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,339 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:57:02,339 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:57:02,339 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:57:02,339 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,339 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,339 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,339 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,339 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_RD}}'}] +2026-07-17 09:57:02,339 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,339 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,339 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:57:02,339 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:57:02,339 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_WR}}'}] +2026-07-17 09:57:02,340 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,340 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,340 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:57:02,340 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:57:02,340 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_read_instruction_event}}'}] +2026-07-17 09:57:02,340 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,340 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,340 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_read_instruction_event +2026-07-17 09:57:02,340 ERROR utils.pc_base: cannot calculate: can not fine value p_total_read_instruction_event +2026-07-17 09:57:02,340 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_write_instruction_event}}'}] +2026-07-17 09:57:02,340 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,340 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,340 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_write_instruction_event +2026-07-17 09:57:02,340 ERROR utils.pc_base: cannot calculate: can not fine value p_total_write_instruction_event +2026-07-17 09:57:02,341 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:57:02,341 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,341 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,341 ERROR utils.pc_base: get_varvalues failed: can not fine value p_perf_miss_cnt +2026-07-17 09:57:02,341 ERROR utils.pc_base: cannot calculate: can not fine value p_perf_miss_cnt +2026-07-17 09:57:02,341 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_rd_req}}'}] +2026-07-17 09:57:02,342 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,342 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,342 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_rd_req in L2C +2026-07-17 09:57:02,342 ERROR utils.pc_base: cannot calculate: can not fine value perf_rd_req in L2C +2026-07-17 09:57:02,342 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_wr_req}}'}] +2026-07-17 09:57:02,342 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,342 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,342 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_wr_req in L2C +2026-07-17 09:57:02,342 ERROR utils.pc_base: cannot calculate: can not fine value perf_wr_req in L2C +2026-07-17 09:57:02,342 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:57:02,342 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,343 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,343 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_miss in L2C +2026-07-17 09:57:02,343 ERROR utils.pc_base: cannot calculate: can not fine value perf_miss in L2C +2026-07-17 09:57:02,343 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_on_miss_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_miss_event}}'}] +2026-07-17 09:57:02,343 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,344 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,344 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:57:02,344 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:57:02,344 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_rd}}'}] +2026-07-17 09:57:02,344 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,344 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,344 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_rd +2026-07-17 09:57:02,344 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_rd +2026-07-17 09:57:02,344 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_l2_rd}}'}] +2026-07-17 09:57:02,344 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,344 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,344 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_l2_rd +2026-07-17 09:57:02,344 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_l2_rd +2026-07-17 09:57:02,345 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:57:02,345 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,345 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,345 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_MISC in ISU +2026-07-17 09:57:02,345 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_MISC in ISU +2026-07-17 09:57:02,345 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,345 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,346 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,346 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,346 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,346 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,346 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,347 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,347 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,347 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,347 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,347 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,348 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,348 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,348 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,349 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,350 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:57:02,351 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,352 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,353 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,354 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,356 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:57:02,357 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,359 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,474 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP16}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP32}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_MTE_PI_SEG_SEL_F64}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,475 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,475 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,476 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$ap_trans_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real_16'}, {'type': 'PROC_VAR', 'value': '$ap_trans_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real_16'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real'}] +2026-07-17 09:57:02,479 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,482 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP16}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP32}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_MTE_PI_SEG_SEL_F64}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,485 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,489 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,489 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,489 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,489 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,489 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,490 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,490 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,490 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,491 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,491 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,491 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,491 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,491 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,492 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,492 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,492 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,493 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,493 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VLS.PERFEVENT_VLS_ACTIVE}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,493 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,493 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,494 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,494 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,494 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VLS.PERFEVENT_VLS_ACTIVE}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,494 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,495 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,495 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_req}}'}, {'type': 'VARIABLE', 'value': '{{L2C.1_b1}}'}] +2026-07-17 09:57:02,495 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,495 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,495 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,496 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,496 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_req}}'}, {'type': 'VARIABLE', 'value': '{{L2C.1_b1}}'}] +2026-07-17 09:57:02,496 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,497 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,502 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:57:02,503 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,503 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,503 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:57:02,503 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:57:02,503 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:57:02,503 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,503 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,503 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,503 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,503 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,503 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:57:02,504 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,504 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:57:02,504 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:57:02,504 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,504 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:57:02,504 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,504 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:57:02,504 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:57:02,504 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_RD}}'}] +2026-07-17 09:57:02,504 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,504 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,504 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:57:02,504 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:57:02,504 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_WR}}'}] +2026-07-17 09:57:02,504 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,505 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,505 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:57:02,505 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:57:02,505 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_RD}}'}] +2026-07-17 09:57:02,505 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,505 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,505 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:57:02,505 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:57:02,505 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_WR}}'}] +2026-07-17 09:57:02,505 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,505 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,505 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:57:02,505 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:57:02,505 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_RD}}'}] +2026-07-17 09:57:02,505 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,505 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,505 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:57:02,505 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:57:02,506 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_WR}}'}] +2026-07-17 09:57:02,506 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,506 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,506 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:57:02,506 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:57:02,506 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:57:02,506 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,506 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,506 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,506 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,506 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_RD}}'}] +2026-07-17 09:57:02,506 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,506 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,506 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:57:02,506 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:57:02,506 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_WR}}'}] +2026-07-17 09:57:02,507 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,507 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,507 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:57:02,507 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:57:02,507 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_read_instruction_event}}'}] +2026-07-17 09:57:02,507 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,507 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,507 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_read_instruction_event +2026-07-17 09:57:02,507 ERROR utils.pc_base: cannot calculate: can not fine value p_total_read_instruction_event +2026-07-17 09:57:02,507 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_write_instruction_event}}'}] +2026-07-17 09:57:02,507 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,507 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,507 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_write_instruction_event +2026-07-17 09:57:02,507 ERROR utils.pc_base: cannot calculate: can not fine value p_total_write_instruction_event +2026-07-17 09:57:02,508 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:57:02,508 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,508 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,508 ERROR utils.pc_base: get_varvalues failed: can not fine value p_perf_miss_cnt +2026-07-17 09:57:02,508 ERROR utils.pc_base: cannot calculate: can not fine value p_perf_miss_cnt +2026-07-17 09:57:02,508 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_rd_req}}'}] +2026-07-17 09:57:02,508 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,509 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,509 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_rd_req in L2C +2026-07-17 09:57:02,509 ERROR utils.pc_base: cannot calculate: can not fine value perf_rd_req in L2C +2026-07-17 09:57:02,509 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_wr_req}}'}] +2026-07-17 09:57:02,509 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,509 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,509 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_wr_req in L2C +2026-07-17 09:57:02,509 ERROR utils.pc_base: cannot calculate: can not fine value perf_wr_req in L2C +2026-07-17 09:57:02,509 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:57:02,509 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,510 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,510 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_miss in L2C +2026-07-17 09:57:02,510 ERROR utils.pc_base: cannot calculate: can not fine value perf_miss in L2C +2026-07-17 09:57:02,510 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_on_miss_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_miss_event}}'}] +2026-07-17 09:57:02,510 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,510 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,510 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:57:02,511 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:57:02,511 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_rd}}'}] +2026-07-17 09:57:02,511 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,511 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,511 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_rd +2026-07-17 09:57:02,511 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_rd +2026-07-17 09:57:02,511 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_l2_rd}}'}] +2026-07-17 09:57:02,511 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,511 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,511 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_l2_rd +2026-07-17 09:57:02,511 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_l2_rd +2026-07-17 09:57:02,511 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:57:02,512 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,512 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,512 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_MISC in ISU +2026-07-17 09:57:02,512 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_MISC in ISU +2026-07-17 09:57:02,512 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,512 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,512 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,512 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,513 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,513 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,513 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,513 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,514 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,514 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,514 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,514 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,514 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,515 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,515 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,515 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,517 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:57:02,518 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,519 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,520 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,521 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,522 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:57:02,524 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,526 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,645 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP16}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP32}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_MTE_PI_SEG_SEL_F64}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,646 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,646 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,647 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$ap_trans_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real_16'}, {'type': 'PROC_VAR', 'value': '$ap_trans_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real_16'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real'}] +2026-07-17 09:57:02,650 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,653 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP16}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP32}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_MTE_PI_SEG_SEL_F64}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,657 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,660 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,660 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,661 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,661 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,661 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,661 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,661 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,662 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,662 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,663 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,663 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,663 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,663 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,663 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,664 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,664 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,664 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,665 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VLS.PERFEVENT_VLS_ACTIVE}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,665 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,665 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,665 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,665 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,666 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VLS.PERFEVENT_VLS_ACTIVE}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,666 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,666 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,667 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_req}}'}, {'type': 'VARIABLE', 'value': '{{L2C.1_b1}}'}] +2026-07-17 09:57:02,667 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,667 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,667 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,667 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,668 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_req}}'}, {'type': 'VARIABLE', 'value': '{{L2C.1_b1}}'}] +2026-07-17 09:57:02,668 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,668 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,669 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:57:02,670 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,670 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,670 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:57:02,670 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_MMA in ISU +2026-07-17 09:57:02,670 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:57:02,670 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,670 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,670 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,670 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,670 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,671 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:57:02,671 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,671 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:57:02,671 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:57:02,671 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,671 INFO utils.complier: analyse formula:[{'type': 'UMD_VARIABLE', 'value': '{TRACER.dur}'}] +2026-07-17 09:57:02,671 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,671 ERROR utils.pc_base: get_varvalues failed: 'TRACER' +2026-07-17 09:57:02,671 ERROR utils.pc_base: cannot calculate: 'TRACER' +2026-07-17 09:57:02,671 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_RD}}'}] +2026-07-17 09:57:02,671 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,671 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,671 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:57:02,671 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_RD in ISU +2026-07-17 09:57:02,671 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GLOBAL_WR}}'}] +2026-07-17 09:57:02,672 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,672 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,672 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:57:02,672 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GLOBAL_WR in ISU +2026-07-17 09:57:02,672 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_RD}}'}] +2026-07-17 09:57:02,672 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,672 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,672 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:57:02,672 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_RD in ISU +2026-07-17 09:57:02,672 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_PRIVATE_WR}}'}] +2026-07-17 09:57:02,672 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,672 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,672 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:57:02,672 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_PRIVATE_WR in ISU +2026-07-17 09:57:02,672 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_RD}}'}] +2026-07-17 09:57:02,672 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,672 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,673 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:57:02,673 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_RD in ISU +2026-07-17 09:57:02,673 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_GENERIC_WR}}'}] +2026-07-17 09:57:02,673 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,673 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,673 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:57:02,673 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_GENERIC_WR in ISU +2026-07-17 09:57:02,673 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}] +2026-07-17 09:57:02,673 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,673 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,673 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,673 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INSTS_LDU in ISU +2026-07-17 09:57:02,673 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_RD}}'}] +2026-07-17 09:57:02,673 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,673 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,673 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:57:02,673 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_RD in ISU +2026-07-17 09:57:02,674 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_BSM_WR}}'}] +2026-07-17 09:57:02,674 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,674 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,674 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:57:02,674 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_BSM_WR in ISU +2026-07-17 09:57:02,674 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_read_instruction_event}}'}] +2026-07-17 09:57:02,674 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,674 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,674 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_read_instruction_event +2026-07-17 09:57:02,674 ERROR utils.pc_base: cannot calculate: can not fine value p_total_read_instruction_event +2026-07-17 09:57:02,674 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_total_write_instruction_event}}'}] +2026-07-17 09:57:02,674 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,674 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,674 ERROR utils.pc_base: get_varvalues failed: can not fine value p_total_write_instruction_event +2026-07-17 09:57:02,674 ERROR utils.pc_base: cannot calculate: can not fine value p_total_write_instruction_event +2026-07-17 09:57:02,675 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_miss_cnt}}'}, {'type': 'VARIABLE', 'value': '{{VL1.p_perf_thread_req_cnt}}'}] +2026-07-17 09:57:02,675 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,675 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,675 ERROR utils.pc_base: get_varvalues failed: can not fine value p_perf_miss_cnt +2026-07-17 09:57:02,675 ERROR utils.pc_base: cannot calculate: can not fine value p_perf_miss_cnt +2026-07-17 09:57:02,675 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_rd_req}}'}] +2026-07-17 09:57:02,676 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,676 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,676 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_rd_req in L2C +2026-07-17 09:57:02,676 ERROR utils.pc_base: cannot calculate: can not fine value perf_rd_req in L2C +2026-07-17 09:57:02,676 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_wr_req}}'}] +2026-07-17 09:57:02,676 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,676 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,676 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_wr_req in L2C +2026-07-17 09:57:02,676 ERROR utils.pc_base: cannot calculate: can not fine value perf_wr_req in L2C +2026-07-17 09:57:02,676 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_sector_hit}}'}, {'type': 'VARIABLE', 'value': '{{L2C.perf_miss}}'}] +2026-07-17 09:57:02,677 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,677 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,677 ERROR utils.pc_base: get_varvalues failed: can not fine value perf_miss in L2C +2026-07-17 09:57:02,677 ERROR utils.pc_base: cannot calculate: can not fine value perf_miss in L2C +2026-07-17 09:57:02,677 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_hit_on_miss_event}}'}, {'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_total_miss_event}}'}] +2026-07-17 09:57:02,677 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,678 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,678 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:57:02,678 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_total_miss_event +2026-07-17 09:57:02,678 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_rd}}'}] +2026-07-17 09:57:02,678 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,678 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,678 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_rd +2026-07-17 09:57:02,678 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_rd +2026-07-17 09:57:02,678 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{SL1.sl1_kcache_l2_rd}}'}] +2026-07-17 09:57:02,678 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,678 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,678 ERROR utils.pc_base: get_varvalues failed: can not fine value sl1_kcache_l2_rd +2026-07-17 09:57:02,678 ERROR utils.pc_base: cannot calculate: can not fine value sl1_kcache_l2_rd +2026-07-17 09:57:02,679 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_VALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_GVM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_BSM}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_LDU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_MISC}}'}] +2026-07-17 09:57:02,679 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,679 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,679 ERROR utils.pc_base: get_varvalues failed: can not fine value AP_PERF_INST_MISC in ISU +2026-07-17 09:57:02,679 ERROR utils.pc_base: cannot calculate: can not fine value AP_PERF_INST_MISC in ISU +2026-07-17 09:57:02,679 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,679 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,680 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,680 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,680 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,680 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,680 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,681 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,681 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,681 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,681 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,681 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,682 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,682 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}, {'type': 'VARIABLE', 'value': '{{CE.CE_PERF_BUSY_CYCLES}}'}] +2026-07-17 09:57:02,682 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,683 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,684 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:57:02,685 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,686 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,687 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,689 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,690 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_WSM_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VLS_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_DATA_STALL}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_ARB_VALU_STALL}}'}] +2026-07-17 09:57:02,691 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,693 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,809 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP16}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP32}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_MTE_PI_SEG_SEL_F64}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,810 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,810 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,811 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$ap_trans_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real_16'}, {'type': 'PROC_VAR', 'value': '$ap_trans_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real_16'}, {'type': 'PROC_VAR', 'value': '$RET'}, {'type': 'PROC_VAR', 'value': '$ap_perf_inst_cycles_valu_real'}] +2026-07-17 09:57:02,814 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,817 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP16}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_TRANS_FP32}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_MTE_PI_SEG_SEL_F64}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_VALU_4CYCLES}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,820 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,824 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,824 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,824 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,825 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,825 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,825 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,825 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INSTS_SALU}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,826 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,826 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,826 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,826 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,827 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,827 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,827 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,827 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_INST_CYCLES_MMA}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,828 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,828 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,828 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VLS.PERFEVENT_VLS_ACTIVE}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,829 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,829 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,829 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,829 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,829 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{VLS.PERFEVENT_VLS_ACTIVE}}'}, {'type': 'VARIABLE', 'value': '{{ISU.AP_PERF_ISU_AP_BUSY}}'}] +2026-07-17 09:57:02,830 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,830 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,831 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_req}}'}, {'type': 'VARIABLE', 'value': '{{L2C.1_b1}}'}] +2026-07-17 09:57:02,831 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,831 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,831 INFO utils.complier: analyse formula:[{'type': 'PROC_VAR', 'value': '$RET'}] +2026-07-17 09:57:02,831 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,831 INFO utils.complier: analyse formula:[{'type': 'VARIABLE', 'value': '{{L2C.perf_req}}'}, {'type': 'VARIABLE', 'value': '{{L2C.1_b1}}'}] +2026-07-17 09:57:02,832 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,832 INFO utils.complier: analyse formula:[] +2026-07-17 09:57:02,838 INFO phttp.server_backend: complete task 577aafc1-d8d5-4d8f-9372-43de52e48907 +2026-07-17 09:57:04,598 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:57:04,603 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:57:04] "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 - +2026-07-17 09:57:04,604 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /perf_progress?exec_id=577aafc1-d8d5-4d8f-9372-43de52e48907 HTTP/1.1" 200 1623 +2026-07-17 09:57:12,614 DEBUG urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:50123 +2026-07-17 09:57:12,616 ERROR phttp.http_server: remove .pkey failed +2026-07-17 09:57:12,617 INFO werkzeug: 127.0.0.1 - - [17/Jul/2026 09:57:12] "GET /stop HTTP/1.1" 200 - +2026-07-17 09:57:12,617 DEBUG urllib3.connectionpool: http://127.0.0.1:50123 "GET /stop HTTP/1.1" 200 29 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_012_local_correctness.csv b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_012_local_correctness.csv new file mode 100644 index 0000000..71db82d --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_012_local_correctness.csv @@ -0,0 +1,7 @@ +case,q_lengths,kv_lengths,total_q,total_kv,max_len,match_rate,max_abs,worst_ratio,has_nan,has_inf,required_match,pass +single_token,1,1,1,1,1,1.00000000,0.00000000,0.00000000,False,False,1.00,True +uneven_tail,65;33,65;33,98,98,65,1.00000000,0.01562500,0.32216495,False,False,1.00,True +q_shorter_than_kv,32;17,64;41,49,105,64,1.00000000,0.00781250,0.23584904,False,False,0.99,True +mixed_ragged,640;384;256;256,1280;1024;768;512,1536,3584,1280,1.00000000,0.00390625,0.15508685,False,False,0.99,True +packed_equal_1024,1024,1024,1024,1024,1024,1.00000000,0.01562500,0.29481131,False,False,0.99,True +packed_equal_4096,4096,4096,4096,4096,4096,1.00000000,0.01562500,0.32552084,False,False,0.99,True diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_013_local_correctness.csv b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_013_local_correctness.csv new file mode 100644 index 0000000..71db82d --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_013_local_correctness.csv @@ -0,0 +1,7 @@ +case,q_lengths,kv_lengths,total_q,total_kv,max_len,match_rate,max_abs,worst_ratio,has_nan,has_inf,required_match,pass +single_token,1,1,1,1,1,1.00000000,0.00000000,0.00000000,False,False,1.00,True +uneven_tail,65;33,65;33,98,98,65,1.00000000,0.01562500,0.32216495,False,False,1.00,True +q_shorter_than_kv,32;17,64;41,49,105,64,1.00000000,0.00781250,0.23584904,False,False,0.99,True +mixed_ragged,640;384;256;256,1280;1024;768;512,1536,3584,1280,1.00000000,0.00390625,0.15508685,False,False,0.99,True +packed_equal_1024,1024,1024,1024,1024,1024,1.00000000,0.01562500,0.29481131,False,False,0.99,True +packed_equal_4096,4096,4096,4096,4096,4096,1.00000000,0.01562500,0.32552084,False,False,0.99,True diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_014_local_correctness.log b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_014_local_correctness.log new file mode 100644 index 0000000..01e2ea1 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_014_local_correctness.log @@ -0,0 +1,60 @@ +Loading tilelang libs from dev root: /data/tilelang-metax/build +W0717 10:12:26.508000 103879 site-packages/torch/utils/cpp_extension.py:2527] TORCH_CUDA_ARCH_LIST is not set, all archs for visible cards are included for compilation. +W0717 10:12:26.508000 103879 site-packages/torch/utils/cpp_extension.py:2527] If this is not desired, please set os.environ['TORCH_CUDA_ARCH_LIST'] to specific architectures. +W0717 10:12:26.554000 103879 site-packages/torch/utils/cpp_extension.py:2527] TORCH_CUDA_ARCH_LIST is not set, all archs for visible cards are included for compilation. +W0717 10:12:26.554000 103879 site-packages/torch/utils/cpp_extension.py:2527] If this is not desired, please set os.environ['TORCH_CUDA_ARCH_LIST'] to specific architectures. +W0717 10:12:26.555000 103879 site-packages/torch/utils/cpp_extension.py:2527] TORCH_CUDA_ARCH_LIST is not set, all archs for visible cards are included for compilation. +W0717 10:12:26.555000 103879 site-packages/torch/utils/cpp_extension.py:2527] If this is not desired, please set os.environ['TORCH_CUDA_ARCH_LIST'] to specific architectures. +case,batch,total_q,total_kv,max_len,match,max_abs,worst_ratio,nan,inf,pass +2026-07-17 10:12:16 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_pv_fullcol_v14` with `out_idx=None` +2026-07-17 10:12:20 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:12:26 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_pv_fullcol_v14` +1,33,16294,16294,987,1.00000000,0.01562500,0.32552084,False,False,True +2026-07-17 10:12:26 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_pv_fullcol_v14` with `out_idx=None` +2026-07-17 10:12:29 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:12:35 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_pv_fullcol_v14` +2,1,1024,1024,1024,1.00000000,0.01562500,0.32216495,False,False,True +2026-07-17 10:12:35 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_pv_fullcol_v14` with `out_idx=None` +Traceback (most recent call last): + File "/data/operator_task_package/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tests/test_opt_012_formal.py", line 108, in + main() + File "/data/operator_task_package/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tests/test_opt_012_formal.py", line 63, in main + module.run_kernel( + File "/data/operator_task_package/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_014_pv_fullcol.py", line 712, in run_kernel + _kernel_cache[key] = build_packed_kernel_pv_fullcol_v14( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/data/tilelang-metax/tilelang/jit/__init__.py", line 465, in __call__ + kernel = self.compile(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/data/tilelang-metax/tilelang/jit/__init__.py", line 395, in compile + kernel_result = compile( + ^^^^^^^^ + File "/data/tilelang-metax/tilelang/jit/__init__.py", line 115, in compile + return cached( + ^^^^^^^ + File "/data/tilelang-metax/tilelang/cache/__init__.py", line 74, in cached + return _dispatch_map[execution_backend].cached( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/data/tilelang-metax/tilelang/cache/kernel_cache.py", line 345, in cached + kernel = JITKernel( + ^^^^^^^^^^ + File "/data/tilelang-metax/tilelang/jit/kernel.py", line 136, in __init__ + adapter = self._compile_and_create_adapter(func, out_idx) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/data/tilelang-metax/tilelang/jit/kernel.py", line 247, in _compile_and_create_adapter + artifact = tilelang.lower( + ^^^^^^^^^^^^^^^ + File "/data/tilelang-metax/tilelang/engine/lower.py", line 362, in lower + mod = LowerAndLegalize(mod, target) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/data/tilelang-metax/tilelang/engine/phase.py", line 192, in LowerAndLegalize + mod = tilelang.transform.LayoutInference()(mod) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/data/tilelang-metax/3rdparty/tvm/python/tvm/ir/transform.py", line 167, in __call__ + return _ffi_transform_api.RunPass(self, mod) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "python/tvm_ffi/cython/function.pxi", line 929, in tvm_ffi.core.Function.__call__ +tvm.error.InternalError: Layout infer conflict between scores and probs in T.Parallel loop: + loop Fragment([128, 64] -> [128], replicate: 8, thread: 512, forward_thread: _rep * 64 + _j % 16 // 4 * 16 + _i % 16, forward_index: [_j // 16 * 32 + _i // 16 * 4 + _j % 4], thread_range: I.Range(0, 512)) + fragment Fragment([128, 64] -> [16], replicate: 1, thread: 512, forward_thread: _i // 16 * 64 + _j % 16 // 4 * 16 + _i % 16, forward_index: [_j // 16 * 4 + _j % 4], thread_range: I.Range(0, 512)) + diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_015_local_correctness.log b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_015_local_correctness.log new file mode 100644 index 0000000..09863cf --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/opt_015_local_correctness.log @@ -0,0 +1,59 @@ +Loading tilelang libs from dev root: /data/tilelang-metax/build +W0717 10:15:35.240000 104250 site-packages/torch/utils/cpp_extension.py:2527] TORCH_CUDA_ARCH_LIST is not set, all archs for visible cards are included for compilation. +W0717 10:15:35.240000 104250 site-packages/torch/utils/cpp_extension.py:2527] If this is not desired, please set os.environ['TORCH_CUDA_ARCH_LIST'] to specific architectures. +W0717 10:15:35.286000 104250 site-packages/torch/utils/cpp_extension.py:2527] TORCH_CUDA_ARCH_LIST is not set, all archs for visible cards are included for compilation. +W0717 10:15:35.286000 104250 site-packages/torch/utils/cpp_extension.py:2527] If this is not desired, please set os.environ['TORCH_CUDA_ARCH_LIST'] to specific architectures. +W0717 10:15:35.287000 104250 site-packages/torch/utils/cpp_extension.py:2527] TORCH_CUDA_ARCH_LIST is not set, all archs for visible cards are included for compilation. +W0717 10:15:35.287000 104250 site-packages/torch/utils/cpp_extension.py:2527] If this is not desired, please set os.environ['TORCH_CUDA_ARCH_LIST'] to specific architectures. +case,batch,total_q,total_kv,max_len,match,max_abs,worst_ratio,nan,inf,pass +2026-07-17 10:15:25 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:15:28 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:15:34 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +1,33,16294,16294,987,1.00000000,0.01562500,0.32552084,False,False,True +2026-07-17 10:15:35 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:15:38 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:15:43 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +2,1,1024,1024,1024,1.00000000,0.01562500,0.32216495,False,False,True +2026-07-17 10:15:44 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:15:47 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:15:52 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +3,1,4096,4096,4096,1.00000000,0.01562500,0.32552084,False,False,True +2026-07-17 10:15:53 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:15:56 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:16:01 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +4,1,16384,16384,16384,1.00000000,0.01562500,0.31887755,False,False,True +2026-07-17 10:16:01 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:16:05 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:16:10 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +5,4,4096,4096,1024,1.00000000,0.01562500,0.32552084,False,False,True +2026-07-17 10:16:10 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:16:13 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:16:19 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +6,4,16384,16384,4096,1.00000000,0.01562500,0.32216495,False,False,True +2026-07-17 10:16:19 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:16:22 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:16:28 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +7,16,16384,16384,1024,1.00000000,0.01562500,0.32552084,False,False,True +2026-07-17 10:16:28 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:16:31 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:16:37 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +8,16,32768,32768,2048,1.00000000,0.01562500,0.32552084,False,False,True +2026-07-17 10:16:37 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:16:41 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:16:47 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +9,4,2048,4096,1024,1.00000000,0.00195312,0.09765624,False,False,True +2026-07-17 10:16:47 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:16:50 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:16:56 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +10,4,1536,3584,1280,1.00000000,0.00195312,0.09765624,False,False,True +2026-07-17 10:16:57 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:17:00 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:17:06 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +11,2,1024,3072,2048,1.00000000,0.00195312,0.09765624,False,False,True +2026-07-17 10:17:07 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:133): TileLang begins to compile kernel `packed_kernel_v_prefetch_after_qk_v15` with `out_idx=None` +2026-07-17 10:17:10 [TileLang:tilelang:WARNING] (phase.py:274): Should support PDL for maca target +2026-07-17 10:17:16 [TileLang:tilelang.jit.kernel:INFO] (kernel.py:141): TileLang completes to compile kernel `packed_kernel_v_prefetch_after_qk_v15` +12,27,12251,12251,873,1.00000000,0.01562500,0.32552084,False,False,True +13,15,969,969,123,1.00000000,0.01562500,0.32552084,False,False,True +14,1,1,1,1,1.00000000,0.00000000,0.00000000,False,False,True +15,2,98,98,65,1.00000000,0.01562500,0.32216495,False,False,True diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang/tilelang_oj_results_opt_012.csv b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang/tilelang_oj_results_opt_012.csv new file mode 100644 index 0000000..49c4ad2 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang/tilelang_oj_results_opt_012.csv @@ -0,0 +1,16 @@ +case_id,config,batch,total_q,total_kv,max_q,max_kv,seq_len,tk_ms,tb_ms,speedup,score_ratio,display_score,pass +1,ragged_b33_16294,33,16294,16294,987,987,987,2.585,1.575,0.609,0.352,35,True +2,equal_b1_s1024,1,1024,1024,1024,1024,1024,0.291,0.260,0.893,0.468,46,True +3,equal_b1_s4096,1,4096,4096,4096,4096,4096,3.015,1.655,0.549,0.307,30,True +4,equal_b1_s16384,1,16384,16384,16384,16384,16384,45.911,22.426,0.488,0.265,26,True +5,equal_b4_s1024,4,4096,4096,1024,1024,1024,0.904,0.635,0.702,0.393,39,True +6,equal_b4_s4096,4,16384,16384,4096,4096,4096,11.688,6.064,0.519,0.286,28,True +7,equal_b16_s1024,16,16384,16384,1024,1024,1024,3.335,2.024,0.607,0.344,34,True +8,equal_b16_s2048,16,32768,32768,2048,2048,2048,12.394,6.638,0.536,0.301,30,True +9,q512_k1024_b4,4,2048,4096,512,1024,1024,0.715,0.538,0.752,0.415,41,True +10,mixed_b4,4,1536,3584,640,1280,1280,0.577,0.412,0.714,0.400,40,True +11,q_lt_kv_b2,2,1024,3072,512,2048,2048,0.701,0.410,0.585,0.344,34,True +12,ragged_b27_12251,27,12251,12251,873,873,873,1.816,1.169,0.644,0.369,37,True +13,short_ragged_969,15,969,969,123,123,123,0.308,0.151,0.490,0.321,32,True +14,single_token,1,1,1,1,1,1,0.018,0.106,5.889,0.855,85,True +15,tail_non_power2,2,98,98,65,65,65,0.053,0.109,2.057,0.675,67,True \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang/tilelang_oj_results_opt_012.md b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang/tilelang_oj_results_opt_012.md new file mode 100644 index 0000000..9768373 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang/tilelang_oj_results_opt_012.md @@ -0,0 +1,66 @@ +# TileLang opt_012 OJ Results + +**Date:** 2026-07-16 +**File:** `tilelang/opt_012_dense_softmax_cleanup.py` +**Parent:** `opt_011_reverse_dense_tiles.py` + +## Summary + +All 15 XPU-OJ testcases passed correctness. This version refines the online +softmax computation path for improved numerical efficiency. + +## Results + +| Case | Config | User (ms) | Baseline (ms) | Speedup | Score % | Display | +|------|--------|-----------|---------------|---------|---------|---------| +| 1 | ragged_b33_16294 | 2.585 | 1.575 | 0.609x | 35.21% | 35 | +| 2 | equal_b1_s1024 | 0.291 | 0.260 | 0.893x | 46.77% | 46 | +| 3 | equal_b1_s4096 | 3.015 | 1.655 | 0.549x | 30.71% | 30 | +| 4 | equal_b1_s16384 | 45.911 | 22.426 | 0.488x | 26.52% | 26 | +| 5 | equal_b4_s1024 | 0.904 | 0.635 | 0.702x | 39.26% | 39 | +| 6 | equal_b4_s4096 | 11.688 | 6.064 | 0.519x | 28.65% | 28 | +| 7 | equal_b16_s1024 | 3.335 | 2.024 | 0.607x | 34.44% | 34 | +| 8 | equal_b16_s2048 | 12.394 | 6.638 | 0.536x | 30.08% | 30 | +| 9 | q512_k1024_b4 | 0.715 | 0.538 | 0.752x | 41.47% | 41 | +| 10 | mixed_b4 | 0.577 | 0.412 | 0.714x | 39.95% | 40 | +| 11 | q_lt_kv_b2 | 0.701 | 0.410 | 0.585x | 34.39% | 34 | +| 12 | ragged_b27_12251 | 1.816 | 1.169 | 0.644x | 36.93% | 37 | +| 13 | short_ragged_969 | 0.308 | 0.151 | 0.490x | 32.12% | 32 | +| 14 | single_token | 0.018 | 0.106 | 5.889x | 85.49% | 85 | +| 15 | tail_non_power2 | 0.053 | 0.109 | 2.057x | 67.50% | 67 | + +## Aggregate Metrics + +| Metric | Value | +|--------|-------| +| Sum of user times | 84.311 ms | +| Sum of baseline times | 44.172 ms | +| Mean score ratio | 40.633% | +| Mean display score | 40.3 / 100 | + +These aggregate values were recomputed directly from all 15 rows in the CSV. + +## Key Observations + +1. **Correctness:** All 15 testcases passed +2. **Edge cases excel:** Cases 14 and 15 significantly outperform baseline (5.9x and 2.1x) +3. **Long dense sequences lag:** Cases 3, 4, 6, 8 show largest gap vs baseline +4. **Varlen cases moderate:** Cases 9-13 show reasonable 0.49-0.75x speedup + +## Comparison with opt_011 + +Note: opt_011 was tested on 16G machine, opt_012 on 64G machine. Direct +comparison may not be fully accurate. + +The performance profile is similar between versions, with the main bottleneck +remaining the long dense sequence path where FlashInfer's more sophisticated +implementation (partition-KV, async prefetch, MMA-specific optimizations) +outperforms the current TileLang mapping. + +## Next Steps + +To close the gap with baseline, future optimization should focus on: +1. Improving the long dense sequence path (cases 3, 4, 6, 8) +2. Better utilization of C500 matrix instructions +3. Potential async prefetch for K/V data +4. Consideration of partition-KV for very long sequences diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt new file mode 100644 index 0000000..f66fdbd --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt @@ -0,0 +1,46 @@ +############################## +Sub-module: Summary +------------------------------ +Name: Total Cycles +Description: cycles use by kernel +Value: 52,104.54(Kcycles) +------------------------------ +Name: AP busy Duty +Description: average AP busy duty of total cycles +Value: 99.34% +############################## +Sub-module: ISU Statistics +------------------------------ +Name: ISU stall cycles layout +Description: ISU stall cycles layout +Value: { + "data": { + "wsm_stall": 1230986240.0, + "vls_pipeline_stall": 149971994.25641027, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717095614/ISU_stall_cycles_layout20260717095702187.png" +} +############################## +Sub-module: GPU Throughput Statistics +------------------------------ +Name: AP MTE Duty ratio +Description: MTE Duty ratio relative to AP active +Value: 38.31% +------------------------------ +Name: AP STE Duty ratio +Description: STE Duty ratio relative to AP active +Value: 1.09% +------------------------------ +Name: AP MMA Duty ratio +Description: MMA Duty ratio relative to AP active +Value: 20.10% +------------------------------ +Name: VLS Duty ratio +Description: VLS Duty ratio relative to AP active +Value: 0.0% +------------------------------ +Name: L2C Duty ratio +Description: L2C Duty ratio relative to L2C active +Value: 8.40% \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv new file mode 100644 index 0000000..8f3bde8 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv @@ -0,0 +1,17 @@ +Name,Description,Value +Total Cycles,cycles use by kernel,"52,104.54(Kcycles)" +AP busy Duty,average AP busy duty of total cycles,99.34% +ISU stall cycles layout,ISU stall cycles layout,"{ + ""data"": { + ""wsm_stall"": 1230986240.0, + ""vls_pipeline_stall"": 149971994.25641027, + ""vls_wdata_stall"": 2097152.0, + ""valu_stall"": 0.0 + }, + ""filename"": ""/opt/mcProfiler-ubuntu18.04/output20260717095614/ISU_stall_cycles_layout20260717095702187.png"" +}" +AP MTE Duty ratio,MTE Duty ratio relative to AP active,38.31% +AP STE Duty ratio,STE Duty ratio relative to AP active,1.09% +AP MMA Duty ratio,MMA Duty ratio relative to AP active,20.10% +VLS Duty ratio,VLS Duty ratio relative to AP active,0.0% +L2C Duty ratio,L2C Duty ratio relative to L2C active,8.40% diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json new file mode 100644 index 0000000..55b8079 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json @@ -0,0 +1,56 @@ +{ + "Summary": [ + { + "name": "Total Cycles", + "description": "cycles use by kernel", + "value": "52,104.54(Kcycles)" + }, + { + "name": "AP busy Duty", + "description": "average AP busy duty of total cycles", + "value": "99.34%" + } + ], + "ISU Statistics": [ + { + "name": "ISU stall cycles layout", + "description": "ISU stall cycles layout", + "value": { + "data": { + "wsm_stall": 1230986240.0, + "vls_pipeline_stall": 149971994.25641027, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717095614/ISU_stall_cycles_layout20260717095702187.png" + } + } + ], + "GPU Throughput Statistics": [ + { + "name": "AP MTE Duty ratio", + "description": "MTE Duty ratio relative to AP active", + "value": "38.31%" + }, + { + "name": "AP STE Duty ratio", + "description": "STE Duty ratio relative to AP active", + "value": "1.09%" + }, + { + "name": "AP MMA Duty ratio", + "description": "MMA Duty ratio relative to AP active", + "value": "20.10%" + }, + { + "name": "VLS Duty ratio", + "description": "VLS Duty ratio relative to AP active", + "value": "0.0%" + }, + { + "name": "L2C Duty ratio", + "description": "L2C Duty ratio relative to L2C active", + "value": "8.40%" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json new file mode 100644 index 0000000..1fd3dd5 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/1_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json @@ -0,0 +1,61 @@ +{ + "Summary": [ + { + "data": 52104.538, + "isError": false, + "message": "", + "name": "Total Cycles" + }, + { + "data": 99.33925141030903, + "isError": false, + "message": "", + "name": "AP busy Duty" + } + ], + "ISU Statistics": [ + { + "data": { + "wsm_stall": 1230986240.0, + "vls_pipeline_stall": 149971994.25641027, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "isError": false, + "message": "", + "name": "ISU stall cycles layout" + } + ], + "GPU Throughput Statistics": [ + { + "data": 38.30926808749678, + "isError": false, + "message": "", + "name": "AP MTE Duty ratio" + }, + { + "data": 1.0916328894651182, + "isError": false, + "message": "", + "name": "AP STE Duty ratio" + }, + { + "data": 20.100054369899006, + "isError": false, + "message": "", + "name": "AP MMA Duty ratio" + }, + { + "data": 0.0, + "isError": false, + "message": "", + "name": "VLS Duty ratio" + }, + { + "data": 8.399882159167529, + "isError": false, + "message": "", + "name": "L2C Duty ratio" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt new file mode 100644 index 0000000..a178951 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt @@ -0,0 +1,46 @@ +############################## +Sub-module: Summary +------------------------------ +Name: Total Cycles +Description: cycles use by kernel +Value: 52,021.89(Kcycles) +------------------------------ +Name: AP busy Duty +Description: average AP busy duty of total cycles +Value: 99.55% +############################## +Sub-module: ISU Statistics +------------------------------ +Name: ISU stall cycles layout +Description: ISU stall cycles layout +Value: { + "data": { + "wsm_stall": 1231045529.6, + "vls_pipeline_stall": 149665424.41025642, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717095614/ISU_stall_cycles_layout20260717095702519.png" +} +############################## +Sub-module: GPU Throughput Statistics +------------------------------ +Name: AP MTE Duty ratio +Description: MTE Duty ratio relative to AP active +Value: 38.30% +------------------------------ +Name: AP STE Duty ratio +Description: STE Duty ratio relative to AP active +Value: 1.09% +------------------------------ +Name: AP MMA Duty ratio +Description: MMA Duty ratio relative to AP active +Value: 20.10% +------------------------------ +Name: VLS Duty ratio +Description: VLS Duty ratio relative to AP active +Value: 0.0% +------------------------------ +Name: L2C Duty ratio +Description: L2C Duty ratio relative to L2C active +Value: 8.41% \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv new file mode 100644 index 0000000..c3fc241 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv @@ -0,0 +1,17 @@ +Name,Description,Value +Total Cycles,cycles use by kernel,"52,021.89(Kcycles)" +AP busy Duty,average AP busy duty of total cycles,99.55% +ISU stall cycles layout,ISU stall cycles layout,"{ + ""data"": { + ""wsm_stall"": 1231045529.6, + ""vls_pipeline_stall"": 149665424.41025642, + ""vls_wdata_stall"": 2097152.0, + ""valu_stall"": 0.0 + }, + ""filename"": ""/opt/mcProfiler-ubuntu18.04/output20260717095614/ISU_stall_cycles_layout20260717095702519.png"" +}" +AP MTE Duty ratio,MTE Duty ratio relative to AP active,38.30% +AP STE Duty ratio,STE Duty ratio relative to AP active,1.09% +AP MMA Duty ratio,MMA Duty ratio relative to AP active,20.10% +VLS Duty ratio,VLS Duty ratio relative to AP active,0.0% +L2C Duty ratio,L2C Duty ratio relative to L2C active,8.41% diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json new file mode 100644 index 0000000..ef2f5d4 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json @@ -0,0 +1,56 @@ +{ + "Summary": [ + { + "name": "Total Cycles", + "description": "cycles use by kernel", + "value": "52,021.89(Kcycles)" + }, + { + "name": "AP busy Duty", + "description": "average AP busy duty of total cycles", + "value": "99.55%" + } + ], + "ISU Statistics": [ + { + "name": "ISU stall cycles layout", + "description": "ISU stall cycles layout", + "value": { + "data": { + "wsm_stall": 1231045529.6, + "vls_pipeline_stall": 149665424.41025642, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717095614/ISU_stall_cycles_layout20260717095702519.png" + } + } + ], + "GPU Throughput Statistics": [ + { + "name": "AP MTE Duty ratio", + "description": "MTE Duty ratio relative to AP active", + "value": "38.30%" + }, + { + "name": "AP STE Duty ratio", + "description": "STE Duty ratio relative to AP active", + "value": "1.09%" + }, + { + "name": "AP MMA Duty ratio", + "description": "MMA Duty ratio relative to AP active", + "value": "20.10%" + }, + { + "name": "VLS Duty ratio", + "description": "VLS Duty ratio relative to AP active", + "value": "0.0%" + }, + { + "name": "L2C Duty ratio", + "description": "L2C Duty ratio relative to L2C active", + "value": "8.41%" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json new file mode 100644 index 0000000..25e98a5 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/2_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json @@ -0,0 +1,61 @@ +{ + "Summary": [ + { + "data": 52021.891, + "isError": false, + "message": "", + "name": "Total Cycles" + }, + { + "data": 99.54653897529407, + "isError": false, + "message": "", + "name": "AP busy Duty" + } + ], + "ISU Statistics": [ + { + "data": { + "wsm_stall": 1231045529.6, + "vls_pipeline_stall": 149665424.41025642, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "isError": false, + "message": "", + "name": "ISU stall cycles layout" + } + ], + "GPU Throughput Statistics": [ + { + "data": 38.30305307273055, + "isError": false, + "message": "", + "name": "AP MTE Duty ratio" + }, + { + "data": 1.0910904246074884, + "isError": false, + "message": "", + "name": "AP STE Duty ratio" + }, + { + "data": 20.0979755297533, + "isError": false, + "message": "", + "name": "AP MMA Duty ratio" + }, + { + "data": 0.0, + "isError": false, + "message": "", + "name": "VLS Duty ratio" + }, + { + "data": 8.40757788721454, + "isError": false, + "message": "", + "name": "L2C Duty ratio" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095701860.png b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095701860.png new file mode 100644 index 0000000000000000000000000000000000000000..7bed163d7465fa694010d6b0413da0f90f2bc2ab GIT binary patch literal 40785 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 literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702187.png b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702187.png new file mode 100644 index 0000000000000000000000000000000000000000..604f1501a567569899a519d92ce581d9e3f80ee2 GIT binary patch literal 39652 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 literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702353.png b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702353.png new file mode 100644 index 0000000000000000000000000000000000000000..604f1501a567569899a519d92ce581d9e3f80ee2 GIT binary patch literal 39652 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 literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702519.png b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702519.png new file mode 100644 index 0000000000000000000000000000000000000000..369f775dbfaf39a305ab5ddcf08a1f9db32ed1a8 GIT binary patch literal 39636 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 literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702687.png b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/ISU_stall_cycles_layout20260717095702687.png new file mode 100644 index 0000000000000000000000000000000000000000..369f775dbfaf39a305ab5ddcf08a1f9db32ed1a8 GIT binary patch literal 39636 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 literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/batches.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/batches.json new file mode 100644 index 0000000..1e5b15d --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/batches.json @@ -0,0 +1,25 @@ +{ + "CE": [ + "CE_PERF_BUSY_CYCLES" + ], + "ISU": [ + "AP_PERF_ISU_ARB_VALU_STALL", + "AP_PERF_INST_TRANS_FP16", + "AP_PERF_ISU_ARB_WSM_STALL", + "AP_PERF_INSTS_SALU", + "AP_PERF_INST_TRANS_FP32", + "AP_PERF_ISU_ARB_DATA_STALL", + "AP_PERF_INST_CYCLES_VALU_4CYCLES", + "AP_PERF_ISU_AP_BUSY", + "AP_PERF_MTE_PI_SEG_SEL_F64", + "AP_PERF_ISU_ARB_VLS_STALL", + "AP_PERF_INST_CYCLES_MMA" + ], + "VLS": [ + "PERFEVENT_VLS_ACTIVE" + ], + "L2C": [ + "1_b1", + "perf_req" + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/event_batch_0.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/event_batch_0.json new file mode 100644 index 0000000..341b24c --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/event_batch_0.json @@ -0,0 +1,134 @@ +{ + "perfListPerBlock": { + "CE": [ + { + "dpcId": 0, + "blockId": 0, + "dpc_broadcast": false, + "block_broadcast": false, + "events": [ + [ + 4, + "CE_PERF_SEND_RM_WAVES" + ], + [ + 2, + "CE_PERF_BUSY_CYCLES" + ] + ] + } + ], + "ISU": [ + { + "dpcId": 0, + "blockId": 0, + "dpc_broadcast": false, + "block_broadcast": false, + "events": [ + [ + 1, + "AP_PERF_WAVES" + ], + [ + 82, + "AP_PERF_ISU_ARB_VALU_STALL" + ], + [ + 41, + "AP_PERF_INST_TRANS_FP16" + ], + [ + 79, + "AP_PERF_ISU_ARB_WSM_STALL" + ], + [ + 10, + "AP_PERF_INSTS_SALU" + ], + [ + 40, + "AP_PERF_INST_TRANS_FP32" + ], + [ + 81, + "AP_PERF_ISU_ARB_DATA_STALL" + ] + ] + }, + { + "dpcId": 0, + "blockId": 1, + "dpc_broadcast": false, + "block_broadcast": false, + "events": [ + [ + 1, + "AP_PERF_WAVES" + ], + [ + 52, + "AP_PERF_INST_CYCLES_VALU_4CYCLES" + ], + [ + 89, + "AP_PERF_ISU_AP_BUSY" + ], + [ + 101, + "AP_PERF_MTE_PI_SEG_SEL_F64" + ], + [ + 80, + "AP_PERF_ISU_ARB_VLS_STALL" + ], + [ + 43, + "AP_PERF_INST_CYCLES_MMA" + ] + ] + } + ], + "VLS": [ + { + "dpcId": 0, + "blockId": 0, + "dpc_broadcast": false, + "block_broadcast": false, + "events": [ + [ + 23, + "PERFEVENT_VLS_ACTIVE" + ] + ] + } + ], + "L2C": [ + { + "dpcId": 0, + "blockId": 0, + "dpc_broadcast": false, + "block_broadcast": false, + "events": [ + [ + 1, + "1_b1" + ], + [ + 74, + "perf_req" + ] + ] + } + ] + }, + "action": "config,disable,read_dump,enable,kernel_collect", + "conditions": { + "kernelnames": [ + "packed_kernel_dense_softmax_cleanup_v12_kernel" + ], + "include": true, + "is_perkernel": true, + "is_multi_device": false, + "counts": 4 + } +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/mcProfiler.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/mcProfiler.json new file mode 100644 index 0000000..341b24c --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/mcProfiler.json @@ -0,0 +1,134 @@ +{ + "perfListPerBlock": { + "CE": [ + { + "dpcId": 0, + "blockId": 0, + "dpc_broadcast": false, + "block_broadcast": false, + "events": [ + [ + 4, + "CE_PERF_SEND_RM_WAVES" + ], + [ + 2, + "CE_PERF_BUSY_CYCLES" + ] + ] + } + ], + "ISU": [ + { + "dpcId": 0, + "blockId": 0, + "dpc_broadcast": false, + "block_broadcast": false, + "events": [ + [ + 1, + "AP_PERF_WAVES" + ], + [ + 82, + "AP_PERF_ISU_ARB_VALU_STALL" + ], + [ + 41, + "AP_PERF_INST_TRANS_FP16" + ], + [ + 79, + "AP_PERF_ISU_ARB_WSM_STALL" + ], + [ + 10, + "AP_PERF_INSTS_SALU" + ], + [ + 40, + "AP_PERF_INST_TRANS_FP32" + ], + [ + 81, + "AP_PERF_ISU_ARB_DATA_STALL" + ] + ] + }, + { + "dpcId": 0, + "blockId": 1, + "dpc_broadcast": false, + "block_broadcast": false, + "events": [ + [ + 1, + "AP_PERF_WAVES" + ], + [ + 52, + "AP_PERF_INST_CYCLES_VALU_4CYCLES" + ], + [ + 89, + "AP_PERF_ISU_AP_BUSY" + ], + [ + 101, + "AP_PERF_MTE_PI_SEG_SEL_F64" + ], + [ + 80, + "AP_PERF_ISU_ARB_VLS_STALL" + ], + [ + 43, + "AP_PERF_INST_CYCLES_MMA" + ] + ] + } + ], + "VLS": [ + { + "dpcId": 0, + "blockId": 0, + "dpc_broadcast": false, + "block_broadcast": false, + "events": [ + [ + 23, + "PERFEVENT_VLS_ACTIVE" + ] + ] + } + ], + "L2C": [ + { + "dpcId": 0, + "blockId": 0, + "dpc_broadcast": false, + "block_broadcast": false, + "events": [ + [ + 1, + "1_b1" + ], + [ + 74, + "perf_req" + ] + ] + } + ] + }, + "action": "config,disable,read_dump,enable,kernel_collect", + "conditions": { + "kernelnames": [ + "packed_kernel_dense_softmax_cleanup_v12_kernel" + ], + "include": true, + "is_perkernel": true, + "is_multi_device": false, + "counts": 4 + } +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/opt012_case4_duty.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/opt012_case4_duty.json new file mode 100644 index 0000000..f49bd0e --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/opt012_case4_duty.json @@ -0,0 +1,189 @@ +{ + "perf_counters": { + "0": [ + { + "CE": { + "generic": { + "CE_PERF_BUSY_CYCLES": 10608946191, + "CE_PERF_SEND_RM_WAVES": 1554177 + } + }, + "ISU": { + "dpcId0,blockId0": { + "AP_PERF_WAVES": 14976, + "AP_PERF_INSTS_SALU": 18112308, + "AP_PERF_INST_TRANS_FP32": 85822208, + "AP_PERF_INST_TRANS_FP16": 0, + "AP_PERF_ISU_ARB_WSM_STALL": 372920866, + "AP_PERF_ISU_ARB_DATA_STALL": 700264, + "AP_PERF_ISU_ARB_VALU_STALL": 0 + }, + "dpcId0,blockId1": { + "AP_PERF_WAVES": 15036, + "AP_PERF_MTE_PI_SEG_SEL_F64": 0, + "AP_PERF_INST_CYCLES_MMA": 1290141696, + "AP_PERF_INST_CYCLES_VALU_4CYCLES": 2129860432, + "AP_PERF_ISU_ARB_VLS_STALL": 44390461, + "AP_PERF_ISU_AP_BUSY": 1605762663 + } + }, + "L2C": { + "dpcId0,blockId0": { + "1_b1": 10609002354, + "perf_req": 136051869 + } + }, + "VLS": { + "dpcId0,blockId0": { + "PERFEVENT_VLS_ACTIVE": 0 + } + } + }, + { + "CE": { + "generic": { + "CE_PERF_BUSY_CYCLES": 52104538, + "CE_PERF_SEND_RM_WAVES": 32768 + } + }, + "ISU": { + "dpcId0,blockId0": { + "AP_PERF_WAVES": 320, + "AP_PERF_INSTS_SALU": 579520, + "AP_PERF_INST_TRANS_FP32": 2764800, + "AP_PERF_INST_TRANS_FP16": 0, + "AP_PERF_ISU_ARB_WSM_STALL": 12021350, + "AP_PERF_ISU_ARB_DATA_STALL": 20480, + "AP_PERF_ISU_ARB_VALU_STALL": 0 + }, + "dpcId0,blockId1": { + "AP_PERF_WAVES": 312, + "AP_PERF_MTE_PI_SEG_SEL_F64": 0, + "AP_PERF_INST_CYCLES_MMA": 41615360, + "AP_PERF_INST_CYCLES_VALU_4CYCLES": 68533184, + "AP_PERF_ISU_ARB_VLS_STALL": 1427956, + "AP_PERF_ISU_AP_BUSY": 51760258 + } + }, + "L2C": { + "dpcId0,blockId0": { + "1_b1": 52083814, + "perf_req": 4374979 + } + }, + "VLS": { + "dpcId0,blockId0": { + "PERFEVENT_VLS_ACTIVE": 0 + } + }, + "args": { + "kernelName": [ + "packed_kernel_dense_softmax_cleanup_v12_kernel" + ], + "tag": [ + -1 + ] + } + }, + { + "CE": { + "generic": { + "CE_PERF_BUSY_CYCLES": 52021891, + "CE_PERF_SEND_RM_WAVES": 32768 + } + }, + "ISU": { + "dpcId0,blockId0": { + "AP_PERF_WAVES": 320, + "AP_PERF_INSTS_SALU": 579520, + "AP_PERF_INST_TRANS_FP32": 2764800, + "AP_PERF_INST_TRANS_FP16": 0, + "AP_PERF_ISU_ARB_WSM_STALL": 12021929, + "AP_PERF_ISU_ARB_DATA_STALL": 20480, + "AP_PERF_ISU_ARB_VALU_STALL": 0 + }, + "dpcId0,blockId1": { + "AP_PERF_WAVES": 312, + "AP_PERF_MTE_PI_SEG_SEL_F64": 0, + "AP_PERF_INST_CYCLES_MMA": 41631744, + "AP_PERF_INST_CYCLES_VALU_4CYCLES": 68559744, + "AP_PERF_ISU_ARB_VLS_STALL": 1425037, + "AP_PERF_ISU_AP_BUSY": 51785992 + } + }, + "L2C": { + "dpcId0,blockId0": { + "1_b1": 52036140, + "perf_req": 4374979 + } + }, + "VLS": { + "dpcId0,blockId0": { + "PERFEVENT_VLS_ACTIVE": 0 + } + }, + "args": { + "kernelName": [ + "packed_kernel_dense_softmax_cleanup_v12_kernel" + ], + "tag": [ + -1 + ] + } + } + ] + }, + "umd_data": {}, + "device_info": { + "3": { + "gpu_id": "51332", + "cpu_cores_count": 0, + "mem_banks_count": 1, + "direct_link_count": 4, + "indirect_link_count": 8, + "vendor_id": 39321, + "device_id": 16385, + "drm_render_minor": 129, + "isa_major": 10, + "isa_minor": 0, + "is_vf": 0, + "max_vf_nums": 8, + "domain": 0, + "location_id": 3840, + "num_sdma_engines": 5, + "num_sdma_queues_per_engine": 9, + "num_vpue_cores": 1, + "num_vpud_cores": 8, + "caches_count": 157, + "peu_id_base": 0, + "peu_count": 416, + "max_waves_per_peu": 8, + "wsm_size_in_kb": 64, + "wave_front_size": 64, + "dpc_count": 8, + "dpc0_ap_mask": 8191, + "dpc1_ap_mask": 73727, + "dpc2_ap_mask": 139263, + "dpc3_ap_mask": 204799, + "dpc4_ap_mask": 270335, + "dpc5_ap_mask": 335871, + "dpc6_ap_mask": 401407, + "dpc7_ap_mask": 466943, + "dpc_arrays": 1, + "ap_per_dpc": 13, + "peu_per_ap": 4, + "pri_mem_per_thread": 4, + "max_slots_private_ap": 32, + "num_ce_queues": 16, + "max_engine_clk_gpu": 1600, + "max_engine_clk_cpu": 3600, + "mgpu_id": 0, + "topology_id": 2, + "socket_id": 3, + "hbmecc": 1, + "local_mem_size": 68719476736, + "capability": 4432512, + "maxprocess": 10 + } + } +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.pdf b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.pdf new file mode 100644 index 0000000..bf7e2f0 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.pdf @@ -0,0 +1,94 @@ +%PDF-1.4 +% ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R /F2 3 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 720 /Length 38679 /SMask 5 0 R + /Subtype /Image /Type /XObject /Width 1280 +>> +stream +Gb"-V#C$pT+3/BT!eh-X/0]Fn!jWCLO[-TqmTsSnfs"Bo!5B_\]Bn&_GIQa\@zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!"\e6K_83E`Xu^]!kqG';6*6#nk$-LlOdE!!$F*U@mE<7>jbc%1$cq"=LPmG#*]RQ5EL8=;5E[VXV82/8rC;Armt'3Yusq!_^a5(/;)0CJ,jlL+(H[r1$^a,``[Jb\usrVQ?@X&gr[\o]PW/gX,SQo&N?>W@*(Cq80FUIS$s3F]o47n:T=2f>"nA#t_NDr/.TV+[^YPq%4YoIX:U]QW\2Ias,[(Rd7!RPek]=f\k'Ec#2l@'&r;XoHQ?XB;`:L("r1Z81r]bEhBo<5sl-PVZstldr>\HK3WC^Qg9K8t.a+^juT9I!eDD**Kt$oj,1QalTR(Xcf,R\8^DP05T=I74sfbad4Yf^OH-o]Y&t/*@eHomX+Qf:"'u9BE+5'8dCSe.6!_NA&c"8If&)Z+3N]++$WMk3jl>2di0)T>-pbY)WpK*o+?`g+7A(F+N8O#o]\_t%*=__;srGO[I;FrKn\X1PK1SY6Z++V0%ZC@>P?4)/$[B7[/MSVV/+\c;lcB*?H8.]QeG0Rg0-%VFm-=LECulD]n`.e^[[cWiK4)Q3W\pX^Bha=Ym%p!8J^#^X>Ik4EtiFrr%&tH)GZB`hkO'TDg?6Uj\IFla7ZjDNnqGD;1qYmF.t/lI;dT5CWOY4.8@mKF&5J-nh`"E.8.k7,i_,UjaXoSslLa`5do[u/.^&7?b"@k3If8rkl-cEW05T=IjkF^gX]9CE93JT5rUeQ7[B%%>nk5tCg4F#3mFs"p0kJKA,Q/DY!!%OtMqNS;db8m5hVG;<2sF9*e#1fP^bXesj#X\O\tl*rUD2uCg\Oo)qeoG5Pk<,rq=Deila;"il-i;Wi]L7`d4c:`pDBbJ+:Jog*:ogGdM59.R&&5I71'2a^V#p5IYk*hJuYcFm[njVbWd$f9^uH1&C@MFmI2:0CS8oXA;cP[XRW?p$:]Pm25CgRl8B&q,b2.:7XF+F65@Cc`Flo!d\I0Y%GeI0S*:`*j55@$qW]T1V:%N9rn"l4qt/X84F'hj8;b0WULT<(3TBmE[;#Zs]mI4^T4*U*DVq\XsRk7i&\O='PI/gm#j[uoZ.sIfh!WW3#YS/\W^['IQP8fH!29P]g0"JL%kXXCmUnGikH4)Oh_M&Ap;^btbGdRJIm^qrQTD!#q2SMZ\21HILn\oHCEeC2]Q[\JD(R['lNeiLIcQ,_%EQje)En\jcccktFI!pG)`WHDRM"Os#rnF2kCf"TSN&OAn[7^\V#@FkT^,.p&n'c8KRq3),hu=0Gr\D]kt6h;.b-kXP19l-n#+;#P30<)hGM=dq9aVO];G^:Y.de(^3A?2B0a51%VJ5>Ck?:Ep`aV>n[?R2O":o?KGde?3(](?_0*^5;"n9cl)4+@+)HPZ-&Qb39-A*Z/7K9taIE?OT!_kiesn%NCUGs6\XS[u60&riKU3A2tTG0sq%oRQ#.;ruO1@7))tGs(^W9Onp@U>IN&%^ClqiASTYhM10<65(--%mu/,?jQs-]a'tT2zY\DM]YH+^>n`%Obp[@S2j7CGI^M#j);mpLF]ulm/HWCJ``f(es2I9]rnunRL9B>YGV_;U26\Z"T\oa?&H1LUldqdL6,njOtI(=E;f@#jTb,,\">[%VUSMSDr/-P?_dW>?[Odj7>_f-.gHS+/@4'2="jMBE])RkS`7G9"7a$6Zpu)nC6Y6j<2n<50k7"AIfKB@"UYsj^)t%'eZ'TLEqJ_O;jLUQ?.P]Ce+D"#;l9Lpeq6Z&8sLk]_')1#ABC!'H@!fSPc%)*/5i:"l%N$lX&lJWX7XRg^RR3!g;b:bSBU'gO$pa3rT'-%*BVE^>ISMKhL"^Zp0[3bPWns-UUbI/atpp'*ru?A!(]_Voj;DrX]i-TQS2_2e>ZBC8l`63d/a=RQl]$RcCI&KZ=Q\nA]^,`Q[e,jE_0NbJ+2A^[r1"/(G78`3c3TXji`ut\oap#m@?=_lIW6.md@6-aSY>WZT`g6AC$iQAtX2+b#0(W]qF3\Q27]Zl`\(!EQe"9dA99HLB6^YhnJL=jA`?k_>)nBjs.$2Z/Y`VhfjK7(/kuL4!OOLV+VgiFHA@/X&3'5eC'_VXm;^@Il2#m/EtR-cH\12=kHgm;`jj0oV5a;P:'/%Y^:V>8DVk>\EV&_+X&",IcZEJ7;L;F`P$Wm9`)$``V6R4[Q?N2EZd1=!!!!E)>EUWQO4gU3%paTC!n73#7&][d/a4I!!%i*fWeq_6H9%(c9['e7JjN66I7pV2ZG(.K>CBY6j_Eq^J'hLBI5Qp#f)K7h(\M\kLGN>jgbDr6$8k07pic'gLmZ=N4KVbaBmORekf9c>IAVb`pKJ,]A/,tkUPL6B8e3q5t93p"JI8,K0)E,]c_/mW)7S6;ab*V6>15_/tYIItpD'.5D;\BqX!=/jh-.H??T:hRk260:ub;',Iq:Hlmh2/@G]\FIPi\t,C_qtKP$&.igAaHp.3,me@Xfo_*q!mBBs4uJcgtgdZQS'k2)!qu:D,@=EF6C[saj$U][VjptmbPMOikOdKcVd2Ie>NuFQ99G5rO&nRm91t3Z*%j+^LhqD>+Vh(D;0*p2uipY!41BZY=8Qf24*Z#&Y[P8[^6^K[Q;T&PFnFnFAsT](Z!u.rcCI%@iPL;F9:*f6a[Dq3Vb*(AS#/*-ZY%J9Y[PGgM\l-TgK1Xh`Hq4BBm5W=s(WWOCOP!fSND%k2D/+9+P)qu0OTFqXs1%/iV[;%0f1n6A=K'#S%?1-WHZ^GmJ]\NA%k^`f(esl'?H)&e`Wf7uni_MJ,3T-;T:WK0DI_OcbcWJUu(82m65^qI@n,[r7VI*u#DWrriB&!2,kSV@FV-BW&PV]KA;=U8"CSr[Wt1HJ-T746&,rhS"9fY@$2^@`7Dp/R-@32K%:uBCk<45BGs\D>M\h6:4,JgWu6A,Hg(!]63H5aX<]oVp1PiBlgO;8tET+]@?Of(RhO;g8CZK093+5hRIPm8nGBe;\i9Ne#-!F0;BtGIt&p'g8]ru9"-p?<63b!B-09_ZtI^VdQOG28%Vp;(Ll7Wr$i=WR:Rs13&ilX3G$O.>ol>IlI;e3q=o^dKVhPD[E?"DffQtn2qVX`]eb??rHie0Ffl-cEoeZ5$[q1An_EotTVCY(0`6\b[B!!'5)9:%8r@\S;$Zte-kdUA.8rVga4p?eEASJsD!+Kb@gX]oBa[:[Z%R8d^-A_XS+ba=;l>p6>rko]9WkP$.8lri>ILVVH-C<Jg?[r#sjN*Ie^]$8aNZ?bO)%mQ[Y$AN`5QCZ>_1U1P5PaB(@`=4=j)3\eIChaq!oJG#SWm^MYgoaRPBCR8$d5fD2/AMZD=-F10*?J#BU@1t!<<*"-l3d?RO1at'e<C*rr-8Rq5$7WdE:;%]mH.%8*9Y#3*8n3f@(*";FoA$3;S)(]#bFEM-]NLl3=6dP@GIb!C&B^H22fDB[K0/a7M9qUsemFr)5;/pG>rhjVAj@u8'2jq::B:Fq!!!X,qtBEH2JkL$o]X/G$Yu*I2?%ZN$5L;Njr6+?.Ts(i*,=os5Z#G)ZG+Mlg0jC=obaS63"'JTQ29o#$4nRgoNH4nSFDYOp2/#@lZ$EC7mP4EP+EA6a=8(^qH,*i@t)adP'b3*:'[-Vp>D`f;t7J(Li//+lh&S6Jpr@)3F"7`^G.P:+P;V15Ka&J=!elDf8X\TdN!VE[.blddXj&&,clEBT1krquT_=PB+"c^m:HlFh=U$Pb-JCtLH/'#"pb%\Qh8lL*6mC1E65C`_4rUB=G2/Cbg:S)s]U.#(`!HP@P))@TDU`gm)h7@`m%P./Nf3a$hbEq\pn%Ug\HbAmWD;/Ti:S0haGOM,&p$]Wl:A^;#WJ<.o^G3M')\a"Iio2_'`XL<6OIO@$8tD:^qC_uj3i`oA:6_S][VVAH^V?k$<2id[7r'&NI"j/XEUMVmB_RZI.J#!brdt_F3;,\_.EaKh'A'U*e)SK0bNeKL[r7-<.C9VbAV0L&J,T&ldT')84tTQi/>.0"o_.\,*?6&R$lO*E_M'4)Nmt%,-WdHUg7cp"e?\Gp05AUE6fqXN-EBnaDs#935QCZQR.J,`cN!qF!3AIc<)iSXfqi"h5?VbYl+_H1ghGQRZ!8gP;!O+>Ve97)n7l"+=s_YF4(+*j4nPLX2>d+7P:=])8sV$=@`8\fAj1S8XF:!>;N]D(9.+jU9"3Z,V4?,:/UmiO,d\1i-pgen>,HHL!.3d4u6[`d_m^\ojiAQ!uA=4=RO14PK-B3cqCq0L(,*o.;[\CV/k\?ZNm9k*m6n`.[6'`\46zzz!%=cF+I&_0CY/"7O$A*\]:8eiON$DMc"Xr,'_;R*z!*7D)*A]B'n4bC+C&`VPjN3#Z%kKPEk/>$V^2!Zg2/8B2VFQ[gZ!JC:2jBl(Sb9$oft2CmQ6Sm0mFR-d+.a7WDr5He[VaTs=^>9;8sLm6I/3>8-U)tToF`HB\A&UBQ]]8D]mHe]Y:`b8CTCF6&eYhO?/Deo_ji`.b+*"cQ;&F^k09B-QHikle?)qVk'Y^Z(!aj,YWeUcoB2Gk=n:q41[V1K'.-8L]Q3+kYHMl`(X/ri\T,8On`.YgVG'!\a:Kf24*U*D>e"aF5(-,n&fr*#VG%lR_fQ[Z'?0q"Juf`M3S!+;Fp6Y4T84XqpR^SF`%7ULQ5Kk^RP[O&o8`Pk9W8Yo%EU]eXo2=4_brqbqbDnVDsFmA,6Rg0-%C0-fEs'2[0[;IWggWGm6\c0%c^$1hHGG%3g1aVif=>tcl;u(IH@(".=_(8'o]^dOI'hAabEnRYih^j]ip#CZ&6Ho:Q&m4\%On*KrO7:Vr_d\-gIMQFPq&'`=QSFis*`Y1D9XX,UIUC+'dY.bk#J9/*rl9@!9,31,%\o]HEDGen=b#+n!F\!&Q23sp?aA9n*J`6F6:]WHM)#X;j2Q"$`d."L6Rg+]6<;^T>+*i2VM0YqQHBXS$]s%kKhJH5@5o'baC8pX#bCg,Sb\#mbRGQdV>>DSM+6X?o6VfV*oOldcK8pF6hDZMpJ2.-"XMcX]d)JT"K=4*J\[PZcP>P51H@OCqC%C!iYDZ79BKj'#b4$RdrtVu+]+1NN3Wh7GGCP:'//=Ku>$/6SuRXh&/kSs]88l*k?RU2oAs6\XSp\XEoYMW%=^Kdi>O2UbZg[jLJ',2-kVZ/8OZ:(;#hgb[>E8e[^YF@IhIdPiHm4)u7kKK>MF6:\%A,>B*z&<52f%NRTDVnKaU4?Pa%5j9:fqMpeuSND&8B2Wb'.;mSZ['L]1DKKuBPk&LHd=7u=l(@eNnA>cW<_c2lQFiW8\$TblRf3-X2k'-K\T6ep.]8i&>1Bih9Cn@)Pr.11K*OoYd/59%p[@"+CJUK^AMi.k$Pb.uEofp\[.MW&`J]M+L)S>1hn=C29$rj%a_Gb@TRdgTldr=U=$:p(9H(935C)h\;I/BrqRtr%CY,_k>pX^J]QnR'$S+*le^[[NO0$e&ldongmb>3Hm[G@eL=rnG+$FpL9"I^RoR@:`s8IB0e8h#c'e7/prTc,Or3BhQNnS3rr[TcLYCqT;(WnN[097S_WlVSgABqbQI4OE?)B(&CAfkNa$3qCFtH@Q/Gd<0oNtPUiSjV'jjO`5*]nO]_1DjBY$ER,R5/?2S"&0`X]r36\p*ULY$AMSgU8+eIU'IsX=ibJYte54UVFSDiPUHJp$7qn;^Uo'?XI/IR;LFQ+t-<_K\SgW.lGf%cYq!m/X7hfQ?BA1pOu@GBE%i)T0.CnSW,Q,PuL^sj\i[d6u0\i/RH(l/oT16M3M'.2J2gSL_1lm/paM3GOM+;C?`SiDu&(!T:(/Z$ig8-!4pP(:am_A0:jN%pCN:F*3*^)Q)j@F.c?8I6"^1%&,66uNnr;#s`-FAhpc%#apT9M0)RCJb@1T@n*im3uH6g@d2'IbA)Sns@faVH@*W-7R^dP9(>4a[%tBt`NFVuOmkj`78Ka_=o4E^Kfq3\J[G23ZH?-UL-dADX-9lW85qfWe2B3cZDe+@%8eHDGZ-RPhkVl7;I)eo(3CQX@ml9:%9Q'^!Z0VdIuK719(`F]6nq?^G!bh7GW"jg+Hb-.3T+.]W2aBV[E@]QmGA6Iq`5HgorZ\PSkur@W,;D&(S+[VXW']&3Pg!!)@aqtBEH2JkL$o]X/G$Yu*I2?%ZN$5L;Nk*rlXUE0B9+*G51e#'X8IkFp3W.(q!rVC6K5Pt9P8]TMtH[![_^MB25;`=Tn,,q`QC=P)R32B][P$Y+p,sAq_kKY_df]q"fCI*\i-:l;c;On*8tj2I/SYbqHj0,.0Jo'RooCVjobgC;jQB=hi/LiPXL-h;uSM7usD#7=.?q^SibH$\J+_cU+!*Xq>^BkqJd&Om/rd,qIjLZRr;#pl(G:rar;,`_g/XboqJ#BQ\Q>k7+ch!.^k%Um7qs,i^2![*1T=Ku*Mom]/WUl3;SIO(m7?I\2f:T736[dHkMEn!:S'\*MMdS9QdY0fn%X;Jp9J8Q`i&j*IfJ#aRH'op$lL7iqVoJP1,H3;;l**_*MTXkX&uW9ndmRWZ;0I1mHFle&'pk4J!DK`A4Zk)!lg3=-ZcG?\(?j,S%Ek2Or9S./>qTA>IJ@qY*q=i@[],fQ7Z;f$ReGG-E[es]mp(].9!+bd`H8i(;*PA9)8&>dsi8b0%#]/*]%De4Q>VSVhYa&RNb0-e#RTQCA.o3N']h#ZY'1"UQ8)u`qT2og[3b)f2f(s_sud-l`9HjKaUVE2U.C2Mi3LObb"';+j#tVq%k&4FHGZ_-8%qpZXuqFr+\]\)YMZcDoi\Cip(D&ud\^NVW,M+PV+\po-TCY7;?-[s!0AJRIpYuZ?so!73V8Gt/aN&ne,&MI>MR`-;nI5?RLiC%zCJ_BO;:cZIc_#.SrO6\#\hWAq`/#!tAd/58!!$EgY$ANs+2d-ZO&aNXbMB[J,NbL\I/$P2HiX3I!5M5q7N$eE_s[_^?Fh5+qI\[%b7Agnh:m2>euGK(Q63iTo['ul#Ho^?E-99rMbF#70(W:jb\rL2fE1)iV8cFaN+^`\cYkXHghFE@fQb`g(j*srm'6*iuYUXoajh`j$%k\T$:_!!l5G[cO"ih+6&kDW44\.AW?!!)M'Uuu'4n9!!1q[<+)*OXj2fD.oT9\r]_ka($&i`0f%[Ju7nh<&;I2guX5aZ.#5EFs@RdWWX4K8iBM2dY3T%(pIOQr/SH%keHfd@FY>X!!%Np/LWIRi8o`8pKdT7jiL;qq\C9\.1rS_q>NJTji9S55^q!qr2m\Q_tVJA-GFr])"pr%1BRUW!!%6g%thd.S\6h&e+kYG4'64HG#`D29`LZZV#Np-i,ltG8f8FpC>:hh(pN&rTN_Br!!!#b()^[CF#.Ld^+6m_*;a.1T?;NK9De2=MAoW@1S4Jr"/Gqt!!(qWh=s'Bet,MdIbgJQ5KKn*s3=fq;LNo"@"r;M/o:K6i2kiAWaA$l!!!",eLoX&4D"DD#*\d0YGd<,J*3nHTt[l\6jBPJcDk[PSRQtk8bHj+zXG+Ju3-t8FW"%pi>Oa?^,uFW4]0(rD?dh]L@,*riGk\<)(E*8R!!"EgmWO]AhFaQO.kd]uqX=>nc.2R;`%/\>T8t#kk_eZW*<6'>!$m_3JKZgm#1T'N96h%JhL??q_a&O6,]B??rNWU$2H!_kKWc$`6X/eD&!FK8bk0X+%_a!!!#'7u+91m-rcGgii^-7W6_)2_AjE^095eL1W3DqV$2gXQnD$zHa3P)SRs[*Q+'<=NS]/o/?#bd<8([,56#Be`LX%/%KHJ/!$k^0;2/(@Dq(2b96l#op#u?ugO/kd)s#U#`j=u1s&f=%!!#PfSjc&mh0\trdG'pFa.s<\s8G%I,P=X*_9M1^Uh0<@dl9?9h!!!#-ABUB&I*X_`qQK@X>3\1ZdYi"ZD>JPLY2e,g_lG#=Z!!!!+CcliuTCc.0.Hd7j2`_3pDs(MN7!!'7!Mt`f"s)kO9hFFs:rRYt63V=DSXQXJJE_lAc-ia5IJ2\2a))Z"&K`V?7-ng!:O5>?gVNk$9reP)a:?+V^@oS]X^K1C8!!'4efX8K[9\cJWmZD21qsVM'V:8R2U1\(\j6]dFs(VQ7!!'[#VdU0if:L:::OUh>0r+L#.oT'?07Cbq6S]R(N]'?rW;[//!!!!100B.#<>rgeqc[q1rd/L&$2':=`/IbTj5%&As,I*[!!&DX3&J;"P%2Z3*AJYLs5',B>^b3KZ"@Z]j6lHWW(>Hgdf9@J!+N55iWDC<[>F,Gp\)P"lAH][M$:RhORJ6IDmGn1G"I3G;;NQ!rr<$f"h=RPPUJe/+7R*rmCW3rNZ1KpH'"[ps_2c\t]%>*<6'>Y\V#B]j,4n^[5fHdJNCM0mV8-3tfkub%WuE>4l5b!!!",O7#/[epd;nj].>R7eH[!3'*E&>";mJlZsJe6WO0Z!rr<$G%B@\4/I^M;;U?SlUC9WO%8;2?g,S3Am.X`^%885!<<*"5ggGdAJhu:Ci5!=ZK:r;Z5AYJ=1s:f!!!"^Jg\kg]$*7;]Wr+W7dn)hK@?g'DoB6Zo6KFTN?h?-r`aD\8`c4s==R1CEjZal:nHGD"#_\nFA;ET"98E%YRMaaOaQ+HBh.L(n'-2TH#"W?M.(B"T;PFAI>S933?8\LV0Z>I!!!"$[9J2*+8rKLGsNY])Qj%*SR5ECE?c7@G+\agTB/k^pBQC-+r1.Y!"cc+f)s2+k8/T2I^K)YIXX<=`JqNUDTlo7f+VG:_QKAXLT'(4zBS?jar;=GmCX;-C0E`lnU1;e00.+Hci=%GY\RYZ;.%X^W+W`#epfnd<)n4#,Hm[*5!QdHo0.WpH.AB(!!!!aNSnF]T6fs-hSi%F8*doI(4W!i`0&ZpFmiA7pXJq@E\*a<703GhJ=Us"*7efg?cn9D;%g#2elksWH&j2ROjM2bb`@$\5+d/iJ+>-WobIf5!!#P8[fSp3No-hKKb7>4qJVq$23_0&nu@Q0QriGAn^P;TTCUIH!!!!iq?$(JWAJA%nd7i#7dIh^Q@>dFc&l(b@;u(*;l3d[2,J5>mKZOZWSSNo!!!!*kiDEP;F@oAmpAJ"[/Sff=`*8SNkA8uq$aLcbFn"mSTfZPZaNR-,gXjbkOJepeVkX/!>SOne+NGAE,O&upuFEW+9`eQX@#!!'gOG5C#F3+.C0k!c?p>5rHP]Un[h8)fquaVE]YK/'RRUuKI4QgP*ZhECr?!!!e@Mt0M7U@mE@bL22UXElB#!!!"$_!VSp?h0h&rO:I;qT>9JH"d\>duU`[QrdltEldC,f)o#kWrN,"J2d%cs8>7d.DOq.dJ@d>'b-Co47^g9nK+&WYDV=l2BBR+\*>O\!!!#gRX?R!,dqCb\+Rm5b0(e[T53;#'(^hImZ>]VD?m/tD?0_;!3aU*i-sX9)jOJV@YN5+D]APVFXL^?V$%_.b"UY2[O'kg'@g;?!!!#W($rR-JFZ@mMUm8A>Lci$`?T@KlK:9(&ou2H1FYOtgXQQ,-kZL[!,TRPM[t^C7/8-K7dIhV<]*b2njoi:$r0$'apa!-ONKe+^D.T[H:nGB!!'[MW>gE-4?"^-=N$Z'p"p7[ROTt:,h?d,X>-p&V#&_.mlc,sH@#hr!!'t%o)7M@L2Bf%k=hs>>6!t\s0^!Sp&7qd.n!%$M7Xf4LT0.1!<<*"Z+0Zjo_m1lQ1$LBl]9VH^Kg_onubKW7ELouB$t)XStOGLe_;t^!!(qAA085IUts2fQAJ=(lb?_+2cF&WLhRQ`H"A>IBC($^&ZL'a#64`(r$+$\ZGj"oQ1$(6>D^p\]<6%S]^ZRsL*7Fh:0'C;Q'l`"E5Z-f#!!!#=a=+rmEt9_W6RF]*XoEQOh*QDO,C27os.oRH@4&nl32:du#64`()#LEpTmYabfN,BYgLC]kf3346]<1X*`Ci#-pTj(d*<6'>m+StokEYKN':Xp2Is]RmXWpW><%^AMMT3;d.s_!iZ0Cmte_<1d!!(ZN`qm771VSIOGIb$PR\O_SBL4:D]u]bLYM!.\@"*#eh8pmoS%JVib`lb>[4J!K0%pLhWU$*TmHe,J>sJH5`NOO0_r%..[L:qlZsCcYc"*OquSnd]?BGrk&8Ri(b>9YO_S>kR4j!!!!jgotp6Pje>Z>E@?b#LS#9-#0e=NHo(^^[Jk;HA`%/!.Z>Q!M>3;U@mE[oNr?<`A+RU9)]pa+1Ur>ol^oI!!#S%"$RAk7I._+keAUQhKt@T(Ou\\hQST@!^fq**)-Yge[8'XXetckO>;6aA8e;aR,90shVFJU9AQ7KEoe%aG%9!2?H&1a;tbm!1DU`+!!"Pp/0_+APWd1`EetMX;krfF3@3!RY=J;He(rl_j65k+c.)5E-eJ!frHHcVf(]$Ph;f7cptVb3QIrc`7#@Gh[a"Yr&DmHLL\7G;F<^mJ2CV=tVB_?'];J7Wu.5,EZ,Q<7ctAhW@S]"W@amI/Xf\Re<5X^,0jG"Rt;[/Z.mh8ZgmodHFf?[;s0Vn8H?rLn;U@fLi$S&Nq:?mf#9nR^r!'5BTZDilrHW6ol0-AaI\il^W&/ud]*!WW59k,g^b;u*":Z-L#Wr1g[%D/8nW?I?7KebqBXASsp8^'laiNIR^#ljr*)meV`2ot22=W9rBMnFQYVpCGUIYPbH6?!;NJ7d"P@I#7D18KoNhs7M/N4Arir"TSOQbrC&#W6i+a?R^6+6_dS`];_dN\6o';\mX%n]rkF@7\Ch8U\g`\5I%jp:uc/e_8kZks,*g.8Ar8:;s(C?;#.Vk7aPaT$1Dg#`@m5#&?8dN.ngdl/4[f*]6XdRM403a,$31&+)_b[M8`fiP,\]b1rn70;s0YBUZq3ER9$3DN;Fg&f5M(!Plhp[M`@&7,2CaqR:HF9X!O3V%/cE.\Ak/i3>4-n7s2J=pY>\SbkB6[][r0*`4$,JK48S(1&j\n^#M3^h0q+th\F[G;ZHdt=LCB>hc7DB8s4S/r]=ma98iO.e,Ckg1n0teoMb-ni",8$:<=9"'$D\-dXU0!)Z'QcXsoOYD4F3_Rj#1lGJiTV^Fk^:4(^S8a6-f!^=W+)AZh6C8NOBPnnX"j?H&@b"#c[]*Me"N$31&+/+k;MXR,GYb4f(2P)n1DkH&?ZT`+WE[r-6[fN8);k.,4ZVf0btnjR'Q^FgsuATr4:PKojrM<%`bro`n1q?<$Hr8'TZdp9Pkgs#efkL]]:5?6g8:/ZQ&iT-$I[HBJ?rGeMjJ&3Y^@\7.:`K^tSmgKM\<4uiH!!%O,qKi-Ljnl*s*hr>b\]YYps8$n`rlsG,-=7j4?8Qqc@^/n^%;eurD>*lEktRe]<.)mRmBdB"O":2-K7!!5:,8C$Nlf^/-emGMT3"nj[Lo4f9lRsN'35I'j!M!T2N@6"TSOQeQHnQ](/!a@OKS"n,-bAXebuc7LH?k>b?cN*:qt!Cl36n*4L@YEr7H>_:>-,S+pN\=9d/f?S]Tr3mMMEV(S(e0t>!1B@W5@M^\?OG`@-4Gnk+8p\SIX`;fDhI0brea.]bc*Ak8g2,PkB!Sr5lWRKp:IpH@AAp98:q+M-PK_qQs?'bZ\YZN8F(]/40#1('"=7o/dpSJ&Plepj#cKJnS8cS_9BV+S1nu3rVkFg^erGY!!)`B!"+^*p84B`3.mU.39UV!TLL9S'dmQ7@A6D)$[oS6!>r"TSNfU=sVTY4B8&@^jb]n"tdJQ+':'NF?Lt*uOV7Fd'<7qGT@G`+bGOI^A#_K0!!!!i5R[;WK>0g&[/R]#pY*b/V%&,5Y7`#a/j31I<<`F'5_97M#qn/XMt.l`6F?aX4/\D8;JAL,bc?CfSVas&)$gTM!$E^/]_8`']hLh6rS)hrc`*nV<8'qspiKL7X7]TJl6nC%6s&[AWTrV)7P7HGQ=C@c[RNP[o_;>s8BO^edL)S/WJujch\u.u[nMjusGk.=[BE1Y'PE)%da_HHQ`t!.`ZUFPRhrqic]ON7NI\VNk"b2Q\Z+AhrM6b08[c7J2rc!!!#&lqUAj_#YL>mn=?,1Ksgl1prS=Z>"/9n'bG8ZX`0DDqNY!B+_/QhZ*WVGVoS(SQ*&ZRS!/^[Dk0oA`k8Uc9\n[2H7KI*!.]=)F?_a's7ONY+:3lT>5u9!Z&%u1BdHpK2,a766;1@ao<;GAq+_IJAhn'O/.5.:DOE6A+AX/[g1I1WA)uos=0B%-BBiF!6"-U_l%nRQWSaErYmgXQgt?\0SX"=H;0d/r4*q^;J,^Tcu;/M"onY-;P'pb.GnV\jJC9#n)I8*Q'Y=$=m._8q%H&#Rb<0r;S??@!!#88*X.<6*k5)CmNNf-NRiTONq?.S6<3-+cWA8]"VRGl+0k39"P%pW,JFU%mH^jh#l8!Y()7JVrf+n:E?J&@"Q(a7!!@JHl/T^jjSaHWg/N+sHK8epep!A5M,P'01eU=aDdaPmq?'h`]NEGQ7^Dr$*u>:j'tljh$>%`%tTsN>e$^Gp,oC/7?[PgW\ie%]J7.!rr>Z+6u\W<5*iQ8Go7U?fc,]Oi*Pf[[Z(Nrp[]"7.lie!!!#F24UsBq>MN\nW3>"GCP*DGp,o+"AZ/FQrc2:r[UdEhU2K+!5NjKnjDMcL4m3;V#QaN>>f_o9scV:<>%j]JK+W<)Q%h-%fcT;n%N(L<;E+/+g2UE^[KEo:O+NdS1s)*P0('qrDde)!<<,dg;DjQ!Wt>/h^p,7Pp619m/403Rq^km^=U]R=#dHUb)b0j&K.EkWt,11@)$=?$rFZ68B@i$qJZ3*jch^Q7*')70$;d(Z!^TS]:jPO%fcT;V[NbsQ-oNr&[B#?s/if(K(A.[p\ff2Q1r`19uOQ9eV>\W^8d%/F5bDSe_>NQ!!%Aql1[QfG6J:uNCa)O\u:MWMOJK=%*R@Qr,9a01J*B2>B`R0[N>JL_!]tb%*@7R^%,Gp6=(nbIm7%759'`$(;;NDlJ0j!!!#',8$&8j[O&d^(X&YlUCYgXX2M_(Y+2[h_XQYn%VWn)C>cZcY"7pr?_LE!+8;TT>%FT&!2n)NqD3i95>sEWYQ+T?J.p@o_[\2h]]#W#64`(m)@TJ%kHN>,il?XrO:Y3&!baHbD%aTlmfbd]:f"K!!!#7/d-l_(EBYFqB!YcQ[#bu)2=M5pJnJfb$u!!#PTFXHNS^<9$f)b0[BM\Q\c\(Tom6`?!'l]ip/[:GrB3L(4OS^`YAC#I]tRoMpiKHK-AgFj)Rpsc=bQ'a"onXRUhSodZc`%:#^Q#4s8@'$a3"eVS)htUHAm,<,cd!^;#SZ>!!&)`)%;6,,I],Zfd#S&,Q7?m>OK6)js52DL-4^r9mnCp7ZmgfBu!(k>pqn^GLnHcC!V#PnSq@ht%p/T"t=!Z?2pi/Z/8@[r/#ljsUUr-tLJF\+N67`l9^Kjl!;r2.o.H0;[<+4!$&kou@A_pkGmhc$)!&j3CP@qH%jWfrL,5l`DRb#VSDHqJ^COO48,-R-gSspoJUK#!H!!!#OW\qh8.c7!G`8ZpY431V&Dto!0)"WWtG4o3hT_a'=!!'f8rNQ3Qo%c;m/0=&jK<;HZ)Fe9+4EdmuogUGE*5m8,D[.X6dSW)=r`u=^$+<;uOE2!!$DjY!.*1Hs_nqKS]9X&ZaY7DnFD;fVaMq2+)1CKa)E#Mr6,$!!!#&CuKrGb4k!'8Vfq;rHXBFp"p"h2It#^@Z_YAr)!'u#64aSmHM(;M"2QH64tKjIn-]NU>ql`-bNZ?0s?Ce13JAel?ohRbG@ILcGZ!3ddB-gt*M$V*_h7JcI0ebtghY=QO,oC%H6^P;dh!8*7WnAp"Uf.5a4,:%garHJ+\/n!!!#OL7,Y+.c5Lr,iKsGf3;P\4m9eN=!YWRa,+$#hameJ!,P$Sq+$\<]Fg1PT>%FTc]+"hNV)-(bF9koq&P]Cg@U6E(S',X0&I1?rI+eJ!+>1@D"1H]^!9bC*,5q8^H'[p6GJ0G!jqY/0>^6m^qRm%4!5KMtgiZKiXr8I?&F$sAk16qVq$ifq\ub'EjblT![-Tc%=7pnJ!!%O,nm$T8q5tVZM%JpdH[`/8afkZ'bjkKG`k3MH(nWsX<55mB!!$,r%_j#`^8j^o,"2:2n!mPs/&-_b:7fau=2[`&j3!Rchcg'\!3B&"#s4F@WY(C"OoDtB:/+CS?XKG>b*RpG\C/r@^ZtP/!!!"7<:m)Jb'2AA8VBY74ZL'.7EY'>YGR8(7BANI";1\75YM]@_j'Vf&X#,9rd/ljFUO.R2$=U9:eJtGK1IYRq(!3e*Aq=.g$2j+)d_Rmr0Nd3Krg19:Q6:cL`J+nfbG8L;[!:04Ac2crfBnRa,V#R$T=ntegmpA99.:3EKigIRZn#Lnm!<<,(0)YJtZ(FSe4l]Q4[EJ#UY>6#,MV(ak+24oS*R2Mg:^J7kb2*E0pBi.HKM;ETT"]LAZ=JXD-ctOmI4qebSE)[XLZEaKT-np0GO9kAS6%0d2=3:Jp(7K/+Ltb6C2if6RT)+tq02NO%@G`'2$ik9k"$ls8&.qG0[/^c?Z8GgjDMH/nS]G?ES:eniQhI@L<<8/?WN/rRG+PDZFqs/p$GpX8/@K&uJZ%d=+WV"\]o$Z12)$#1tna'?+U+aig+tLmPlX-U)K6(A4gpV(l4"1nRSOP2eI@L<<8/=q29ocqMPDZFqs)*.sg@j[d6-abP'%bljB?*3]!!":&#="arIFZ@n38Q!qF?]JEqB1S!!)gIH,]\38L:h"4,f2JS,iU\(72HL'Rb6R8_QhnrLqh-!W`"V?^ZBiWT850a)SAF1B7Esipp-&UG'q=8UIEA3_tQ[S,iU\(;G<@8G)#3,\\q)=P$-LO#$b9al9mT_kSm2,Ym`)\mdH-:uoa2?.,hm,JKS5dIooj0@!uB9K((e-d_S@io=`!0Y==>p`$JSk5+=;D%diLjbco!([l$p6ZbHGpZ,:9=5]u48*Xu!$GFWgj;N_jd@B.0@b('K%S*]!.\V-DW'mFb;2`Y+]r!?=^-%T)mA1T$hA#iH!s"E6L^BqrH7IZ$iiO*aihl.om"gHM_n"'Tm-%M"(NE`!!&2*\^0r,^.=G5'mdW54"U(;"oodV>hs"*oL52oWR/9KrR%m20E;*pjn91ZUG(%@8VLL"DGt!d@/p:jbG1\(MS;WF,SbWB#L&'RKE2'D0!Fo8&Ufcg8Lj?r+295t&I&4X\U6)??M$[T,cT/fB$RF/7i25VjH;9DC%Oi_,cT-pY\I,',7FQ;EZ$rg:%UlC,cP`E^3alo<,a$sF98WjFc-[SOHI;Aoa84Lr"r&4CL9p/J3]ea1olsgD'5VhUaE^B>oRO"jDlT]fClsgD'5Va69.lI0$9p/J3bt["2qq(rMOGjsWfbAk6-:o\gC-CE043*9Z!W[%(DJieJa&A]cfHa%BdNu(*N.#(7!(^F)YnVW&-:o\OmX3oM*ru@Xf,Yl$7piJlOp\$%;PqJuWW3#EY8;O[O1o"c,S`pWa"E6t;ulti?JQt[NkSnb,S`q8(T#)7WW3#EYNa6]7:38jP4lQK)h"!CR1oIr!W\=pZ>su$4l/!kZ;$LhLRnHSs4E)@!.\U(H)nd/QYhn]4mXgD3;G?1^ea`TCgU/%U/,#).!2+RU$7naued\%X1A6h5!2+QR4+Bus`LA,e[nGJ?(&LN'!)PdgB'7`ZOqN3A-:upNIaMUim)')/5]LiCS&;!Si?V",dGI!FMgZ!7!%:TK8=:NI#q&U^2Lj8skR0CBda!'65Q1fdfNl7*0d-=5:6MuJrT+-2r!NM/S!nGg*.9gp8_V;CouFfI!5#;Xe7I$oF-<>iD!I1jfZ+F$JDt=]k3Na#pPch\P9g*;B/]4BS*Q,b!<@<#+5RtLI8M@`qT8a,anXLY$ikh;mIgH7UG(mX8O$AP$&`:80`V32[ttLE7UOY:P'5UeNI.O>b)1Vc!!"G(Ec^j;2=D3,BdZL+6.`k34SI_8!2(V4q^:F!0C:#V4/guNfs-SQ!!"<2QSAlC0C:#V46X<j,\,.'7GEZ8_RcPFIs3C-ijeMT_1/F'4Yg]'6cH,S"cN!s!n*2euUG)C,f5&OWkR0UH.clY\^F&[%!!&\QbKS86f=XoO[@\_0g4%Rm;!^OM!'k8GXS\7GbE0@.i@!WWqB^O83sqGL.Q8l]^5b_j+𐇵a>-OI46R9V5FtGpKXsU,PJhn!2,RfU@mI.$URE7-/JCrR+Qb6!.`M`P>M^^0*il'Pgo0Vjg"RV!!&isH=kG?:\BRY-Bt;=haK1-aN\ki.fb*eT)ED-oOX^AQ2'2X4tlX/*WVk?>Hhj@bsq5)L6>Mf46*;(Rkh<[n*^8Wq#69`USBIP-)h%A6H\rQH[5YlIPButQ-gD'P#P>[om"eoBjUK=!$E`OjlKe=b/!466qJkjrNjuJfXlD/!<-'_d9[)MP4hLH(8o..`rc>2^Tqm#J,Xi1kc7*C.Uh0&eqhs?GQ7`Po^:):d2.\'<5SKXg@EmCG5qWOPb+:As66_^Y8&@_`,s,E"7u*S@di+R!8*#arFSN+/kT#ul-h?pA+/"M!8+`eoW5XKH:MuZ_NtI;kN'Y>Y6+d/>q`!IO1o:lU_8b:IfTP4>j@'g-T+VT^2B12@bi\@Gk)XNTGVpJqip;;7nG2]I6-)G^An8Q^uDcd[3"cSIJ#![`O$"Vo_7E"!'kP_.:>a$m5g;7&:6&?!5Ql`\UO-!:\9OYL6SKCQR@7`!/d>6Hd@M^N0L,I=/Soequm'KB%CO(eSF"hqFXYKMGY1skb$tY?N>Uckj?3mUG!r?W>O0&r8Q@UD?'Z[7n-P)c_'YBI6B#N`M+ki)j6PS(OOI;!5NL;1ho>K-)Dk%Mh]JKNP3XB!+>Q_jQ9b=b/!5A8kDYGDL$/"ll@ta!.1a/jJC6?QBIKVeSOm.[nG>lhHL'^:^DO-G$+CuV'I@(O+&u9p3mn[JAO$Y_4'C'`F!%G;A+0<'>7GJc\T9,"ot=Cgu!BDoL5W&-"4"OT,Dtd%0/Y%>.uWLe0fQ2?Y;u/;Ut8jrY\j!Z1lTF!#2`I"(ju/C._B%eRRU%f_]7\!".WGm$nGj)A%>).7m+ZTACG'HcHNp^u!LhqXWhX:.\'4C,\_PZZ8G"]eTQfHdSDQO,gs@PbdNNln]m[rYPWc]kcTl9m)o#6sk43;T(28Bn4Z=!gXo!P`IISaX&K<]>7I3/l!!#GrF*>h^?Ps]/r@(<8](b6iZ$4(c!#2!/o2jO['RpiI8O_EKc$D$MQP"Qd$iiPTHEtT@kR16Z.cT;*3]Hch(BAu[[OF#Ei=#UZY=0b:aSO/^6ZR5=@de^G!/P%(ba$SBUY<9tO7]AkhMpWs**K0:Ic[UO]DO>naW;Z=i5HIc].k@6=I<_O`KDuFjEpQ"OL:8\_4R;KP+-6DO8:04DD2)ZcjMp':!WWd7b2fDHQ_l67eI-:I=8@Zjmku89H^h;UWucT[6U/538)#_cCg'Y@`W8_oJ+ss1gs[meTg_Eb3**GcTYq6.9eG&2iPZS\btFSjXM?YnY?PQrFb:3%sP(#d;;,G!UoROGJ(=UorfoRor&c>I@b]XYhqWbpiTAc;*)q3q]8ph^S>SrGbdi=j-An:($Bt%pLXi@&5h@IpDlQp;@J!&Zg5W7\A!h=$!ru.os67_%02n,a%)7R&p=K4dX8Lu>nqS2hn,o]Js(UK]F8%c-:8RegD/VL90>=4*rWaKeC[3"rK>?lF6+.l=k076TKhcE#)]&S87ea#02(`rXo`mYgQ\YTA53KL2'Se7^ET=D&*I2+]XD9rJXl-<_54=6K5J-VR2tsr)b#LY'khBIJFN3DISBrDT,9uSRIs>`s?Cp&%"or&cVCu.T]1GWeZ*mgYg,IGlYIHW]a9b@9p7!<>Z6H$O\E^,IP!WZ&5GW@$@`Ndm\oq%M]1%lY&!.\P@kqAr'?cl!h0%FIkP1]Y,!!%nKm$uiq]K%24C0$L@ZH'OOMS8$Q!2-i*Ys.2\ch<@4VNmsLm.+201U;%1mkk+G.)s9N>@$RbT$^WJP-fj:DVAmgo(B9^QN.""HiG#H'nIYWF^Io7B>4EH'TW4FBmfRGXX%bi(;6TchF@VI:i`@Ek$6;[E:d/5,]1pL*Cf5Sk/H1I!WZ&kbY?nqpW;:>f=I-0h_/=S\3;,fp>-A]J.h)3C!2QU'S"(P8YOV*lof"CL=lAl!!#Wm[KC,1?h?rgbsl%LS?X:3*YAC&'(4^2';I4/-'e&X*&KbN^(:9pOtS=5pSRZA6somb.^f68POYo%KE)":(2<#9^O0U#oJNkK;V:Hl%a2r9M7j].!2($/Y\I,8Vn\8+&scLs]',skX#=dS^&J07T[Xi8DftFo.FHbbP"J;Y4oP&de;^a-HiO/2;V`]Op52D(MP-0&p6r4)DA+/db!9!ap\k\-s4I/ruqde3.f_[Z/!;JitDVj87*Z'6Y/?)%gZHnK^4#m9@pg9HB\[T41.f)2/;@2[J/e_a`h>dO`9Bhj)s4)"3o[U7C'%r__!JYGEN[UFpIBGg47PfR#7O!8(l?/mVQ9ZbV`IY$\mu0Qk:qf_[6#!8("%QEg[k:oX20(Lu%a?R*F<=?N:'u^3(;r2nV!lq?gJ*PlB?MI!/8&m/7Iq!#1R?ffAeU4?!$s>Z)1.pudk4o($8YJH,\C8EK!r2=!FPqJ'85Ok$b`N7^35!!%hPm=8?efAr+gFsf39fkJrff_ZTf!/R`"R"\sc*.<5fBeOVo'>4Uq=:omU!rr>3,o'ljZlZkjD0kQ^$NL/PSZklgc)X4+YLk-98q6ilW"#6&A+*J!!$FjMb07Ts__KQjm?71I-b<*qan7\b!!'5JH$OZeH;0I7HC)!cS_1I8qnqU9hN7d<5dA^b_W$cJVF4e59A65fI\uS4\Z96/56(\VR$k6>Xl0ZdUT`i,m:=h]0l6ZsN7`Ie!!"F5soV8h@*!!#9`0RqWm.pqn[cr,PbI"0A/NL@'G!<<*rMJUS`C!pj=oN=F/4k480o"g--Z%)BH!2,SA1NhC(c[6a]/s&\QQaI_gA(g_25Oe^R:o^YOYkak$a$u[2U_6q]DGrde51d"DpUPb#LC5PF49*;!6Ys-h!%$OnFVt^4R96dmr%UShi_F6WnnR'MIc2.E!(rM*MplQkHURLO6n5MAo"g]IX#J#saTDMCioiOJfu5TTN'tY>'fP-+TMM8317'3m>_[OUJE_pc?+H/YO;C/bfo27A,kp8Ok8_M2cjGe7IX0PoF34HiO-H--bY!X$%9#A>j[8PfH"\]Q!P@fKU#L!'j+6A(g^6\kK4(GY7TO8>WPSS+^Ur`O+am11L8'!!!"q`JSdU0D:i`qNJUf%n%lneURG]Q[@%Lh68p5pHAQW:`=3+SGhp'&7D3*V/H^Kc+#RZ+o/s!.`KM-TCLPM+`[lI\P;[omX".V""iD`;Z>3!!(Z"Bq)F-2/M]a=q6ERA17hsY2/SC7k`Y^R2u2%'EA-+d#=O1VFe8=opYW35'&0!%:A?!EpjlemUK2Yd\0)jS#.Qr,3Urq7Yui=P[T&+8Brpn6)`9H$Q[0'*/(5MTCOsg&E,&kdGu#WqCV_k]<0cC3?08rBTNPIA\[SSF+6q!!#:K[<>J\Vbmj$oZkMk)]OH'<2Vt6qnZ&Up7K&]1HRPhG8UA\5S?X]cg!]&n_ZPK+6KHaZ^Z-M1S3n'E0lC`Aus(r1%kYK!:37":@@USWQi2FG2Z'rU/,jaaY%Ejka=*%%@ro%lid@hfF9X'YAZ@=p3#bWf5).N`7#Kmeu\UO+,oGDEl$bCl*8!%!!!!kLp`^-HVIYoXS\7*>'VRUaSktc+YTWbs(9P+:\=bh!:3^b)`E1#ECo3:-XZfB_!&[DC$>=]?X;'*E0G1']2)PA@U2IiIt%FuJC8+6>/oac(HpPbi[$5g4PoNt(LFM=V#4<+i@jnnhLGCm[.LHPs3:TE!;s#SV@B)ag3195]07'Qc?"E/O-%>`#1*"V]u0('!03Y[g2$?_!!!]LbL^=tT"=9bhUDMsc:G.KYIPJ*!e#3GfB;[@V9@(f)Mu?`Z!!#hHXkf4%Hf^!eo2k[W[_0eNL$],kH*Pun7fT'%c\H"KG\b7ZXTjPX[-j-kCH"i1.M-[M?\>e`p9%_Ce^@5kq_no#V2H`ZP/B>0o0C>YF$O.7<[^uRpu/(S9bBg)0b!WW3cl'7U%Q][PsQCbKnIE'.SRqAeT0Qft@\-6Z^RBnA"EmC]4o2^p?[sIE=2%pb.S[(4l`j58GZn.r;cluJ=X1@PO)&i^VBa7DlZsC^An30+*H(12rB#SOsNclYNjrUpUTIY>H(Ms_[\cp]'HMg2fIR(T0@5P^jWXHHM$F>[?Dq3]&8/J_T%X"p=L-4=qpnQ/mZ&YFOEb>Wk*?=p?^IRHXB4r[V\f(q;_kt.b(FrkCX:/aM5B9qt=IA"q;>!=HL&jmC1uekb!1#_\%:-%F\2rEE,7K7!U(c.X>D7]2MqbEP7Aa>>bCY(14R[lNaShk"SfKttD^\HfH`)Zj9huEYp)fJE;0OahMl*oJl>Ep[<_Ru;HWaj)0IJ`^IT+Z&9c9(J'1[N8L/%=C1RPel@479WJ\RBXk?Yl>uIDT'S\15-'k13$DH"?jJn_rjV4aO23Yp+0fldi1FpsG,bh]6P2Y.O*_n\c(G%NIHHhRr?.KZ>6PIs]oN!!"EV?[hf^R':UOEl-R>jpJH@@uid=\110S@DiQFj4.4bEpQ"btVFX#1*4J[O5=,pu-umrUeQqGJj'!nA,?b!BK[fGf3?CTcMG6s=C_.SPpKc*!8;#U7`g\RphIkJ7hJo,r[2r8f>br=Omc)VHis0=_RIs8-ednVtVruh`p3pWjo9q(G,[K$:-MGdV]>1p2m'>ME\lDq*0G1^53A4p0-X&c?HhK^JBF-g0Ug#U8=kKK>-L?67(#Clb<;ps!ArpsR9L5d9>5()E[(L;.Yjd1b3LC>&@kb3dGpu74d]>^U>Q\P%:-qs?in[gV\Y\624^c'UE4]o:X9ifHY?nnbldkl52/Ce0N&/c3H@oWa$kn'g]4"IiGMdhXT#'$^?XKKnL%)WNM\e%lbKC9S8[tn@G7+BN5`uDZ=;[pP)qS>9c#_2o(M:Q=NJ8l/bX"$tc92'te":sOW@^:[0dYpGq3^rRfe=NrhS&*DH`jmR]R9J0GNZ_&D;)A$SSu:A2S:'MfM=^,,lakuh1ls'H@q1r2a6N*UW/<7)b.e$A&a2d5&=Zld\U/qfY.%9Hbp(:A7T63?P6u0!tRMu9URZdW`@7BA)o6.s.aNHj2[41qsCl1"TA>smt])Q/R'!.,s3

.'eQ@7'`j$eksu7D[=Kan^.-)\4iFhL+Xk[t[[3?bUp_0&#I:ec5[M&O#X!"'8cN<>`Xa4nR+ce#.uKZ<+59*BSEQ'3;X:STiosj%R@F%@]4j2JLU8`2=lXV#3G@rR\g`'rJ#/%>Kr!k$QUbjQ,B,HKh72*H][$f3dFLIJ^t3VVc<-rpALOF1C$[)hs2&bZooFIX'lCScAZOeC<":^AI?aYJ3:$r:@,)o#emXmtNR$G4""?^O[CfGjn-<>nl^&ii6j!ZtN=iZ=UXkm@&OHT$P19l05\7IX?q,dOg\%hn%+9,I4F+860h;6/ds7-+de>ZC0M_DdMp\FL6?a!G.;W#3:\$m@X!.^fqUIU@p!\qWXpLDdk[)r\r'*i=:W[L:[s;bsC=RY0q<,6$]LIl!GM[UXrjuV!M>rj'R@+p>mUr,:-NC)"G;j?jYi+^DjSZX'NJE?SI!^86eQ;QJKb)qSY5nV'!#3+#\TPCH?fI#T%%$5;b"HT_>j$_uT6`uNR6A]sOlr9Mb2YJ*'tW`NMPjb+:BaF?,W;gU;"/m,>#s0Pr?55=%rkF@`ce^C9e_c=U0&)ZLsL/GWrc'f/+oME@3'Bd-QT84FFDHu]/bm?\ZY_M'j^e-J"%R[P-ab8rfmPV6CX;l1W(#O`>)GoGMI3&l06s8\,H0r$X`/jl-g#HR$O%]jH2shEm$%5VbZX7\T>`I'aqbT;7P@hGRpDZmcX:Ms6.)`^AI,hO2;nS2/:X#2r5Cc]):/&IdtAn_dh-&CY/KN?J;Vl_tQCpk&VBH'L[]Q6RPh-Ua,]-HIJiWUq%$?49C:KC%p+J*-iB_M*BH#sl<[Vjpt-g0B=kC9'cH1E8J>S?2AE%AsNJ,E[RqUbXHd1*rp?,(je!tRLJgl:4imW\J6GSid=Da!'VRr6s>2hVhk9q$1?"W)iO+*5X\>Fb%@%/&TF$8ZK8"qrX+Q%-9\TUl**e>l[>J--:[>e+mbs,$d+O:XTfTDpG3,]?.A`jOE)>HM):YiVX@5!%KdK'0lUZY+M2o&'E:b:i24XW-]baX<]cn.a-`HgeXLX&c>VS;,(gHhZq3n(nhh)]m?']2\9Vk3["J9[L9)G$DJ3@H/`+FAg;J/U-\ceGoRL6o8;eJ>uVMk+@g;E8>j+XT_5E_H!@#NVmc2!!!"Bm,<^AId*\qp;WEio('YR\o?WF]s7+,;l?49qWS/ZT*52p5`o3R@)7EK&h]5nf)PdNT[74^B@#:tE-^f^"onW'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!#h(r-pIZG=_~>endstream +endobj +5 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceGray /Decode [ 0 1 ] /Filter [ /ASCII85Decode /FlateDecode ] /Height 720 /Length 259 + /Subtype /Image /Type /XObject /Width 1280 +>> +stream +Gb"0;JH,ZM!5fq/lendstream +endobj +6 0 obj +<< +/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.253ae350afbc3672e8aef3555dcc1a77 4 0 R +>> +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +7 0 obj +<< +/PageMode /UseNone /Pages 9 0 R /Type /Catalog +>> +endobj +8 0 obj +<< +/Author (\(anonymous\)) /CreationDate (D:20260717095702+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260717095702+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False +>> +endobj +9 0 obj +<< +/Count 1 /Kids [ 6 0 R ] /Type /Pages +>> +endobj +10 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1002 +>> +stream +Gatm9>uR4X'Re<2\1aCM7rc:HqI]\p[bB,\SNcg8#gl`c9>F=%IIFHmTeTnTLEoMFkM1-Eh7]-V_2C4d8Ik5=K#9AOPX.,1.QdaZ"e8&7hZMRVI18dT"Co[RpI(Y\&"pQS+IREK32XbO)$?m51.b0>SZj.VjMe(CdZ4sjGoiVD+OVYI&[NZP>$o3Yj%=MWk"(.$"SA4'uijgYET<"gXgB?,Tj7dVB"Fo4Xad^P-2]79CN3jc!:S\6#%q"gFa4_Be\/9*T)oEU6UY:mUfTE_M5r5scl\4q\7o.;%3I7=8)[NLSRS9bR10o/,N?ZbFd9MT59N`rPkbVO[.!rPR\2LMDG37$p>q_S8q3\nM&qEB;pp?0pbduP(^ih%k#?>=YnVFHK/J,?emth?P`=jrDR!=ZgP>O.:G@E)p0gFjSeBt-$%01m#YFQ?q:!Q'!)1:k:WN.>NSP*T>d7.f2ID&,V1N39V0gKee2DWbjsrjCV:/8/n.1MYh8"ZtSd)>0?Tqp*E\NW"-dFm9a5kr3]l;a&hMaiMIC4NI)`E1_u`b=1sH7CDIQHJYijldon.YD);o6I5P?PMp%D&"dY3S%+C1/e3NKHaK[D~>endstream +endobj +xref +0 11 +0000000000 65535 f +0000000073 00000 n +0000000114 00000 n +0000000221 00000 n +0000000333 00000 n +0000039218 00000 n +0000039685 00000 n +0000039942 00000 n +0000040010 00000 n +0000040293 00000 n +0000040352 00000 n +trailer +<< +/ID +[<37f7b2c8d61186c024371bd040624667><37f7b2c8d61186c024371bd040624667>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 8 0 R +/Root 7 0 R +/Size 11 +>> +startxref +41446 +%%EOF diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt new file mode 100644 index 0000000..635f2d3 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt @@ -0,0 +1,46 @@ +############################## +Sub-module: Summary +------------------------------ +Name: Total Cycles +Description: cycles use by kernel +Value: 10,608,946.19(Kcycles) +------------------------------ +Name: AP busy Duty +Description: average AP busy duty of total cycles +Value: 15.14% +############################## +Sub-module: ISU Statistics +------------------------------ +Name: ISU stall cycles layout +Description: ISU stall cycles layout +Value: { + "data": { + "wsm_stall": 38700923661.67748, + "vls_pipeline_stall": 4588363494.652634, + "vls_wdata_stall": 72671888.53685898, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717095614/ISU_stall_cycles_layout20260717095701860.png" +} +############################## +Sub-module: GPU Throughput Statistics +------------------------------ +Name: AP MTE Duty ratio +Description: MTE Duty ratio relative to AP active +Value: 38.53% +------------------------------ +Name: AP STE Duty ratio +Description: STE Duty ratio relative to AP active +Value: 1.13% +------------------------------ +Name: AP MMA Duty ratio +Description: MMA Duty ratio relative to AP active +Value: 20.09% +------------------------------ +Name: VLS Duty ratio +Description: VLS Duty ratio relative to AP active +Value: 0.0% +------------------------------ +Name: L2C Duty ratio +Description: L2C Duty ratio relative to L2C active +Value: 1.28% \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt.csv b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt.csv new file mode 100644 index 0000000..e2333a4 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt.csv @@ -0,0 +1,17 @@ +Name,Description,Value +Total Cycles,cycles use by kernel,"10,608,946.19(Kcycles)" +AP busy Duty,average AP busy duty of total cycles,15.14% +ISU stall cycles layout,ISU stall cycles layout,"{ + ""data"": { + ""wsm_stall"": 38700923661.67748, + ""vls_pipeline_stall"": 4588363494.652634, + ""vls_wdata_stall"": 72671888.53685898, + ""valu_stall"": 0.0 + }, + ""filename"": ""/opt/mcProfiler-ubuntu18.04/output20260717095614/ISU_stall_cycles_layout20260717095701860.png"" +}" +AP MTE Duty ratio,MTE Duty ratio relative to AP active,38.53% +AP STE Duty ratio,STE Duty ratio relative to AP active,1.13% +AP MMA Duty ratio,MMA Duty ratio relative to AP active,20.09% +VLS Duty ratio,VLS Duty ratio relative to AP active,0.0% +L2C Duty ratio,L2C Duty ratio relative to L2C active,1.28% diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt.json new file mode 100644 index 0000000..a0f2195 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report.txt.json @@ -0,0 +1,56 @@ +{ + "Summary": [ + { + "name": "Total Cycles", + "description": "cycles use by kernel", + "value": "10,608,946.19(Kcycles)" + }, + { + "name": "AP busy Duty", + "description": "average AP busy duty of total cycles", + "value": "15.14%" + } + ], + "ISU Statistics": [ + { + "name": "ISU stall cycles layout", + "description": "ISU stall cycles layout", + "value": { + "data": { + "wsm_stall": 38700923661.67748, + "vls_pipeline_stall": 4588363494.652634, + "vls_wdata_stall": 72671888.53685898, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717095614/ISU_stall_cycles_layout20260717095701860.png" + } + } + ], + "GPU Throughput Statistics": [ + { + "name": "AP MTE Duty ratio", + "description": "MTE Duty ratio relative to AP active", + "value": "38.53%" + }, + { + "name": "AP STE Duty ratio", + "description": "STE Duty ratio relative to AP active", + "value": "1.13%" + }, + { + "name": "AP MMA Duty ratio", + "description": "MMA Duty ratio relative to AP active", + "value": "20.09%" + }, + { + "name": "VLS Duty ratio", + "description": "VLS Duty ratio relative to AP active", + "value": "0.0%" + }, + { + "name": "L2C Duty ratio", + "description": "L2C Duty ratio relative to L2C active", + "value": "1.28%" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report_dumped_result.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report_dumped_result.json new file mode 100644 index 0000000..7369b89 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report_dumped_result.json @@ -0,0 +1,61 @@ +{ + "Summary": [ + { + "data": 10608946.191, + "isError": false, + "message": "", + "name": "Total Cycles" + }, + { + "data": 15.135929941488758, + "isError": false, + "message": "", + "name": "AP busy Duty" + } + ], + "ISU Statistics": [ + { + "data": { + "wsm_stall": 38700923661.67748, + "vls_pipeline_stall": 4588363494.652634, + "vls_wdata_stall": 72671888.53685898, + "valu_stall": 0.0 + }, + "isError": false, + "message": "", + "name": "ISU stall cycles layout" + } + ], + "GPU Throughput Statistics": [ + { + "data": 38.52569057861815, + "isError": false, + "message": "", + "name": "AP MTE Duty ratio" + }, + { + "data": 1.132475785840243, + "isError": false, + "message": "", + "name": "AP STE Duty ratio" + }, + { + "data": 20.086120535236283, + "isError": false, + "message": "", + "name": "AP MMA Duty ratio" + }, + { + "data": 0.0, + "isError": false, + "message": "", + "name": "VLS Duty ratio" + }, + { + "data": 1.2824190669417963, + "isError": false, + "message": "", + "name": "L2C Duty ratio" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report_js.html b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report_js.html new file mode 100644 index 0000000..98f90db --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_duty/report_js.html @@ -0,0 +1,25 @@ + +

+

+
+ Sub-module: Summary +
+

+
+
+
+

+
+ Sub-module: ISU Statistics +
+

+
+
+
+

+
+ Sub-module: GPU Throughput Statistics +
+

+
+
\ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt new file mode 100644 index 0000000..0b97887 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt @@ -0,0 +1,64 @@ +############################## +Sub-module: Summary +------------------------------ +Name: Total Cycles +Description: cycles use by kernel +Value: 52,126.52(Kcycles) +------------------------------ +Name: AP busy Duty +Description: average AP busy duty of total cycles +Value: 99.20% +############################## +Sub-module: ISU Statistics +------------------------------ +Name: ISU stall cycles layout +Description: ISU stall cycles layout +Value: { + "data": { + "wsm_stall": 1262460507.897436, + "vls_pipeline_stall": 150175218.87179488, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717094852/ISU_stall_cycles_layout20260717094940634.png" +} +############################## +Sub-module: Memory Statistics +------------------------------ +Name: VL1 Hit Rate +Description: hit rate of all instructions in all VL1s +Value: 87.31% +------------------------------ +Name: L2C Hit Rate +Description: hit rate of all instructions in all L2Cs +Value: 97.50% +------------------------------ +Name: Global Memory Read bytes +Description: bytes read from global memory +Value: 310,784,000.0byte +------------------------------ +Name: Global Memory Write bytes +Description: bytes write from global memory +Value: 134,217,728.0byte +############################## +Sub-module: Workgroup Memory +------------------------------ +Name: shared memory access efficiency +Description: Proportion of NON-CONFLICT access +Value: 74.04% +############################## +Sub-module: Occupancy +------------------------------ +Name: Achieved waves +Description: number of achieved waves +Value: 32,768.0 +------------------------------ +Name: Dispatched waves +Description: number of dispatched waves +Value: 32,768.0 +############################## +Sub-module: GPU Throughput Statistics +------------------------------ +Name: AP MMA Duty ratio +Description: MMA Duty ratio relative to AP active +Value: 20.13% \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv new file mode 100644 index 0000000..d256b5f --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv @@ -0,0 +1,20 @@ +Name,Description,Value +Total Cycles,cycles use by kernel,"52,126.52(Kcycles)" +AP busy Duty,average AP busy duty of total cycles,99.20% +ISU stall cycles layout,ISU stall cycles layout,"{ + ""data"": { + ""wsm_stall"": 1262460507.897436, + ""vls_pipeline_stall"": 150175218.87179488, + ""vls_wdata_stall"": 2097152.0, + ""valu_stall"": 0.0 + }, + ""filename"": ""/opt/mcProfiler-ubuntu18.04/output20260717094852/ISU_stall_cycles_layout20260717094940634.png"" +}" +VL1 Hit Rate,hit rate of all instructions in all VL1s,87.31% +L2C Hit Rate,hit rate of all instructions in all L2Cs,97.50% +Global Memory Read bytes,bytes read from global memory,"310,784,000.0byte" +Global Memory Write bytes,bytes write from global memory,"134,217,728.0byte" +shared memory access efficiency,Proportion of NON-CONFLICT access,74.04% +Achieved waves,number of achieved waves,"32,768.0" +Dispatched waves,number of dispatched waves,"32,768.0" +AP MMA Duty ratio,MMA Duty ratio relative to AP active,20.13% diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json new file mode 100644 index 0000000..9232daa --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json @@ -0,0 +1,77 @@ +{ + "Summary": [ + { + "name": "Total Cycles", + "description": "cycles use by kernel", + "value": "52,126.52(Kcycles)" + }, + { + "name": "AP busy Duty", + "description": "average AP busy duty of total cycles", + "value": "99.20%" + } + ], + "ISU Statistics": [ + { + "name": "ISU stall cycles layout", + "description": "ISU stall cycles layout", + "value": { + "data": { + "wsm_stall": 1262460507.897436, + "vls_pipeline_stall": 150175218.87179488, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717094852/ISU_stall_cycles_layout20260717094940634.png" + } + } + ], + "Memory Statistics": [ + { + "name": "VL1 Hit Rate", + "description": "hit rate of all instructions in all VL1s", + "value": "87.31%" + }, + { + "name": "L2C Hit Rate", + "description": "hit rate of all instructions in all L2Cs", + "value": "97.50%" + }, + { + "name": "Global Memory Read bytes", + "description": "bytes read from global memory", + "value": "310,784,000.0byte" + }, + { + "name": "Global Memory Write bytes", + "description": "bytes write from global memory", + "value": "134,217,728.0byte" + } + ], + "Workgroup Memory": [ + { + "name": "shared memory access efficiency", + "description": "Proportion of NON-CONFLICT access", + "value": "74.04%" + } + ], + "Occupancy": [ + { + "name": "Achieved waves", + "description": "number of achieved waves", + "value": "32,768.0" + }, + { + "name": "Dispatched waves", + "description": "number of dispatched waves", + "value": "32,768.0" + } + ], + "GPU Throughput Statistics": [ + { + "name": "AP MMA Duty ratio", + "description": "MMA Duty ratio relative to AP active", + "value": "20.13%" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json new file mode 100644 index 0000000..49ebcc0 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/1_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json @@ -0,0 +1,85 @@ +{ + "Summary": [ + { + "data": 52126.522, + "isError": false, + "message": "", + "name": "Total Cycles" + }, + { + "data": 99.19535586893751, + "isError": false, + "message": "", + "name": "AP busy Duty" + } + ], + "ISU Statistics": [ + { + "data": { + "wsm_stall": 1262460507.897436, + "vls_pipeline_stall": 150175218.87179488, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "isError": false, + "message": "", + "name": "ISU stall cycles layout" + } + ], + "Memory Statistics": [ + { + "data": 87.3124639353722, + "isError": false, + "message": "", + "name": "VL1 Hit Rate" + }, + { + "data": 97.4977129027295, + "isError": false, + "message": "", + "name": "L2C Hit Rate" + }, + { + "data": 310784000.0, + "isError": false, + "message": "", + "name": "Global Memory Read bytes" + }, + { + "data": 134217728.0, + "isError": false, + "message": "", + "name": "Global Memory Write bytes" + } + ], + "Workgroup Memory": [ + { + "data": 74.03632462257644, + "isError": false, + "message": "", + "name": "shared memory access efficiency" + } + ], + "Occupancy": [ + { + "data": 32768.0, + "isError": false, + "message": "", + "name": "Achieved waves" + }, + { + "data": 32768.0, + "isError": false, + "message": "", + "name": "Dispatched waves" + } + ], + "GPU Throughput Statistics": [ + { + "data": 20.128644256109645, + "isError": false, + "message": "", + "name": "AP MMA Duty ratio" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt new file mode 100644 index 0000000..a864f2f --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt @@ -0,0 +1,64 @@ +############################## +Sub-module: Summary +------------------------------ +Name: Total Cycles +Description: cycles use by kernel +Value: 51,958.49(Kcycles) +------------------------------ +Name: AP busy Duty +Description: average AP busy duty of total cycles +Value: 99.38% +############################## +Sub-module: ISU Statistics +------------------------------ +Name: ISU stall cycles layout +Description: ISU stall cycles layout +Value: { + "data": { + "wsm_stall": 1230591385.6, + "vls_pipeline_stall": 149673826.46153846, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717094852/ISU_stall_cycles_layout20260717094940987.png" +} +############################## +Sub-module: Memory Statistics +------------------------------ +Name: VL1 Hit Rate +Description: hit rate of all instructions in all VL1s +Value: 87.31% +------------------------------ +Name: L2C Hit Rate +Description: hit rate of all instructions in all L2Cs +Value: 97.50% +------------------------------ +Name: Global Memory Read bytes +Description: bytes read from global memory +Value: 310,771,712.0byte +------------------------------ +Name: Global Memory Write bytes +Description: bytes write from global memory +Value: 134,217,728.0byte +############################## +Sub-module: Workgroup Memory +------------------------------ +Name: shared memory access efficiency +Description: Proportion of NON-CONFLICT access +Value: 74.04% +############################## +Sub-module: Occupancy +------------------------------ +Name: Achieved waves +Description: number of achieved waves +Value: 32,768.0 +------------------------------ +Name: Dispatched waves +Description: number of dispatched waves +Value: 32,768.0 +############################## +Sub-module: GPU Throughput Statistics +------------------------------ +Name: AP MMA Duty ratio +Description: MMA Duty ratio relative to AP active +Value: 20.15% \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv new file mode 100644 index 0000000..68b714d --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.csv @@ -0,0 +1,20 @@ +Name,Description,Value +Total Cycles,cycles use by kernel,"51,958.49(Kcycles)" +AP busy Duty,average AP busy duty of total cycles,99.38% +ISU stall cycles layout,ISU stall cycles layout,"{ + ""data"": { + ""wsm_stall"": 1230591385.6, + ""vls_pipeline_stall"": 149673826.46153846, + ""vls_wdata_stall"": 2097152.0, + ""valu_stall"": 0.0 + }, + ""filename"": ""/opt/mcProfiler-ubuntu18.04/output20260717094852/ISU_stall_cycles_layout20260717094940987.png"" +}" +VL1 Hit Rate,hit rate of all instructions in all VL1s,87.31% +L2C Hit Rate,hit rate of all instructions in all L2Cs,97.50% +Global Memory Read bytes,bytes read from global memory,"310,771,712.0byte" +Global Memory Write bytes,bytes write from global memory,"134,217,728.0byte" +shared memory access efficiency,Proportion of NON-CONFLICT access,74.04% +Achieved waves,number of achieved waves,"32,768.0" +Dispatched waves,number of dispatched waves,"32,768.0" +AP MMA Duty ratio,MMA Duty ratio relative to AP active,20.15% diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json new file mode 100644 index 0000000..9343417 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel.txt.json @@ -0,0 +1,77 @@ +{ + "Summary": [ + { + "name": "Total Cycles", + "description": "cycles use by kernel", + "value": "51,958.49(Kcycles)" + }, + { + "name": "AP busy Duty", + "description": "average AP busy duty of total cycles", + "value": "99.38%" + } + ], + "ISU Statistics": [ + { + "name": "ISU stall cycles layout", + "description": "ISU stall cycles layout", + "value": { + "data": { + "wsm_stall": 1230591385.6, + "vls_pipeline_stall": 149673826.46153846, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717094852/ISU_stall_cycles_layout20260717094940987.png" + } + } + ], + "Memory Statistics": [ + { + "name": "VL1 Hit Rate", + "description": "hit rate of all instructions in all VL1s", + "value": "87.31%" + }, + { + "name": "L2C Hit Rate", + "description": "hit rate of all instructions in all L2Cs", + "value": "97.50%" + }, + { + "name": "Global Memory Read bytes", + "description": "bytes read from global memory", + "value": "310,771,712.0byte" + }, + { + "name": "Global Memory Write bytes", + "description": "bytes write from global memory", + "value": "134,217,728.0byte" + } + ], + "Workgroup Memory": [ + { + "name": "shared memory access efficiency", + "description": "Proportion of NON-CONFLICT access", + "value": "74.04%" + } + ], + "Occupancy": [ + { + "name": "Achieved waves", + "description": "number of achieved waves", + "value": "32,768.0" + }, + { + "name": "Dispatched waves", + "description": "number of dispatched waves", + "value": "32,768.0" + } + ], + "GPU Throughput Statistics": [ + { + "name": "AP MMA Duty ratio", + "description": "MMA Duty ratio relative to AP active", + "value": "20.15%" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json new file mode 100644 index 0000000..11c6ebb --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/2_packed_kernel_dense_softmax_cleanup_v12_kernel_dumped_result.json @@ -0,0 +1,85 @@ +{ + "Summary": [ + { + "data": 51958.493, + "isError": false, + "message": "", + "name": "Total Cycles" + }, + { + "data": 99.38365225488738, + "isError": false, + "message": "", + "name": "AP busy Duty" + } + ], + "ISU Statistics": [ + { + "data": { + "wsm_stall": 1230591385.6, + "vls_pipeline_stall": 149673826.46153846, + "vls_wdata_stall": 2097152.0, + "valu_stall": 0.0 + }, + "isError": false, + "message": "", + "name": "ISU stall cycles layout" + } + ], + "Memory Statistics": [ + { + "data": 87.3124639353722, + "isError": false, + "message": "", + "name": "VL1 Hit Rate" + }, + { + "data": 97.49779064403101, + "isError": false, + "message": "", + "name": "L2C Hit Rate" + }, + { + "data": 310771712.0, + "isError": false, + "message": "", + "name": "Global Memory Read bytes" + }, + { + "data": 134217728.0, + "isError": false, + "message": "", + "name": "Global Memory Write bytes" + } + ], + "Workgroup Memory": [ + { + "data": 74.03632462257644, + "isError": false, + "message": "", + "name": "shared memory access efficiency" + } + ], + "Occupancy": [ + { + "data": 32768.0, + "isError": false, + "message": "", + "name": "Achieved waves" + }, + { + "data": 32768.0, + "isError": false, + "message": "", + "name": "Dispatched waves" + } + ], + "GPU Throughput Statistics": [ + { + "data": 20.147546446579675, + "isError": false, + "message": "", + "name": "AP MMA Duty ratio" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940283.png b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940283.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6e93052a1e9cbe81b7a1e6b81e5f6b13d8018d GIT binary patch literal 40387 zcmeFZWmuJ47X`Wv3=}yk7^DhFNl6I^s7Onvq=SV zKUzJ8RN)Ukdr@_JB`ZUFCp}vOjEtVWwYinOxykbzjs~`NCRUc5temV|cWxNl+gsc5 zv$0wHUoT*_vNdA+N4cp2E^^jd;;9`5L#&7XKb9_>W`e=Qu}eOFsO%g&H{|55wEp+U zGQH$xBDU$c!D1DKHzC9OGiTo4cz^3&-lz1k-1qOtR_t_^{vH?A8XZ0-fAYm5U8RpA zL+ITKr;yd%WW}89E5Y&O!+Tc0E)Bk;m8RaAK z{_jg~9|g?u|GvB;cI?c5U#VXsxbfdt&-DKP7ykd-a}*2z-v-5~{-w*84GR0#hTRs! zhI#eAo$NE`S$!1u`g*yTKN;4Sh+K7s?-&O2x5cXHy9Vzq%l@3gVzK!7 z(h(lI%LF$LOz=3Y>kdAR5xqtHWF#f*N^QvPCy|NWIhtnMD-(o-giNdIrly&a8Sqcu zzw6FCz+j%4oIQJ%e=624fccO%!>~EpQdn0?>b+PXRgUZW4CB3f>IDS_WL(Db_|8A@ z(59=C%^GFaNw9GE4_-kh$?v+BPUXJzu-L3e_Tt5hnTpu=JL|J)MC3eW++*)aneFRI z)zVG7G6{)^)pj@L*JrZwq=F5bB5%etr#j4bQ*M5FcbWe8A8Q6azH+TR2PSHdwV(=n z{HL}y`TFnQjklKm^jA7rMd>>(3})OE@lAJ}?6Oz^8*_j8^Q}0 zR6kr{SzBpjYh?Gs>B|^*gFS#F=G{ea*ww$V zA&D-llO}M%OtrlDhF0DeKmV~9{_=El&@PaS$2`5WQ+Xe*DkUYQSm#T`?XvP>$gWlJ z{oA)~V}Zh~lCaKjT9ck!?VZUOD=zzKd2Z8AiPOYXot+s5`I= zOvk$|D9ra4hsDNbqdVa7`1kMMXSVHnu6L<9OoXYKet&zB>CT-_`ULk+Ng{7%-cWnW zA0F(}N%9UmCtFs|^XxA-P@4{vSm5o{ax}1%0*=OeTg$<;b?o-&-3NQy6%*l_odx>h z%~71<#DZ%dgF`~NO>ilM29-NAS;hJd7d-Zs8=|>Pf?;1_pA?eCd~~2HjHaB2-Tx5D zq3?V1mwK_O3f`k5O^%oL`oo70#TJLF{ORMJzo{1)2mP_zFB+_#mvFc zZhep9hu6Vs!rj)sB9oAd|NJBGdRXBwdtUO#RDzf1?@jw#yhHXO?THUx-QAp+oDAP~ z(9=t5FR{=Z`}={7wTcb0{><6498@mjL3bMhCpfyx!~?xVa3w7b6wd_Ia#zTI&-E7iHKC>Pl zMoe5>$|An!Guq7dJJfVN=pq`idUd||r9XAp(*9zzEI>i*)P0_BRxPo7znhx{V@g>v z#%r26OiWCE|NPnJb5%!u($4?=dmL=j8bnis?1Te<+|F8u9Jlk*GoLqaq=P+o@br8X z7yKy&N}BknoJWsc_f1OhI@r!$g;H1sSP0MlrP^cH6mB6UC)cxBbC}Da|HHU7UXYCa z*#jTm<9sURq!bj{S9P2p3Lowj0y<$)LaD<1pa-@mIVic{JSMJ@ot$6GWs%xfBlMRrrNurPqs z40x}BrDmxm%l;yYCx3EY*~Krb0TAN3u*{kD9$n$F)<2L;ZQD}`c^^Oi1HhLKZ*pC2 z<_&bKf|FokWRwJ?3Z~uPna$&OUP`q5vit+5zcJUB%UpK12p(e129m_;5u!w3HjS-_mxO2m^#~hnkp_;JG7-ATYP)VCQa(qXeCS zO^!zKTDv&4BvW5@3e-2n1>SoCPb@It#{+(%Z31gNB0iwnRip|oN#~NlgN4$DIiGBzLoGl%8&3ZHi+rvhB>Cz`Y zyUA%N392=o`?4C-l+404TYt}?G7qWT?$D!6|E5mC^~tMKL`9Hu1_lOUE(;|V15(rx zDNs_Ra5jhgvRsdrlxd`anzURw%7h{)RB=lOXeWa^KZ%}`q^oa54+B}DBPl6q5FjHZ zg@Xm)T9iRII01*hQ4x0XR`1P@tZo}2C9bR+RvYVs@|TAxlH9X z=FiK-!Xo1|X!8aDF_3)Q8Cb~ z0dDZd0D-B3b%G(44Tz0B?OHrB?9Gxk?4cr@4wv=l11La``S|#DAP?8~H%De;?ONJv z|2-ic7tgue}4?oDuY-8z3lyoa+EvLtmTiP%qu}bCH?20 z#JrjV4OGkl^P~f3ao7*T?yE9_0NtkjMH!~u*%=?$s?|@NI^V|GdOx{6Sv<>abDE& z(Y#igM1!IN4?s!XxX*pIP*#m(3P6nu5HN~h)uxq1Z}lan&aJI|Ktypbzv$XYNMvS13t_1Hqn4b8 zP3*MSvs81KsuqDj@xUuBxlC~1&kzxDKYH}Y56BKVxArQ#{f(7TdiK&Im{jPKVFz)+|y+}o6`B+r+`c#}#{BoaBLKq(_9bNtO zNKMVf>(@;r?gD=_x#p`kJ~c&7e1FONB00I)YhPb7LDx0*a28F&wYk2+wQEqGhbo=O zgW;lvp~IVS{#ajwvlJfd z;eVP7QUF&r`tqFL(vmgJ{riJxWgLc0*Yp9aeD$vVfc^3V0O&KurM$a%>C*G>-@jk0 za@*wb++XkMsIG~ztoUWzmiRDgH&rgdlFO{S=?oAWjS_Q{rbv#l(1bpSH)Dyrw`F6U zzcmzo{_MBASTmBYlooLD+BIYJa%WiP`G`i9$+E#gt+8-TOO8*UKKcFpDWTt+uO|kI z;pQ*rnT)jG6hI(a$$+$T&pB4!{M8F>;io*yHzz+S;P!Y3 zBA!hFN*OvH>ncNDhx<}bo+$6{tTzXoz+kLZ)ld8bZ=gpC>lbA54|1#f$y0KX><@u9 z+FPY_evFJ{0FAId+Y>SCT*uDkv17kJ*Vi%ISVM5`%1~==_`CAR zDM<8#u#?HF+K2`wc4)jb`qi{IKdCQ>NmN!gKR@XJbAK z1X8F_d_qDVz-NYbr6b{)Gi{?^Uj@4P*MGR0B_2qXshSi0NJOOTvw<`$1s^&UmV(N| z-fFAbix(-To#{y+hZs0G3f7k45^+nbmK~|hCc5Mpj8hT@(&xeT*88h|u#7ZVpD9G1 zVM7Mjn+udUNa#G2zd-Ah09N{f?*9e2Gq7B&-pw`V(Zo+O0fP@|oWOw^DRx;kgu6>x zRjr3pxy==XR2#xRvR2OBh04CaF<_+1Ahq1>thXpys+Di>n=IEHN(>&^gwd! zJr)xqixY6-fzUH(N)SFQTcsShG5(5Jh#lSd@#DwWfYIH}tz6(Ag9tMaQj!EY6RmfR zj{FaRUl?;M2UNqmtkqk8m8e#M_mKIMar5KH>?WHyAkhK86kK)D^A`5`>3VKsn+k;Y z*FxGMF7?3d6 zl0+QFe_s4gX+TLd1@=qE@%(X={)Z1AkT?KzP$K8G?EGxdXumsO+Gto9w?d(ypfJ;0 zkPH&%h9pXRuq~ikq|MElOX9xyoI`3`k}mlx(%A5QGuZ5CcDX1=jd8ne%;65J>2bgVRkBoNfIF*!1_eQY&=t}C z?9{wG%~DzE2v)&~@=AOBt;(TXC~H8qm}qE3z!XT@S;HsS*4ADYGJ>yweFuW(vHsDA z!K5<~K7fOY4FW0(o|h+7Usb#Z_%J?5=nPl6Mey-(aw=WFejQYpH{#w9ulUp$OQxRN zk+A{;4a-W>DvI#38d?DQ)rjh`@q1SP(~$tDEF~zk*lr3x`1M?<3Zw~F)>-Ou@r(^ zqpxiF51qeogi~KGye1M-j z;YKd+ZZ7sf8F2sIa}rZ~899v@>mMjmfsQB=5D)~XfSfl4|LyZYqmJPZz|YQfg_(iU zJTNoWD_AvLfc+?axXKm|W&z41@IG;h*1#a)(E$OgXeEJfsQ`rmVWYUSXE{_sxfu=I zxB|I*WZb3g4Sth=q{4%^6tq}?&{8(*$%UXOTm#BE z1I0=RU*O{6a^zqoixacxR%=Oz-%)^C*;V7^H8C*}x1n`d1Ohfkr%D6W%iD7C*^sSU zDGjM9DbpnbmK^|sDUf$2f4=#E8;j%a(W0qi4-hy2_*ApEUpvct^B8!x|2qoUW`;U; zbaPX1xHRC(HXUApQDA`q^-P6IG}|F3tO5vJ?7qFy5kCf=o}#L1cz3RL)`-_()stgo z)_)##WhjZmo-sR3$_Z^hMwkWAaRssS*`BGou~%EoyBOs?nO&uH7!lkNaq6j=`O z3m$BZrFjfz(xi0B2y}iDVonN6;fHn)!n7lg$Zm5 z97LELKbZx@!pu-*X@%3G=Wl=ZfbzM|jiDbuCW1LiDdet>zywaHtIS4UlCDykO|#_5 z*RNlJ2FXKI&`AO%>Vo}Jo-F?R_itx~gPAt?Zms~u++fD@#kE|Hck0f53Y4-Fc(;8E z-xOj-J#bt_Zkv`KfV`yJ60~7{GjND;$eKh16rlZ^WS|GoW>Qj8>{VTN1@Q53qF1$3 z0)=)YU@JSou>MV9cFlL#V^e#`dCVV6BXtaueutF$GBIG=9wRO7W5g+tRNLBeE;ep| z1i>SOUxw=_0_#}=mn0Ly9~P@yq=OZSQ?NL^b3NkD(@*Glp{0d->Ma_XzL}b%oim_E$fti)o zbRY*BLJijKaJauYTQQs4f%c+HMJ;a09pbVBoTD|^6=qge+2A55K!kCN%AgT)S+y(D zMc!O!5DW(g0+2Zi@ID$WG8-CxIV`*`ScA4j z^bY=xjmcFG-@;(xYf%RR6B~AsMr^u)+Uri7tm`dA=aK`3G7TETP2d@$1)Oq`^AGVA zHcJ5jheKXlV|8RC;xtm=YM4YFUjkDsqS>&+qI4*gMYCi&Ey0uDa>p3lJ9ubQWHk#o z&b3{ZyPpKf7si(gh9r1-$t6}JxnS*N!2>{w01gEUZI553qotkpI@}#$6kpoc*3pSy zsNS_?QO|z>rL#SlP8#`aV3$A@F)%VR8~)GD)fbL|ITb3oQMZ%S3BD8EJ@p({5@?dB2QAY9Y zU>uFp z_?MO4qhVn9iS)D$n5pDYBCrj6v$}_Ofd?5LIrEHl?C13Xti-@1@*f?2mJA5-!)e4r zZL$jJ`pCx@DOl`vPz7LfFoYNZNikTV=5&}*rs3l1l#r7XW}St!J}*iCWj~Hq|A*go zY>g)n2|tZu)9e5K`>zJ>5BOJZ*R^Rqv>$MO+@JuS>-T*&FlgxkMWs}ohEiV)SeIXZK6^4Cy%-#) zAL{iqEw-a3$&u^Ov%fVK=r0?`e;pVOY%jMTbKVzRFCcc5KCYv~AGnG>FmL+(`*7g2 zF?zAj95mqUG56j9|IGq-61cUrPq(i98z7p-f4{$jzc)&X6CB5Qe~vtk`aX$|kmWxF z-c^{+0j0nu*wT!LKsYgCNb%PyTl5$4;SI@@(qskk6)%T>FfD??piYeJPt22IqgE#U;mpZ@FsZjpA(TCY6p)b_3AXSB~VEjVR-!a1r^n=vtM=RZEE zU84!@+e!x7_oa9eM2-AKBHLDO0h)6H3hc zJ|P|l{vp)J{WXy3N9HwzdX&By;P35MLpmE~)}q3T;OU67Rjmbsk*t$Cw^xZefzXCP zWw%9eQwz1@BeWf(K&0CC_ngMaB_cx&<6is!)`N&}Q&w|#{~`p1*#jtAw4hrFavv%e zDrQ4lUEn*YUl7KuHq)i1+Xbvcw+a#f8#n@I4gPHu!f=bhG6mpjUC1p1t{J||iE7iO zOP9F34&19C9udC$ej+LqV+U1249e0D$O+h?+f~r(g^>e!$o=ZQ6=_L2nqL@XnBRsaw9eawl9hz1)!^) z(6g3_y{90Xrlk1m%va#Ep)P`86u^tYx;DU~?)D6DvYy$znp||EyMlLsLBZ>kK^@pb zjLv{DnAYS9b`B7QinVHBdw8T@KzQRl8pP;RvDmmJ2c&ZVY7qG|h!2U1$^c}H;41-R z5H($)y`M=Z9Zs>SLAw8?aSR#_N-$Bu4ZaAYxoW{ zGJ+)kS~Uotyu+3f<#KXEH!o7k!b2NF&wOGN3-cKPIh2pDg z_*$>ja%c^@(O_;tM_UHm7*pW$QBx!&BIJhnPxgZ44uo5T)V4e|c&^ikHFWZi+btsYLt;~{ubZq;ZC=on%H%y@ibYzSv zQx{r|2qAHk;IZ-4r^O}}ECMvH5qeMo4Miyli8g49BKt3Xc}klKBpN7c7M6G@F)3h5 zh=4Wr*t-7En+e04~Z6?@T zSulQN`+MpyiU|Cb zAr7}I2NP*W2W49Xl}$=gQUR(08W)1q08I;b8HV1c^tmC_2Le@r_?lp;^4;GBU`kDR z5`!tN3aCd)P3<+P4~!de8Z@00US0!ROyA@pj}fHNKokNsnFc!_T z=L9*l?sd571w}RshALbJJO4nl7vgt5ROvko1IeN}oeGc_4&Y)MLsuQB=%*h6l$x$h zFm+@P&S3@^S^Uu8N5g~@_U^A}4XePjmB)vx~B0n0XmN{rH z^?y@QT%LQ*Flv};Z#4WXgdPojKtlVktgfzuG?@mP)-hOaN0%{}unDzY1)ytx_=;4F+XF}IcLru%Z2Q?^*twwaL zU`&cJfzx(e0{mJ0pj~Shj1bxbVVVImlg(qVcRCLZ070;#-YXyh6S({}dsYWrEt3?G zhlub%O|l1n1}RnSVma8@Xv%hd(d$qXUXMd87N`$$S0TfZ8+_!&A#!3p38BqQLzDcd z^*Xnya+FCqqL|R11U`cWi_~ncw*Vb^BS|oLDLFcx+Xkp>j@nh-dAfOhg+|n+K|k;? zx+#w)QfUDm5E(>mN;J9wO(0S23VWa}AEczq^pURzu3;7w>4qvpW#!PxmbfgWumONv zNB=#&HXb4uzP(@g?CWumb#%9HhsW~BM)`Z9wxSoA*Wp@ql}~yl+@MJ(Y~M# zF_>`0dUdDJ;8{bCj59yX3_;W40X}bYaU>5^KMZxrqAmtnJ|s}alX4ei#zKH~gQtgv zR%T$Zq6_+5a{LC=nETC!Fi_!mG|4}#_wDsrGy*G?<{d5$Edw+e3SzHMzkDeoUeGNQ z`XE?QErVap&7fAg*1)+}GuD3Kbgv|26}VwQ%%k&|dxHOgg?AwI1LUDg?+IggQo@_i zxpjc}QFGmlXuvaQhg-;Q^+K1MnNMZ{-;N2f~+wgCi{V3=CY0puxP+v{+V=a-aI&EcOR3%&Iy`N_;-D6Qoy| zYktzDHGXVle{n4sek%;Ly?>K6lJ(h~i(xXXzvqj0B?Ldz|+k5x)Ou z&QmyY7nY!V#BaR`?rHl5jFU`TtLps{E<9&XTPgqMU~j5Gm%5ozxg`Ost5=ZqZR*{5 z=3uhWxz8>#U5+zfO1{i~?30qJ9epd@`1K4UtLmeeT{l{0}`T|Fj z6%UmP=(esX^m|gp?7j*q?lRu9jRM51j5CY&50hcJu6E|K1)}cGZHpv zR4Co0DPc1uvECB)wvH!rgg}wt*=zzZc8xhAW~y$iGrg z-A(=Lx~*&9Bt=-gWmjoj0&D%DqHPGRxcsl_+8ARdN&jmINp(`;IYvC|t^0KRG3=_Sx`R-8t#sa0O{cDma3r=SRyw z{1~p3zCEB+Y&@mM5+Ix{@|3_(d_~Gr;1sK{NdJb&FPY#^Gt&NUQq8O((K_Gk_26y} zN2{i#OPexTm?UZLi~XeX&cst7r}UQjse~X}MjA?z}ye}>u%C87aTJ`9IWl5xe=jp;p20%sJIIl z%oZc+O^@=PuWQ?>!bcZwCr(<*w&&LI!Aea$3r~$k-PKaWeGVQNTvlxErZadp`%rP- z@#v18uhIUf55p0ARIxrCvFgnmU%Ov8rtbTSv6eKX0z1C3E3N1su2^Z7;wXa6Bx;t0 zy}1)`^e)`Le)l~pJ!`6;Mr2zsJ~eD8psi%UwDu-h;H+B12H`M^YgA1I9ut1x5V#Iw z%Qw(6pIzS;m2Ezt5!KD^OT(UhQ!hjnZ!op$5a^L5Wm!la7QGq9e?B65J?!|)rlWhk zMEBbI()CV!eS5}Z$E4$!0VzogWrG#_@wR3yQCtbNlw}f!;;x=zPYjlf<>*cB6etmw zB>4#HcTBZE8?uhnk?4l>K0VQ9w-O-5Jj_(iJ*}X4vZNwd;a}J}zat1p_`LcoTu8k{ zTsKczl_z=s$ppKAcTI0$%J>x>ks13}od!k9#sBuf=S#eak7kf`@_O;O*yhvgUq3(2 z>GkNGySH_j2E+Wc<)+Cpt;w$}#Sm#JF#?`N=Dv*Q(E7|c%E>$jc1~SRHClW~n50xQ z6T85LgRc*d8DFTQLt&hyD969J0js*Ha`YfyNRA$ae?aN;TKBh;9yNM3@B4oDnDsGW znj^~Pb|xh8n-N%6UdgEuI+YB4M<#e00~CJVJ?e#1>BEr;i6bRx?=64r^7Rt*x{J1GcM&X1`cUlI_2GD9(NjZZ@=K zfH#~%Z;;O*d>^-C-lZd>StRWiI2lEG+URQw$+HpbXH{$43>k)I89g;vRW-$v$1$Tu z=oubh85}Ftwxd0w?^>m87>&nJp0*ri*D@4;Aev$sBt*{GWl6v8`oz@5r|%v3(R4?L zLInOp^fD^o*IWcX#So2_^a@ov|r!)JJopXwXmjSPdk1&pEwK4pa ztHFX}_f{c;01d`t;Gh`SWR~JOB~=CSsAcX5?Yz;O2o7rJ!+%hBOWT#20iyOPj6O6! z{`}&usuZ;j9ryH2?Hxbmyeza9@0g>rE`3_VtIgIjoQgdw-W2dss+P?AN}HRHA)pr#~AP7 z=Hy{9chKd%IaTH7ItOYNapdPNg=zw(USNt6DXI!riDhGnr_I?-f06vLg;&z?4T{;? z>z@#y8@3ub-6i4EcAYPco7tSX^;;W6&l9oI!d{4{G}2b`K3I_jm%)OVyiy%|5OiQA_3DLlLAn2H&DLdy~| zTp{1Tl+h;%&`UlC%`NYG%HK?Fb-Lzld-HFa0*-&M0YAnllU;LX$I)c-5&nGyHjy1= zz%vtc5VhYXEdi!vR<9?o~eE{ZjbIidEttH?G}L~cxp)@jaj@Ib;}NuD`>Z`a1HNn=$OBjX^L8lPQ#24=dJs%H?@!SiI# z1DblcAm@`~z76-zVX3Jrwem;QhC4GptBJkeFpfs~# zjo*gUON19<>gLWYooHF=CyREBu#NTduyFC}qZ;DU$KveH$vioQ@wP%BS9{vLKO*U2 z9!vY=eiW>MR??9?B53JO-NkJ2B%*4Sq?x#DpzI~Q#v(J^3Pumi0;o{hDKo+(jpro@SI=S`B zZ<+&+$6l$#)D5MoxycJtXL@$$tpY6g#}`OF-4?Z!Ai#KYTTj4Sul6RyqtnVH+Pw>b z8+wig^G7yob|ic1l4jZb`jrOi?);2KhkG$Y9mg;qQI@l7yPKBe!lqujFabfyz#HSw zjrl|MW_Ar%EWqZtJ8LQUF~cm4wc~4(dua_122<^eVi{UG5xH<^O0>Xo-Cz zB211kez3y8N7TCKDRnP28U3@aMy|LHOu*`X4TGWX+fT{7)O%z!bCdaeAS{^txG^>* zexpnkImWSygfH*A#tVwuI?Q)Y^xM5w=*D0U>yO^G<#>mBT<-mMEu?>Ccf!Z+Mu|`iCSGFcm)t&WW}ScbOiSBAMTFUS%Q+do z%|COGw0SMc43?&?>)KU7qVeuEv)*MdTdsWPS{2x-i-VXlE?jd?8El))*sIQM~5;D^oKmG|~zYoz@SZ-@RphUq?v z%r|#N93Gc`Db;{@hYhkcx=L{4w~6u)K_bu;pvdYLFh1jpXATWlGDf!+hN*~ zv@CnIQh)M2ZB;S**EvA{Snk<9`%{?OlWfg>sd8$I+ybZM@c>ajMy?%8sujin1;lVcq4kl3z%OJ64^^E_r8;X1#FZ#Y0(Mdwi~>oQx*F9rmb5>@x{MnXzq)c3^AtUUI?#QT-vTI~0`3c&y%1k4 zE1*;e=ocCALE_Nxr0BG6{a9!$wYg)cR4EUmHnDrj(S9kP>4E4E?XVNJZ2v|H9ORfY z0qd>(h?_AwA3Ptg27HgCtmhK8t_b+!PIm2nADNihs%^jbs z39ko$4UUeatg}ZOKe8=-6AB=b>!V!ZbQJ9&BcI3EmYgmWo~R{ZbYSgzyA^NPutdlz zLbm&hAFQOK9Fb+NMa0y(uu9y{q34O?o)7nnoc)K_nX7|2>17^rlQX8aQWEBN{C(YU zg{nW7 z<+j~0wZV9A9(@RbUO{~hH&oaSPjcs`(d;7s&Va!C1)I3%;#HZ6(f*-3eId4!DG5u? z$z>0YwHK=tPs!N6Ruf!+MX8kf%+{W`h%ME%yu-NSTf)e=T|J_c@-*f>*X9rFs$TlX zrJf0Cb>*y*ielAC4PMM`vudxM$M?TgY29om3v)`iKzb_v;F)mY`h!%eZQJBN4j7=K zLt!QRx174vxUTv`3$+J<8;>BjR>Z6SC9HNN*c{)`JZ|BZNH7Z(vQh9U5p_e zu1FidSG`uym`e7?u`6I}cB3xfId_JsQtK%?nxqmc#|$-*Hx=DB(-n^YW?nMySSSj< z_=@;2I8UJRRHi3MMDlP;KHr++IE_a56$3|-y!9d9eOIG)R=7XLT2ag97{>beh(&K6 zariukz^TzIzJ(G#jLU>3Z3SyWG0nLjeJNEwewp{v=~xbos_~H(p|-e#YmR&QqA={q z#d-P0q^{jKsYcEs!x|+QQQznvy~X!3)XkJ)$=r0>qN?eXKe?5ZS(XSruz~Vs}1f|UBb#%xvYvGdOmlJ4N+LgI>akn za8^~U`nSTth__IG>-F=9BsasHjsv7x;K7eb^1Q*akPS^b()*fYj^Yd>^T+A!PJ9hIh`x;0eAt=pFLh|=Tskml#z{4 zUYoj+p?_$PJ9Htaqe@SEMAg32bfz$QE1UN!Z9dfvOl=loA2;xUFLs;dX4Hl z^^kDVbO)l!Pa?7h?#l6t&lkJi?9N70)}@u7#~;Y`Ften!A()j2zScpES#opnk@eqq zjw5{kwD4><>F~@gK0D6PYAEn_I1=T;0@Dj_srH1{Hj_7hZS;%~2^0p-)Vk@z4a&P)tjDFdU7ZjIgj(YLTZd>`Gehz)9gt)T|tm_n0>$N zd?|kaYf^*Y;-+A|tBFZc_ngzrgOa4YJfg1AaId%q_Va?pi4UyuSQK5Wlc;PiRP_lz zZqDQjaLcKYZn4J)>7HA&b1$$x9E@`QktpwwqqOoxVPqV?Pb6v(-%T}{$(IlcJ}a8dAfuzx zysBz)%b_3gKWkF@sp+yt$->@EIdR)Vja!K#EN`yR^M$FsFqVB(@SMgxlghB8$zPQ4 zY(73yHEo!vZ{XUoo36FX`HtgT!=VPc@=yo`sq>U{{`~UNg#$N1pj5Lytrla?0P^#i zw_GL&hP2>dZN;Bmglq!1T-7oeMm~DoRy(z5X#iH`!fTb2ga4#LO);69bFZp7$h)+( zl6q`sG*iBr{Ceuuos(vNsM2W-dN6J9i+#p~m}gX|QMiY@YPMmr zF-Zc|N~rPXh?ZEtfrR$#J+9^8eD9w@?P+O@C<)-+B1a_Kfb>+_J@zhfbE_19pT{W}IRB}onPa$|G ztKEL*!JmgbL}r)M3EmA0%yZ^A5^GbAw9Z}goG8dUkT>*f#}k9Q(2RJcXZ^%ou7yIP z-%JcV0)(R-O*$v?6^bB2&7(_a^A008&z;Zdol-6>3rU;3IMud6WANb%rMQ;qKMpI6 ze?6jDDSvU3kh|>tpxUnY{jnFCmvQ3JME=0Iy`-p@qo*iqm@N4QkEjZnaobl-KOcSiS}bvMbI*!Lz0?yYli}RwL_4%ckXRVAP01!vqw-V2Dym;ETCQdHD=+o!OHn}XQ+x}l7i&Ys_< zb`aQoHpKbFa zQ_O-RZ3OF-(HLl>NUK?o$($$MHkv$e#dCv zqY-Dx?Bh0j>y&e7^fNU>g&H>~$YChHY!>KIENQn;BN247x>%nJ2z}rAx^b2xneD4L z-Jj7|d^f1wtG4egY82m3qOa31o}Scg3V21RanUI&cgUrnkK+cu!ftl4u+)G3FLSdBSVQ*&sOlJ2ej|ty(!$-tVw+Gb0fQo472l+V11!8G)2s?p_cKQFV{hg zu=3paAtT0n>ge*b6MO=pvGMTawZZ1Bz8Kd^kM-QP={UirfPZa!!-KKcr7tx@1<7Xz zdhSh!%%05%ItcUpJ8u{;RZn$_dC1C)%KA9uk3k0}Db&v$#nYYlXf1rK5lP}T{j~Hn zp_sq|^1Z`}9Id1-?ptozxcA4QKSKDE(S9b1TD=4?_lTA?Mit+cjM+3om*+Z7kf?Td z?wITCHNBi>a5)HDYUN@Si=3zQj_!cc?iu6ta#7UDf$xMH@%HA|lEY`YsH#e9;`=zP zuiSR8c`9mt=J@~7-h2OJ`Tmdp=Vhcw5)qMxWRwxIM+1?)_bM_XdnH{BlvyHMB6}9H zbCstQq3oTC>`~bnpT}|be7)Z9?{D8f;N9)^ygj*`*Lfbt<9Mv&aUADy$6SO_<1)s>v{R!;0UW^reJ=4qf zGzX0d*dSW09r+!S%&)d#p9jvS?k%I`{DOUf>$-Htt3II-0{?kGtK~DeJkYY~$Ztqf zwBJ5sgHHk)-tdz$2ljatWS?{= z%c>`H?`_#O${$~?ds_ZMFwUJ06PH5Wd%6sZk@&Qod_gJ<6VY&u5vP^)Nu)M4ZTfRp z?E}ktz;~pfm_M5VR4ku*a_7ms;}_Oln@zgrH$u(860TGFI-hpGij^v$dinHF_YQV~`J1^kY%zKxPM@`S#Sd;AYV(76`mW6lJZHpL zK%W+`*cIZ78V9hgE8cML6BXw!i=19DXXn`sMp-ks*iao~Vu)s~e=8)b_sW@Pt!L#( zq2jP&=M~iQY`mVMyJ?XZghD5tppzZn{20GKJ?dnUw@8-e(}H0~`2MYWM$45%lND#R z0fR5l@*^Egv)Tdl+X7^mdL&ZWrD2nV?2V(D2g!#2X}y!=T$VK)Q*~@h8d~1S1}je| z_*f`+!X_$YzXr{G9#i!;NJa~Essyj6gH!AxhkvrdwMwk9mvaUg)kNDfb_d z%|}UANOH_*RnDg%hsHaeoj_6+KS1!&f7M9aQE^Y*wviZE)66Z8k$8~Du4xZ3Qz{*k z&jf#vbWiP?q)X;$$K<>>)jL4{nSR#?kxNGFS)zN!q6J`|jCj7Nj}h1iC)=6eK6-!s zzm>*4V-jn-znTZC$J!S5UjCn}lR?1~HmRgo$%dPpzwi5{3S~w=($+(~%t#iB);p*} zjh-@KF4Bd=7-l|R(se^`Vw7h0NC6wjVsw+0ZffAJC@3+FRFYZhza>c$jqB15Y=IZz zfsyJqWlcgjS@GNM#_-O2Lj|A;a)OtY)B5P)cK7qdVC0M{zCT>f7>j2oC-Df96nZ?s%QgPR0nqu ziVON(Bj4lE(;w9dBOWtIb~PzbMJ!q`{=xnL<}VwXUT0qf40^!)0G@#s3m2#r)MI7M z${afGsfN${ANKsux@WONxY4Hbe4-PVFhv z-0AN(Uw$A zW2qF#s68MQCe&>{1ht5UrD%1`()eIvd7ivDzs79r0 zI0I8!qMMt`E?>6#AD=EgqH{Ddj)t z8p;q`IRlb%NowocO@X0(KEw|&Vh&v?=^$WDf+~UE@p|o6l?|#c!Kp~oPjoZJnV@&D znFQ%g=DOEr0Lw`YidDulgtbfNORrdq$BogYdJ`V@t@wlnQ$;Hif?YkJG5!&E>4{OC zsHzhyq0gcKhDlJLY*Ygy8<|IH5cdOWEHFKS3{9TWmB7QYEU&h6t-SlHA}nQz7i9bl zj^D8x3y7Eo{jxu>Nwvz=jYYpM64vLKDFR8SnueI|=pYhEZAeiC1L4(yfcgMvk2v`r zISX<@S?Bxj-g!eRpm{`^}1@{pa^!6m)Vj{w1xa!A5a+9muF4`~kB9_>~b<GIT!Ll- z#NjmTouAJ~1ecwX`Z&W)V!6yJh^-2Mh~+avAxSAb5BUmQx#3DnG7@c^%)_lMX@4ex zoVblFURP3aoAA2ji!F9Nz4qWV zcxlCuCjRvD=g-ud%^qoy)oq#KCMuom4R{Y0OH@JP%@%>pT*e75|DaYxb$Jua_j{Lc zah-uBju9c6S6K<{1X$NY${b^B|CW9~Q#BaV$VsC$vR|6Xp`K0~4In0I-mjVw%ZFM( z1hAfGw6+e`WP@k#WSCg-6y+5w4;@<7Lp=4x%R80iqnKtak+2!^%e;*xxZ;d?Z0e4u(nl}8EjMaem+ZaK0;--P@VMD#D&N{fF!+d&!i zZ@U#IJwBdHeG%qF(QnIQBOMOx=HCGdV@U1~qg3x0F!Ur^&-Ke`Upj#G5Zd zCRph#7vArC8$_scaZx~{kGN+b?uBTFIo~sdD@&a`pQnP^D(18)H zAS=5y{@13MzV*siHKKPTZMWG^*zEu-EPM=WEVS4bo`q_`jI-%I9|!>xd)X{@kd(yA zE^3LAY|PxIe%RyhxMBtlPdVp-(Z8b_I!9IrY+x{X!D3z*3}Kd4rZoN>4gMw3@C{Fp1YxiR4; zyd1sSzH|^HHNw`SBPT4lvF4vKdW)wWl8f^8t%H0Q{9r3@|DyyO)Ich{fwnT!+k_`q z#A@n#1q%0NTni7U< zc8v6|r!UUTJ%Qi-Tf52Q@nSqA%zM$jl&)P_l6 zSQz#q*i$G?Ex)DmI4lQtMAR5)vKS^1ZF~oi+>XA=SU65r%p1(CMmTe&!|^knjjjS+CoOdooq$ zeQ$R?%)&_8uQG~*1TaH-wmq@#f9agok95zkm=~dRt}X9uyVcwqkEYsLgu1T%jbDxV=Xi3-~u!F5la;Ju=4(f z{?yEA`hAJSink7SK0glF z?5EP5@+I85a-cos*v3gJEDvpCsOZ91%CQkEFFkXDo%o%_3k%2k<5;xp$0;_3=IZmu zXfS=W@82cwCe)Kpwtda55yk2XZx-1e%GR+TCqF!E%?>(=R*#4#vuc+q4qJM@Qeh=j z9COZociba4+MTf4?A-mE5^Khv2P?pY={(r`A?%ovezv-Ban%=Ni%cdGNPfs0IbS{y z6vaZ=X_zv!FvB?V?R^zgk}aCtC8hliVJF@Nng4s}LAgY6V1-B|*@AB&y@hYxJK}*}%_Q(f%B1gB6{Fg)dlP`LxT>N0C z*}wC<3Vhg|P^6?w>8JELzj<(Jbgui5uM@W4T~PQ78gemwEL&tjJp|7VCAm+^o)hoNpubt0mTF645U7(_fTOiX2i9dtp$X)al2kEk$B+cWJ@mH zbZotlv#$(P7g*t$r|@S=MAds7A#qeVQZIy5m@Iuuv32%6h0QfET4Kda_-(*vEYQvM zQjA(A%U1Ef?&%9AjL@qRc3_V9*aUXiaLW{d(O|r{H&13^%(_m6w?BwA3HC0MFX&U1 zzyOg{@KJj7#DrUHjt0_ZiB@asVm?k|vGFfOop_o!0E0+#&rF*(4(c5c9o)t@pif`+Gjalx;#Q?Ru5jkE-O7S8; z6WU()g5Y*+0e6g^_zjL8i`60{))iMbSzuM?@*FR88`>~Z`UukheMx>Aw`v9F&+$&M zUa`{KEJ4{@Of@z6NvZVAvA6XPFrRZwI-sqm|H{GOA`CN)l0+7^t$8(n_=`nPy*=im zVtWXDh#@6%B&U9XIr!TT1+vdGOz{502#oD99t{H_O>&{ zy$P$v`u->E`X5kh`EONHVNcK=6c?IqP@>>j&SRKdp>N%5X~Vpz4s0RX`fuz>{41Wi ziN!=RtT>3FfUv4GxKrj;Uh*zzPDqC`+(Q5FePAIX;O)biZEmc?(Yr@)mq8rkPGS~l z*WWEQBTU!G$X2Nmo0!NN^rjpa-k9i(zKoBCOT^8>=D_p(mGPs;0=tNEtA85OA$_b4 z4~~vwwl+S5rPS{Rg@xUj80_ju+`Jx0lIl9tIdi`2BMmtz9qps-{@aS`@X1?5IhPFy zN*}$!mURtln#a(c=hi_ec>GnCEih&;7D?T#a=Ze>h#mTIg#p6+Ze$K7pSB5GN2<9m zl0Uv4Wwmfi#?lk*XzixA^ul0IUGD+1ovVRtS!NQgham`NQ=s*W%1GvMl?L&iM^BPi^!&n_iSB& zXhoR_Zr$?K8_--!7W{jm7_=Y%-X6$h{w)YHS-pYz4+zBhAFjigCHvni7Y-}JV=a&8 zBbmH;IstmH^C~)Q^2uA|75-jD1J3HNhxq?~fXsgSZ>x~3EKgaT-MIGOu@Se}2Mvv$ zD3sON$!wuNCCp`*j?)EBB|0DjZ_7mv z%n-eYMLI>s=A}n_xd6VAe>maka#anRI;DiwAK zcQ>@?LEV}sB>(vz->$Z_vzrF$wbWA=0?~A1L=pEXR!FLFX#!GlJQ+HJJ~t#suD}>~ z1v+`u7VxfF@trE9Cx4%ycGux6K5SQcq~AZA5bR!}#Q5-Mt6huPODVDX8P=QyLTylg z_IzoF;k{fwpeqn0fHs%E?B#y4i2WO;_3p+AA_)^qNb9%$69ZA?#r#d!kvjbiz@pjj zAZTFzMmH6IlM~1Aj-$Ff_NDu|;yqMvaYhp@m%Mc$H2$Pm(cCv}ZdfrZZVwF&_nMrA zr6^%%4ntWk1>aF|ywV|tW_%TTF2wU?dG}CF7E2;zZj%v3@wi$jWN`>K$ts7(Z_!{+ z{$^M|%8o+q0KH!zS5F`%;PUBtc?Q2wp~c~sFdLSSuc3LJLVsIO-q=lrIpV?9?6>iw zmoFFuq12k;cj2M++q-z-5JL?d2;3o|E64Q_0u&S`;^2AR3ecN{``s_}pxy;L)KWd! z1H8zIdUy()Mr#2T+XbH4X$7dTLH>w_EYgw@H12iA&00Go&wn#przyb@_`ZeKaZY*K zycYqG1)}|gq+edhLUSN9NKZ=2Jkez~>uCveH307hs%rK(>xKA{qIp#_rI= zJKl7=uJpejj<2H!uin|?iZp}o@0E=ec9gwF8ash^pnvSN;R~&2woqjDfe9!^x_s^~ zn}bz4 zbNJ7cuMjoeC&L;3H^PkHy{C4U1wV-O%#qt(p4OXk*a8hMS4Vw5?H5`{P%p4s9T{ig z$c%-Uz1RlfRzEq$+Ys22i`)7JZO1JF=@yb7`p_W`Ie-n?gG7wDjXa8O2u*^1?2xS& zHHIBlwmQ4V^L{8=cuS4KzoO8!aJa1CAevKQhjSe34^T?3O76tA?#TUwssL`|3wvTq z^X(z~l|PQxMiN2|srEwE*+mGXu(}__D4#Jon3{X^4r~;H*EcL2wfMAMg{)A^b&ukI z-sREj8Swo8n);0N@Y^?l{1?QamqeAW5=sk63=>3qNtUEC>cm?2Mf(nOXfxQClw|2h%3@VT!3HV(8Ss@1YU)Noypou zPW5f(*n$BX7ac(;OA(tGCW>=zNp+7CNWSG-Z}{Psqd zzRrMY2B67}W$qEPDP(-urGve$#dJI)Ap%GfxheTH7VxE4W zD~}aQxUj7G^-gBjer5*T>|>FJ`cT4YIeAjT)Sy&&DEiwc^UHRze%3kQaaz@v?jJVm zuX=)>X^uw=(QnpoJF6AcP$x$^f;@7v1132lZ>g&c1T<|Aez{}wy7m#$##}f*d z7!Qr&yN_ivAaJg~%5g$&iy6OZGVhVwtb;j)sCf%KVo6`*AxCK-hiTZ;JP$nXZ^*CmKx%MqPkt}Ku2#@4QDLzxRc~nsZwjuJCoA;uMASR%M zT)RV03PaWu{aL(^d}ReD3PXvyXqHTB#)r`OV(R(y8-g#vx)>^F&nY&M|7YFEd8S+b z(O>Hz<#j%w*4p-Zf$p-3hmxMWefzQxR*B*=GPlu<45D^fh=H`tZ=)2hxo5&}_xz!J zz%>FmA)&8ltG@bgx$VX@W&IzM!C$B7->`Ozw&L9h91w8GFFyPPZXJzI>?2(r4A8nv z+3SQiS-0!$U6H5^ko11MhQ_j#8#LJz;fZ^moVke);9BGxkZbdAiW^oNvxMS4NkcDk zXM6a#7``yki2qULF)KZ5dnG<*f(`7At1c z7A0)jel0`5{MC~uG>2RcS%6}1jakSX6keypTolo;$WG3MCh{JQqx?j`ww@_+rfq;v9^Ch*fVrPSr|7G z`bdkMYD{-o31)th5KM#8BG3SbN{2Nts2}G4R<3+ zXurKfw&-(oy668{yS}R;#s9o}brrypsJqs;hLkaX4 zS*c-rhruf?>=-x5Ee#T(LzOid$Y7a}`!0TNTXs~mO6fcjhbDjI%JqhK9FW_f)Y7oK z;*tqBKNoInN!pQ_T^@Q_ey9^TV370@9O8OiUOy56@i8@Z@pRu=C%jwY$f;zQeaf#2 z^0LyU#7I(`c~==k3+Zv^+koutI2kbCw zvu2VwmsHt}7NUcibHW-*qHAq#n@ZTbUHFH)X7+fp0w z!8G1+bF=l0JDUTZ9&-nCWq#GY>|>wXvV%8aKAN=YK+kdSM2?^Dn0k8AkvXq6ZcMqbY;754Log;dzbChZr+I z>V26Q$@;E0{zS}%j#}dDG;0GT_5H$vVkVjBLyhnftfbwmq&wNLM6U;o7t zC^D6w%1UcfktBI~+*7Z5!?{V0)EFjSBs<0du^gRSH6oV6GN`C`Znau~t?00C-nqn- ztYWTl?!&oH-kO-FehNy~^|1`*%n^60qh7gg@X^MbNBmVKSzecp>X+&(jLf`Or{6w) z?d)>RU2pbg$y<|^XtvwXl(b`i7!A{(ojd5EX;&XXo&Q-=L1|f;mxu2Bw|;K8L82Tz zmI9fyDrgQ~p5{QBvl^c8=m_hVx-!@~5_o6&mG)K&Ew5z4No8Kup^S~2CXDSBp`0IF zn3SWg5zc0`z37{HDM6-Jd_7dDja@hWSx85eUQ&GSw=muP9BTTSOFMW~q*7

Uh`R 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 R9>~jM$_nZi3eQ>I`G1eLAlm={ literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940634.png b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940634.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7375d09e82f44a7397f5b3dc1ae376eb8897d8 GIT binary patch literal 39711 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 WVsuVi@Cpyo92G_N3%Tbk@BBYnwARD` literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940809.png b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940809.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7375d09e82f44a7397f5b3dc1ae376eb8897d8 GIT binary patch literal 39711 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 WVsuVi@Cpyo92G_N3%Tbk@BBYnwARD` literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940987.png b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/ISU_stall_cycles_layout20260717094940987.png new file mode 100644 index 0000000000000000000000000000000000000000..65332b4195e5cd039a42ad797f78532f31fed817 GIT binary patch literal 39805 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 nztg%I3c2Z1w6wQf^XPk^x&T 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 nztg%I3c2Z1w6wQf^XPk^x&T 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 +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 720 /Length 38507 /SMask 5 0 R + /Subtype /Image /Type /XObject /Width 1280 +>> +stream +Gb"-V"aC^T+3/BT6;&arMSii3ZS@1CfPoX`_e$'g@.7gQYRPf#f+uAF0?)c'>mi/Zge(5=-iYjTG0=Wb2XN/3hll57n3emqPOrl;Ek*$Hzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!AZ2*^h^QKm9p;\8)BNGEK*%4l%EWY7b);DN4oD\XURshXDzSTIFPFN9Faf5K?WIt+"MFg>Z+mbm#b1M>!Zp$+,8]NDd=X.NnBNX[o[\OCD&Hf+MLVb`qfQe@b!s2M*l#7nrc5(EQ:on3;F!!%QFL$QK(lU)/PVZst4*U*\3cOH^DhSN5d\]anY?sLQ2n'AD7T?KnFmn2#EkArq]@=4)KaTP]A)"G/Ehc<"^3oa&p$+D]p?WqiL.H0Ga54LVf5q('fRIIcdK-1Gb$[#1jGBN/u-.8WfdJNCcZY*LNCaiF5:7S8b&ZO2U/R&2T!!'5aiVN#u\T?l4Zp/9(rVQ?H^OL`8=I;9k/GcQ7_+5ZBM0Sr>?smBPB68*3OJT$9k,,ZKYm1fO@0:7XGBO#Hh>RQdL2=Z\^WiPUH:K1RXhSijQ,bN[KRAOt:2DPIfHs1WgP9"u>c**g.$EP7k=q"UXYRBgJOT)&Fbc^gSr['$u`m94d5C#&Qu9q!o$3pc+qBma.b20/UN!!!"L6nREoT=8Xi;QEj#'Icpn#JoQIS+kjWKA'V9keGPYV+lI0`>?jl4c=Q'1uJ=u*r=s>PK/_+J+18Z%2q&WSUd+"?^W/+UWc9th7S$>gq.(:%de$*mbJm(*IW?ahtfUeB:LYaJlKqZf<7Cs;5?_pmDIqQ2fHj#hgb[>^V>8oUGdci\KDr*TXY$>-VQ_fom99rV\>%r2'm+>/b\Mb\$_hScGA5&OTeO]]D!!!"\Zpj>r)JO'cp?hbI`uh-RV,*^i3sA[WrAUa/H_jBhg=f/mrp6u;7ZSU=s8IHFY)*$8/1aJ@AcDW'ja$MPU/nC"6'JEcT>lXcl_[lE9HSn\?A'oe$5E+:jk&aBS^krjW^AI?19URYiKS7;)JYpaQB$;+&I.cdTB]`B?nDHSM\8U9=Oksm-It.Fi=%>d$^q`56hJiEpFR@d>IJWT^Sio`;3ji5DDi]/@o8t7fo])QN]Qb$+eo'9Q@G64ON>kCf"TSN&OB@5&^\V#@FkT^,CY#T7Xu9t?+AJ:][r1$M#E[-ScHc8fFMmYCpC@N8d'&1XKk8AhV+Hjtg=:6*b":PL*PPLP;H9_rdB?/,:%ln/,8oC8s2l!DEuHRR#9S=iX&^g?SY(E23JJ&$I7@".:FVc2:/+5/Q_-Bc@XM*4ohK@OF4+c,>?gK9fSE5uDmsW?;Pd!^Iqr.u=g!LK:$mU>9q+&+InuXuWSakLs(]K.&c+*(RlAsFIjHj^bh0..6iGm0h7K0MhjH95b14t=:IdI.z@+E-e?RI5!il-iMmbQXBc#*%4ak@9hPUTO#YB#s^?'<'l+[ZGOB(kTEnul;a>NGKKa"M#H`PnZPVbU0f9URVF7a7AZAV@*bXjZY)gpsbuZ_9aA/mZ&1kK]W=bCBTqA:V+*gWl3C7r#"c2K.HbZ08sB2rBThOWoMOb!CXaaeX+Ig/\08>`JGsV`9"pBFGt"mMSNT*%=r><2_K_bSVdi^]4:[JH?"^mmk"%]B@7tUJ$q+1=n;MZ4(<7VM@X11@;i^*+YS3IJ0(fE:Df%R58KASfVl0AMqSh7>_d6]huq!eZ)V\O`p*DEVf=l?[_TI16^T['"rVaP$?YLD_E>Rfs9_[++J+\J$knHqY]s2(G&Z2CP:S0!WW3#OI1^e^X@F3ZtPRT?TptMa-8#O(+i^sDr8:+a4#phQS1:9hHYA0o&RpS?Q!0fM/)raSili=`ub[*/hG7.D;)AYb*?29@YK:"K*Mq$pu2ZoB4q01hS?qBmbPKfbEbjLTOPlt;A^q!Tah#srDssuE'P>NN*i/^>,6r-2o97%_4aV@OgKGIRrHS1hX&i2JAOX\A2/Ce0dA'4/rR^i,qq"a#D/F,M&/kNK!!!Xka,_<8Ko^I>0<6d@dNfbN)q+o:!<<*"!/T.WZ"'Us`r&c\JHH.3qmLNmcp$KMr_'a*K:t\i&uK$#:11\Xn!8g[^*kK^&*Vl!+RcLbXDDe07RpZ9Sb99q-nd%Q(#;mpLFo0.<@RqrN1Do<_f*]%Den]a2)CY(1_mbB6iVTbMgmskE@JqARu*J:8fB7gBt11nbom-NN7C"%mQYn\)m-nE8YM-[Z4V+R"&R58K!E,`m^-VrX6I=m0),9?TbA&kTLX!SK5YCp)eC7RA+7_:f++J;Gu2T:Rj\$NFIKbH="\X\e2$QR)E#tCRmk=:DOD1j=u<7Az5TEe,>WG61'[i/W]tIqT-qid=g:bqd8sC_9Y+!>#g&(5d'D(A2Za$dGET;f/^3T>4[Vac:h7?UhH?a[*=7+kXHc1\4fp?m;Y[PFjDohjB.8qQE/Bi4'?[hgIDV_n$92*>ScR!/RbKENtH10V',ECR*cVJ;W9SW3$$PtEPDVR3EQ7Q3IJqSn=`&Cms=o<'Zk+?W^V6cQn`)]RNpZA"^./JM\e&=KddIWqtBFR!1Pl`.U9LQ`JYP-q&b6l?+YR^l),,3f7)rZp?gVgeVaY4!!!#YgTtP=m-X35dks@msZ042FuHUtJTc0EfXUOA*"*BZH+kg4qe&,u7R?dcBYY)XPd3gt=FmSW`+$lKT;X/m2PeU>=V[6:4,:[Pr'WZt@RO&I5@-Le#lt8@K?K1g@-n2cA\dJrV5E6N>jh-/k99nUiAoY.!?i1LN$mZ;/=q=Ee@ji_<6L.ld/cXESPaO7\shTDUf3I/-I4>LQp/;7B,5pf'*udA#2e_Ur+,Nqu,E\D;.[rW`QBq[+]m$mR8o]%hB0ge#&B[<@VLuN)!,C.8lri;l5LsHc0[-CtZ*$'e3b9P!t+iC!2_i;`%E!o9)4]o'4c+NuU1.e'h7-0k1/GET2YqA'UT);lP%"%CL^j!3/mn-1Lk*p:`qKu?)N>e$\o?WFg+?0ms7qjS55G$;T;*9(ac[sHRUsa4ebIJ"M5=1[CtV^u2r*rLZY%J1CZ\DWrFC6"W9Vp6lP%X=6\g!\lKNMP)`KBfhRr^8p?gVTr&8n*ZtT!kQX@mh`JYO*Qe-.?ET2Z9)56Mi;m7[^W`TP[A_$Ls7b+4*U,"Z*Ci[jbdeZ7;q6\i=e]VKpHH^um$7Ppn*d\VkmSR(jLc*aT-'"KJT=1db\kEdo5`n%7r?bCW'j2R)SoB4_@k2aXJe"fRAA]pC?=0M>`f2"$brHJ&+iOO!jOtuh-nRF"l*ZcBNns1n6lKRO^O)f5[M5HKNHM-RD++KL^-I[J&^k$n/o)8RbmrH#S1jS@,4*J\)rVc[:4aJARrO:[5dse-l@)7G5mCs7Js81fpMc?ZRc($fCF95u,R8'[PE^B^[TL^GQhRn,h%j.+*P4gI`V&b@5::T>V(G/gtI/3>+QS-BjbD#<9ZYS_A$g7*BbHcSHpu)Gqo"p(gZM\8doL%;C?-!;dr:8#\'^4-Yq>:/N)5Ri+dNurCl,L!!!"l<`iI+[VXWm=D:!&CGb:j%j!iHd%GsF/+l_bc%#fsU-F7]h;)AVUNaL\J,NBMC7f!NUuKL`AS`YcQ<_+L[GL$I!s@;dD(E:N?+P.+e>.3PrE%-Uc'gLgVbX@dDcqst1i^&pMY=uF';Og,5s[dg>-uA=1T*@1eAIo-qFU_Z\PoD$1(sQ[O-V>"Ouml*l&"NFQ^?S'f)?WYr6M]^cZXDPo^VH+SH*q+Z3^)Ljg#;f?1-CPB9k)O;PZi\TKn(uj2ZrP$E`QVl4nHpZ=Tk)Q'17ejQ':IB[ID:7d+ok9stJ6?/;r+>K)I7A`D1::G:8Ko_;s"XcZB8PUTOg'e:Vj5#%J&++t&PjVV!!!"L,beu"U.u:O>-s*b!WW3#!$imt?=)5.nFcHcWW3#!zzz!5K62^BnI(D;)AmlDq*trG^4-@l!qg`LZ6h24=Gu'EA+5!5QI>]jpp6pr'!AReC)Q5JJRASsX6'U(d,Fql]mAjN*H=bcee\)V"iYnBRRdB?cmqhVPt3JH?cLDUe-D2Jq1Fn%\>Li)$jufqV&uL3oT0@&R#%Nf;cLh*'1@[qX=2o]M9Nf$*&o'NhQpk@R58K_]9Y$Q-B39,]Qk;H?L6%46b7C(*^4sbqUc)f-If/%2uhS$>/Zt4:Nl;`91@:?bcSahgK.kJ#0fB.8qQnW`7D3.o`J*jlI6-fX+/nRPjEEpYM+"e?ipg+!2Tl0%8jQ.p&nOiu;^\Ure]A6be*K[%8QF!s?/Zn")[hG'U[)A]r4pCUZfVr3J<8Z"(gH/TPiNl.igjE,]dgUPb;[<5!VNUe](J7>hr;\8e9EBm&u71>(a6Rk%O@-rV>9ou._SkWLHYrR]BAY<[X?gUD*fKb.89RlPP%hRn.,))3En,0N]m/8IuBDWJm$qRnWb3HF2BFr>`.IHuIJo$j'_AK!=7Lj!p\N#Cm/VjE":?1$=OB;%YG,!JU[YH=qoK*MqZ\WHKb4Y#mC6mktn>lU)Rq=N-3UONsX!!!!]HhP\?hLoe'O]1k5N&>ISK=2)]`EPESqQC=T,9mG5B5J,]@QJ,Qcu=1J7!3d#1O3`iIh=gVk)<6dLFk%Jses8D[iZ1mY?-Vl+lf"o2]g9k_9B`"utXA59.@&Hbjd[,eif;r,]eu2I+^juTb%ueUcd7*E:1=u*d-;BrM9U./3;L\]I!!!!a3)XVI[;2[GSiqFDp?^J/e*.lO)R2,c4aZn@A5r+J.;7SphV-N)Rl=!"d_=r`Y5_+,d6I6ifs@S]288n[W'("Gh7NLhX&lL-*CCc?s-5pHeO.`kC")4hRn#]C84f!c1h]^q)l*G_o'tb\EprhqkDdm_ha3#(X]_u"]=`7Mdc/6(#6Y/HU[o/ZW1FfWer`p?f92dI^e6"qM4TC&0T8/G:i1b32Jo=8*1&C<`2)A`W^Zb5(Yl7m@Ud!!!!jdu"kjUfms,#0Q%"Pq$qBf$4!INnLjX>NlsslID@\C!s\ApS&Oj4=X-u4Si&"+!80XL[2]QK(Qn1Y$EQ386XZ#%3&i&-PLNIZY%I@dIuJD5Q=t1eM"]8;RL7>\Id#a,3A+T.K`YK:gq.i!GB`MeS^>uJ$3.ietPS@R7Cn&B,RW&X.>Y.-HA@.^3r(ak03\CUZm(.$5CRL1T+PPa,_=72/?6&[/F&UD>sJ/rVZT#gS=#JVJb2!+[bOerbLrW\RTDj]5#kGrKatfhf.Xff"-!>j1?iU?,Z`3,"7C[jicskJ,]9,:HnS"qN1aX!!#QY!WiGOUe.n=okGp#2E!JI#BSkLIs(&+W=^@E8BXPp3q_ILLSGbf*;f31A]sH,m&jU(EnuEBnT"3Ys4'Ucm7BcbHukmXW(%L:RJiO0B/XSY;#8\+.8u1f2;(6oPp,74]77n5=k[m>ilA6#&$&d8Y$[G$.0Bgg&_6Et1?7*@oT;e%eJ:UG11n`iCXt&c>DKrV5PpHM$Ep_1F7B[*\5uGlFbH?+XFREb3@U-1VWG,KNof>34&#HhH[So"7JR*ZZtE`.e^?N:5VQUD[(-jFPb1A]U&_:R3M4:-2A-gY5rtiV`NC+$Fr2kN=4@;eBADg@ad`GOF6hVG*DFoO$)9s-ei-=PqlBD`^$B9@&k=0@QFOF66oKL1ti`>II5VPYBN%9:%\_m$KD23rOHLVP6-N=luGKNuj&e+-m5iZ"$;';Pa^7-t$4Uj[OO^ji`ub+6DPCP9ikfDnc&0_M&@Q!NAtnMWXYoC=T=1CL7ihVG*EM03h.[?+Y9^/2uh%1=oEf_]kq\B6Ph2LM3@H<>oGcJhAWp8Y$SjX-Y%,M4,u:+[q!d6_bMpL!Ab$Tg=qp4Q"TSN&!,6US/#;sq\8amJ7IQUAY8T62+SXUEgVlBEViRe5jnpZ^-s58R@>E3MHYo[X^*;TP%[CtS74\T>bmp"u];'e(T$q=2&,,AC'9iD7mekDBE*Z8ZDgJqaTgOU2L&e>^!!jc\.k[VXVA7uftu45p%>X>j?rEoGQL=40lU*bCb\N?('%#ZmX&[VT*?6A:4?4F?egVk8Dfduu"HN_uQ@l*kFa/$lEbp%%[R>IUc1ULV<&)7t+]*YK*[h*-/WBN`"=P&PD\WD]S8Y$JX`Sa:==7':9_h>#;/2J'J0eurF6eQXB(E8e[(rtte:!'gUAlDWrd@WIp4Uo%%d8m4Y@4+Da0.A"rer,Jg_Rl!enZH]FAP9qe\XGEd:!rr<$J9"):(3PLBd@s'qhgatAW=s9oLCYK0A7>N=!!!!7cHFDsH3Csr^8e*smC^-G,>S'`Vb^;g(B=F8!(81kbhsEOr8:#Zc,VIjh"<],f@)la+)O2kci'+&WY9SW*5B2bf^5M*D_4%oF2cZEX0/TdH.BfWHEm#,EoZuG`etnX/";JVFrS+j(a!$@^:7eaoJQVh(+'"]!!!!3J/$an^&]&=^=[Ysd@+!X>kd%kZ0>0\'kc7E4'HRFrX'loIQ2RfJ\IW1n$sSg.6cCtq#'-75oqV;"4KZ-[)V&bN8k6_Vj96dY%%>#/*#n)`iXZK#H&EbXt\_b@siOSkg*mqzJ9MY>)KtG's+0KsQQ3[rC@gQ4Mbed^FapA6gN*%G;6bQ$r]Bc>rAS=+P0#\WQuPkYj77,JgBSWmbW"D6COCTc)"eCA!<<*"!0Ri\kHB&8IP>9@BbWMc[BU/*PV5_oCUpRHL[5\NJj5B2u[DO4O\OlS'f8\ohl"p!!!#;Y875Ua8UCri369ipN'&@*\9Ko9*/)Kkkjhi[:]:5pRO))IH.ud?T6sXo8Rrh(k_`dY8IHWAJa0>srGH,DidIc>Dnbr9%9JS#eEUlW>AZ^r=`YboJ0F%ffD!!%PY#RrRp]_c0s@BZiW:KJFG>C"PCC]>Df$2lel*M-u"n0,%qEs,*Et0#R^KGikIAd'+6-8ZCn!&sFN!gRDpP_"VmP5![<5#^@!!!!ABaG+Q4663*3cFt2#P'4_)6;brs%[UDq#5&t+W4X:EHoeHj.55MYY`lR!WW3#!(aK"h"PsIGGEEqUID9FF5FD"h^R.,J,f,NE),HAYDpS-NDDZ:^FfKd!!",rGkNn+ouT:$QCTWkCqK8pCA.Wgh0St%BdONQY5Qamd=VOs!<<*"i*CUmIl6]1c/u>C=l\Jc1%2k5f!J92?Hnk2R>m,o),L6GI/-n;.gQ+T!!"S([0OEEG@%=/A\[enRP=\aFs?7eH3U3%cE1qG35t[bVWubIz=:0\sE9c#\Oddt)[GYCCMPpI>RTTHjBr6AhgcT!]s6'T]=]5g>MomP:E1FSf6@:S?ZNQ/2!eZW`g!!!#of7Ok?j0r;G1Mj\oC2"F1qsU!8NRTm]$d\UB`WME`!A@Ee`W6&>!$l\gme_01Fuj"!NQOnj'h.T+m`QNK0:5e&&apUHp,0RoX8;K!!!!!A.6?G\[+uhEE[UZ)1Q"j*?+6ndqJ'_5)4\OQk'tAU(KA0C!<<*",S`Bo5A2hDT^ik4^!Z`GL8A7V09t+UKoM$Mp8IsPzOD'?&);J#5o6Wr=m(]$Ue5tNRXZ*R9))&'G)@WYG1&q:S!$iV:+e]8RrUoF=S][F3ieZH@[k.>QI>bK+9`N%UE@iaZ!!!!a*/0'#/NJ-Xr.lB94(D`WhLE!fr^)$_9H9I'nb%qh!<<*"^q2B>$u8Xc\b0>GH1W]!WW3#@-J/-J)"H.!TabFEC]K4HPb1/h\Hl@k1)?G3Ni5I#ljr*J0d7)qg$@FLR!)$U_(6>*r*(-qOX(APLd8746,p:WrKL-!!!"$MYfR<^Fh[7]9iA'Qpd\Chh1N9W,@D_+@@q([gt;"qPsNV!rr<$TMf/gkgZ0TMY,f-]FlQjkl(7sr9ES5@1p\LI)b2fNFAN\s5j:]!!"FOq>*52BDG,qFQ$ms4-a^j0ag_^[&qC`H]!!%QF)%;6G7rNf8GcUE/8+ce-f(Cil9e\#/njc0q?)mo]!<<*"R+%$bIa)IF;Vq;,(;9`SQr?k1#:-A()uUhXrYl"@!!!R3_4b:9G?ufPGE_UG8+c$DpYr8Me@.Xd)4ArubfsfTW;_,I!!!!194r-,Yu0TmOO[G:!EpVuideMfZ)0f(@:^>b:=1GlH.i"T['R-MG,z`p406^6l3%H)DlAO5>BT:+E-ThiX::DJeF_)liqh!<<+M,jioFIhh7hDu3^@o_s2e@M/:XNl3WhZQ%4A;uILC!!!!E7?;fugWhm\]ZQ@=7.7mO`YVT]lc;0,rkX>tV,I5X-qqDLiQOeGp:-iQrU0`V1R!"uWYIXs(_+')_*80"E!?_:3+e5nXCl`=o8%.mQ5<<*"!!"tu8Im#AFI(St;7cGK&s8%_&:OS'EEQR:)`k/-KD]8ZV!.[JVFl/1+]f.DoDT"*Rqlg%hD!DrZM.;9N1`g^<]nHFd!!!W6hgjW[$Vr1SCrD:[qes9S/F)O?0h^)@2MM@7hHBmZ!!$'db'i0I@s9HlCW*m5qettcN9ZVQuhIZ`f!!$&6h3km/qe]A?eqi"SpYX=`l.*7$@`FAKGK7m*op,[[!!'5M#(p@>egnmY)MtBUrR[^TY7\,'L0NF1I5W]9?]&_]WVo'`c#%GU4(U,X*DG6o-'f9Wja8S!!%O<]BAeNo?$lo(Glc.dJ@e'5>*K0CrBQb*E02fckWEnq.nU"ci&JqDc$K7!!!CLmZ()2@Jmu\ifDZ?9._Qg]X8?X`%WH8pPEr9Y3=#g:n80%5KB'k2`f=cPkO-O8&n^X53mY!!!!*jR2V@e]-uWhSP)KB`5EoZHC<_*/Rs]cg;@3(I4N_q]>V_B`7\s'fD6m3YM$$#,ReKI>Z]b$tY34^])SUp%A[l!!"\latGK/epm"fXKB.aOdKdb>L.P?4a]A6gZA;c<,\T5!!!!TfQW>G9E#U,s*hAUNq,q8@[OcKR`4ScU?(77kIl:CDlWj\++50Y8&=!<:7aNQ6sf`UY()KVf+e$^"i_i!!(m/6-:j;,$P"`]"4L(E^ujb@Bdr%WA>4Y[IM)+XdAJG?!mX4!*GG;SrX9Rj/7o.jO*gBM`"ikmrp&RCj,3,@sA4VYV$.ZN-Sn3qlmm25m(!"c!A*l%VtkVhPqMHG,1rqigE"6D+q7%2IWqloE0fq27X6]d`i,"+jNkgAh3RJH'j+&6sSA?KHOW`%%MShtHJtP]o8'0rsFF;uR+Y9p:tM?Nl.`hSK9n!!%KV#S(]4l]C]9A7@.W*-A!3or#U8CM4r3RsT[!!!#7q"r4?b4gmPF[bW25L=m3.3[`/<#`JJq.h4DbhV6XH><`c!.Z>3ba-GppPOgX7I.]QGr/N-qM5p)cn%D@s$QSi,PpKh[:0$e];i>c!!!!iU6Zh3V0nVs=C\`;qhms#jh6^gR5\o_nlJ7R;Pu88m9<:9[s6WP\&(bJ,=Q!<*fZjC_"&L;#W5+Hh-g_YkRE-e_Z0X!m^T2pU5p^%.M@=n:P0Xgar!X55l=!!"-=OZcB5pe2lk9?g4TBeh'B94=Hp@+K897iWXU]BQ:%_2F:F#f`W#k,2m\^mZ1"7E6H;tQ-Id'4?6QF0L-b&o9q/<`2%rc*h026ZQ4a/t!*7G+b['=W[_sqbX+u$W)r"$qqs(XM'sHbe^KaaUL[2]"fDaNSKDIT@E3pKhmI,A5V,]#0_U![T51.3gffkg/f`,6Wdb/J)q`?bq0q,m=`&c_n3HY)m^L6%_V1rfuqtu`EXX4#J!3FVLT[9,@p*egr,o2t0p><,%TE!KbB,AgLXThdKkYf_*CaZ,3:,\/ZUn1XPAZ9LSar@/l`IDXAidKE.J&*Bq)GE@,&fRWngBdi[!:/*Vq.\r;Zc&"?a5`f4s7?&if<;/jD3D#N3&E5`\g+uVm4>s*[hm(Oa!bAko6rQERIXEPJn`N#g2Ukq!'Xrd#ag.md_V05F/[ZOfCnB27)^Q[J\pYW1UcFMBWoW2^JBmlIL04j/fIifJToR!Jm%`o3i:Gnf.IF1_.ru@f8SMN\0M^77[G51cD08!5B7f`Si?j0j?KiT5+>PTYFggpGM.X*W3^XM'3hlX"fs6T4)T-?:feV!:hhbS#tH;^i\U`Dh6k=q7>lBAe?)?=OHI_J`A?6in*p(5D*CX%3p!d@fkIo#p2t9O5mh9%A-H4S[ssT6+4$;m%R64MTtL)6\`VI%C1kp*k,^(86I[FSWmK,\nn?QJ,['YTjslm3T4HbRebPAo9?Fi91\aGHX6l0Wnt#_!!'eIrGTLYjnl)(.7EL:F&t;]fD^-$hjS\Mb(L%O7:[`Q\,p[@Xu5F8eXjLn(oLXnXchI1H5.m7`BVO1?;6(2i!9XZU$3tJ9#hl)@"c[sKfmAt^6>$?)UI\;#a$31&+$ZbEuJ+3PDPjbK4,SI6ZrjaM-qes]>J'O>1VYs$bT!Wd_k:*`!gI++%N2^W*I??;?NOuo!V0suOob75[._Hi&Kccgi*$ZOm]]Rnk](p]V=2',8/`h`UGS(LgH7K@'!!%og(1q5@l]C[c<0D?tp"r4.gjca'?]FsGr)YOt7="m5QGo&WT)Yf`3W&B0IK"Sklg#Wpnn@Qc0a.,k/s=WU<6*TB>KX?9<\?r-:@!umJ]i!$p_'2.>,?W.>%W)^32:de$NL/,M_K45Vt.N"P,+iFh^'eBR]H;\olcYD.?XTkTpC=9\CK^6@F(^K4/>N;9`"n[=9&6tUM>)@VUk_CPMB[*4!h@12S>Kroq,/9DWI077C#>k*OX;g-uXUFIB(&29tfSV<2HnR(3$Mfr9l9ep%d+OHhkE@;dS>!0iqPJZ^mW?J!Asa!XX2NZXJ*e%V$;'?aH&gh,bYthUV`.!'mgT&,ck-h5#GMPU*5ArHHr;-K]&m]A(!tWirB[+20q1feC4PIjOtC:,WT*af=O/]DC!ka$RP5en/=OIuf:ihpScSAm6.SE5mCRs88mXF00h5R8V_6YY?I^G:8a9621DLea!&C:AJ1%J)OJ@)E,D,LXIX"3$^#;HU\3LZ.iKer-_uSY8)1[)?`-qe?E;DOhWP"@!'lsk7rBd5,:,o8>5qmA]TMdIQjE8%G/N+K39O:8F5Zn)e_=@0!!"G:co7W95gK1!'L_9%me#Br-YUrKAHoXp?_LMb$6sc/$k-"Ho`Y.rDNK1*6R`CFQ95o6!Ec[(c)HBt`3]em%rr[,0<(\2PZi9_F\g!!!!*@IUjdb4e+l;NB=X2_Y/.H&K&Xgi72)HmMsCk3TdTH:nYH!.]<6!Ee\=W78BoRBqV0pC6CR)(kCJW@WS+$4WW88Qt!!",_KnUC.T=dtqSgR+hdJEKEMYOQ\L!!!"UPE134ah_2Hmr/o6p#!Fjl6pS8es-]I"-p(%7$d,upB5O]/-#[#`+Yga"m(*#KY7=\s4tG_[dln%7ChC27eqp7P]>O"M6Hs[!"td%%t*tgg+-VMdJE=Jq)+G(8o':@[)ti7XAcjm&nQq2f^dCU'4CnA!$j%r>`U;jcQko:epe4VYHGN>>"(cu'Wa*4L%;X;Lsp5:):_r)!!!"dc&PF-Pj`#nU.=Oaa8Vb3^-.2oR'E:.rZiX!U\3Nf1I"an1bCM$Zc4G$7nGUg*4Vtob7+FOJ9Q1_k>d)IS!<2S[$=e_>!B!!'[$hJ:Cchif<2dV/U2F*_Q^A^f)uACd)mHZ@=]`>Q/XMX'Rf!!!#U_4u-^)KX7Us]&-c"S7Kn!b)XTSXb=12r6D[6k;qg\f\W;"[j/!!!!ReSY+"jnk-m6kuj(H;4?7H0)E'(e3S"1O>bc!&[Ug6M(s2YiWEFOQp[C!!!#Um`39oQ1$jK&l#b4HZrA-ji,\8ZHqo^jXZ%I<,Qs?dnIs:!iKLD8C]<83kU&tAq+A0,8qX_s=@enFJn)L\KQ.Jg>#of/Al,Y0n\ChQ?q\!$DnM?Nq81[n6D`+sClaepi*;j\fDO'kWA>J)r24]JZO@D%?m^#$@+\gmrShj@A_C)V3H#FeT>C$8L!5)?VdQZbSLP3T.>5pGg9WPgf-=j9hIBS%?P?=aKo$aVJoDejk0HRdp7/2L)(h`D5E[M;,56hVJ>7!$l9>r;mB!fqa#)OH=[Do\Y]FI&+E@-;4h8ZhuReT(6Gfigu3dD@['\;n^]d!!#R$VXM7%I%QL^GE)7PdL/9?hFnS0J'8h3I";rPAbF/,Wjhg)!!#Si=I=Z34X/Gol+^dFPu6C3'-O4/IT!neM&B61b'qk[IK0@u,\krmLW]>q$&M*Hs*h8`SFU\=hg%9KMnHaS.::fI]K(9'RHeWR!!#8^eF&B-b'+!qM++6?<`i7+Gs@;?"Aefs_SF^E(H!poHEK<0HJ8r1!0H9sH01`sQhjuR6=LPk^Rm-XTY.#=?OXiY[i;Y=q/RhPO^\F$]F#!Gr=/f-!0FRHflC6kINTf=MtGn!90ZA3;WFhU%SSs,`['XRRD`H5T&;/%!!!!*-TEsLj.Y4mmfX79]1Dt(\u_(cU)HffjOQ]o&gm.;VR$c3IM2\]!(]F7T>.RW&!2lT8,@/sj].N]ebI5afo:(I>-E;[PPEF1O'eo9*rl9@81HYQ33IZ'O-!I6qJXX?r?Q;7cnG?C9d>@9+iT5L@5BU1T5a]!!!!ir"^BbV0q0]OLR^Tn)l39.W;D#N+#QZ;:DBk?a(e!Zg5b$eaE\B!!%j_e!YuUn+[J-QUq.Y\$D=jdV?egE9jQPWKID0%uX2]IQ%6,!(c2=4S-nDci+P-O7_?+X6M)dXldcCf9XPq.7s:Kkd0NaIursi"98FP`,+/1lcStu#`3&es#*tZ=*\^A93t>pn3OgsaqlL(P%D[OWI@VC!!#R6WfQ&4I$]nU3(Ea_j4.KbYHDk@f]]tT%:>u[GnO-QB'rOHmg/so!/]9PD]e*!!".5$sA'Wq>MEYEKBbLk%h\1?=;e1&(eY?QR#EL%Y4fa!/M-iK;$MnmE0YH#`3o(s*hYY^@D=EQX"b3:AJ?EQ4OOW"onXZ%k##].GrT!`%7&MgM4u7auaF@j#=Ydd6?l\01KCWi=KZ&!.ahu@acXbH[:@4-.7:XF`3qc`l9X)@ggm0\jH3J,aK)RJHc)S0Y=@FFt;Ip,K)-qrnH#;U%0NLM\q1\mQ+dJnc_Q8.NAL!!!$D5f,si`o$?hS#'B1)l-&RQX:=dNb%n%Y4fa!&1So]02GJit5b'8H8X;XnDAEF)F2j?Za4A_]dA,!!$W\@/9oc4*ZFG/(/qI\$h.a55S*#2R@<#hWpF[3b"Lk5Q@,9G6n6LJ4/CjDa<_sl?D_'0it1Nriii1nk'km"HP5+fq;?fQQ*3^'^<@m0I0WjHNaBL5[ptma=ZM#GD)>\oh#e\;4.\g:5t=h_"m/!3G%cM[u'@f+DKK8H8'h%K6%Klit"IER$'Ie(fE;YPK7A!!'gG%J70'I&Du9o1&Rp%u]nk5ncnV)mDg-Z6E>6"c'cj^LI6D!*H]Kj7atZW?]?oOoG6i7gnDf2jtRQ]_B\77EQD\Z**RH8,rViEUiNeJFYia6HgM8^V)d6.PJ>0QJY!m`_E)*HmoZ.$bq8r!!!QHCJN\_^.1\Lfd$I)Ns1%4]A'HSnjPsJ2#I[n!!#9cF^';aquM)&r2*EE%Z!WW4.2>i(no(Lq=Hl%g)G`).NWN,ja7CW:G?Oe?dVYIqY@:9Ajmj%l5!7p+jk7ctSDhQ&9V#S_:g4+N_e10*tSatl-&ofP]J"c_0"98G;3m?7DWI3lgOSFb+hcX_uW%,P*j,6nX]Lqud+Gi2'O5F"::'(Cq?l_<+H!L0j)^4_fl+_;j1fmS(%E#LN0Q+Vq,sW)kqQE&cqOI`h!5LX[)7EiHc5Rqs([8\PX4?iL[oqaUcTXo-q.eUaeaFa`!!$'8qtVc(HZ"MTCS_"0Tq_RYSGS68Gpc0/"oE0E#n9i3IKBKL@-KS?];L&&NKACEo\Vl72+uluqde9EH$aPV/!=k^FH9@.!<<,4`ON$OPjc$m'!IGs]5Ud!KIjl('2*d0E/jE+-V5d<:Y\hGIKBKL@-QCkkN#\iO[o9:iWSV_L(QH"N*`H1Y";O7OS'Di^RkK+!*HgiUNS-ED'L<4,Q2i>asIEoIKua@11RW\=XH]o/S6)*rI+eJ!+=3%"+kUg;SUsU8A%Fgn+%3Q';kftGPb,1r0!kD%gR#QrK[Kb!+=2LGWf'@cULHQ8,D\S'o`j!r8+'p,^6Hbb3,*:g"c1EV>=I$!!'fT/O"2Jq$n>enK$l/CR3"frsb?#[T%a#jYKPmEct`6W;9d'!!'fT%9dsAq$n>enK$l/*m5JAC\\DYq0oZ499daO8`H/Ms/,(*'`\46bLP>6M"2QE6K1)TJ(H:N.fRSo@8QgZ;eIMN9g\]eT3(uo!WW4.\]PB=TmVWTOSFk.hi70ZJ%*#_;a-7q86WPF;>mX!!!$E#Hintcn#[1b!0R8mH-)EC<.;Mc>:Z=36F9]/\Pr/?$NL0WKfX;P\amEk64tEhJ%%&5(E_bjJ*L[cqlWp_K7mp[h.oACE2`'r('"=79=4]b?0-EKKHrgYs6a"]L"XXff][]i%UZ)\mKbPlQ2A:qhcg'\!%cNVh4Dc5eHe`s8H7MRk]??]?c.taI4!395&5h)bNAEj<55mB!!$,q5&8Fmhc1mH!@%Jdmt*U_mD#^b$roJuKLF&Vh:GZA[f?C.=JB`r*`]qT7S!SKqX;-%[EVg&YI_,C5#[,&RN=!)W.&Xc!!'5kKr^j.P]3('"=7MdnFX$MN;OHrl;h"Gl^-_t.Z2V>Q(,.oKlu9'(+^85q$"I(S[Q(B=F8Mt?F,JF`Xq64tWnIujS+h$iJZ)OfcS$1jD-%O'4FDsr[Z@0Y9N0E;(QQKaCQ?NFd"WY#`(Q&:q"fu05E:6XolY*\+l_q3pER_0llNfjT2C`T46r@rB70n7_hB7.ap'r%Ir#S$";EdQ88Fi8rpO2umYN257c,g9;TBC-UF#j`$*IEJ@!(\a:F;PU@K%;)p7.\$bc@TUs8Hhikb!I6j#u.>EpOMF!$Ji-ct6,H9q#$@L&#r@lY#V/nD!G_euuaurUrn!W(0#l'75E6!(\`/4P(tW-;>t[_YcLW[52u8rZ1q!^SB\2l'M+1[t_n/@/p:jb:-52MnVcH$E#TX:4)B8?TS*;CjUTl'T[O9U=\MQpPZ`%!!":,XR)J".If?2;W/>Ph\iP3rM&7p_i(F`ro@/.Dn34gSc!T=fS^.<5S@5*H:.lA/i,">p,W9UO=[7[>SV[6-5B]mr_7b8U`Fm-X/?GTk1*P.he$S(>-W6\lu`L4+B],A^,5][9IdEdr&aYLRQEM/p3O&OoG]@K@VO$:`a39X!0Y=1A*6;hU$M3_\kA+mXpg*X:3PTJ$FnAlgmg4!o5E#pTp3=*giI5sFTqgg=o@ld;:2jc;P=ifh_iZ=h!4C@](O#ieE[tM(/"C,e'8V:Y;6.Yal;`4LI^6n8VL34J(HP@I*:J-le*1X2#]?.c'._3PV:%r?=s6

M9OH^!6TX,`=IJp5H^KP7"G@)L`9QhdLFe)#]akL!u$b%uS'G!!":&Z^R;3VAtqY!UG<']:;L?Cc&!;MT_T/$@<;R,Vmm>&\fB)hpp`C8,HM7u-:,Sa-u3Xh(_c2[hiMr1o,)h!&[8LgASpi'4!FTqgg=^:jhJEY`D8Q#T^n0_^TY;6.Yal;GA#"RRB8WjFZPV:%q?=s6

9*?KWU-:o\[)LaJ+p,W9UO=^D(dAZ9`1J(IFeZAA\f]rqG5dI?_jgaO/1J(IFoj"uJZ.BinJ7R'7o>KkI1J(IFoie!PZ.BinJ7S1ZO/^O9B9K%llGK;[`*R'V!0Td_r\L9ecQl'c<1!(:a'NBY!0YYC[2O1K^.FM6ja1(CfK]':!s"Ef/q:TBoM(c".Gt#DgVL-r(]]*IEbi91d5Pd&UjVW^%nFTF@/p:jbC^mtNkS)K,isBt;CBIj@/p:j99W*aU2SI*8bq4)")#SZ@/p:j9A=pEUMnR+8bl]e#n(7H0E;*pji^MBU2SI*8bq6Y[%DNc&IB+\db/[iR3ApNa!W\=@g(0PgIB+\db/_472)k6_!W\=@H;.Q[IB+\db/_NHn`7Fb!*_0pdH]q"2+^\0[X(;Qm'Qus+;o%;bc6g=J%$arb*UCeg*?=.!W\=pc>M2hqM%_-PV:kj`o,LM$33?^]!^@UkSlEO;SH-1X)YCG'``dFolS4\d5Pm)UjVF_6*k%(.KBIjl]Yakd5Pm)UjQn'oVJfo'``dF2(!0/oF798.:68eAn11-"TTZjXkT4CfgA"t;UM[kj6j1='EEYoGJQ)KUMnm48\?#t%,@]q-Z!(B0?`ndD.hBYZSh6$(!`*Q"8!/cNG]fdqCk"V#Ge$\Nt.J?@8!)PMbg3[#qc'otmVsEpPK%MR[!'npcB_p0@Rl"mP?JDrDs5^U.bK;qGYm`Ekn3!/d.bReM]ROcq'hU2F^-./)p,!)W;MnDU>0)`^L<0C"64;dupO!!#I63s0+ahoJBPISiIE/<.>h!!!]r;\uTo^6+U)m/"TYQ'D&*3_@bCqpc?c1:$iJ0*&f5]B5CIU2T@K6BBD9m0`V32[Z%]!!"DWmWrMJoW=Z0.?@YUR1t"M!!"DW3XhT#I;:3%b+fQT4nB6c5X&;[Ed_NFJg-19MZa4^^Y8%$;`Pco$#=RJ-8WpO9_k2mE]h/8)'H_8cRh:($-V<$,S]B!9]h/8)'H_&4ejeQT8WpN`>.rG9)_tp,&c_pNb3r[%++9V+8_U9#hAd/TI/j6qDI2Qb2>T4,P-eB\%A"SeI/j6qDPf!h'n)Q!8_UQ3l?-FIAn13#!oT-T]S>'?;JHQ<(d-n,AH=;lVb-V5Vjasin0QE?.[%KHKn'KJ06kI0RhI1n##-*Z.\*"mT1!!"EM>'6GMI1n##-*Y\Tk/Ud/!!#WWZt4#9&[3MqEjZj1ccF7h]`J06PW3m$4Y6G1:m+FMbu,q/55,-ZPXKqt/<7FZPbaI@jciNHQE5pkmKW_?M/mWW/q16)oF7K>Q&om4@rUcJ56*sjp""=CUMgDaWJ&c@be2S@I/ne\CZYDO';"D#I8;7_`P,N8\o5gbaB&?A1"H/A>kDm,,Sg3Jmli&kq&TO/UmnZ/aD!oj1e"Uap-)m:)p#rrkcgCc5Ci8A2N1*OcNP8JYUghg+c$Eu6A]I!H!s#P?/\4W5^0Qu!@T2$1dpo$%!BDkrW3'F[5lF^*a?*poR3J[($TK/i@b0r;=Mp[USD`J-)jGu07O!&MM15P=',&>?qK)*C,bRpDIZ`6F#a4#464f8`^J]L8l?8gNIEZmT>^g2fMV6@XK,CZ"$oT.0U'GP)<)626=l0X0T$PY'?XIoY%(H-#J-]GBiIQ2#mXPA)O^?dC5I*PakaSQTAp(Rb6e;!!)RaSIWQ4D_`Uf$#BJ+K\0pN!!)Rgg9S-:lDI,/B1c'"F_[]>l0C*6T:l8caCd*:9T$R7Pbb+T_k:/;cclFijM/)A1XBmk1\tufP*2Uk?Kd`@SJ1nU$iiPDkW!0\oF7]D,t!qr3fX&GH0hjm!!!2dju3K7hf_Uio]glc0)#)X!.]YYFlB?1lZS<&o9?&,eSa_^Y5ePpKI36:7,NAa;T-9h2(/*c(]]*'Y\mt%GqFA3hg\6rP\t1o3;.&'!._rXh:*au\"Jm`pf4Ae3b.^Ff]QWB!".7$T8ncB&XB.YY#Y3FZ-U,a!#2m6[2Gl"kn/=s.S5?F7F1\\OI6j\ljEeY"KCGD8)K>Ab:5[OblMJ7<9A_K9's@Umc=sDi4N8E4n`aPWhUV[Dr7"MQJ(`";S2Bt[S!YHmV]Ye,?2=^ofgpP.9!CdDS,:Zi$EU9i5*TDFD'id%L=)"nX[4/J,!ASmM!-ouD-$H?DD/\I\O6DHnAot63op#aV=r^A^e=!HbJU!ak7KTF3pOZ$Dh%bB^V@M?a]FcWGNdEbID4eT_Ae_$j8)-GH*kf0#AuI"DX63qs7T'PW@RnWBn`%FK[IktKrX*FdI.`_f;n'@IfTOA[RI7JT@C)\oR3\sD=:t1htNqiEaRY#qDnGEE)Cl=LqDF0[bG[7mqeQ)][C:19CHr;6!+%]*eu4DY/4fBn$W^TaL.)t=g:HU_EBDMYL57bs7f=iU.*?slskI9fkG%5.N1G/Y-OaSu9/c+$tRhhmH0XiBX\%1MU?7roeq1GmMpJ3I"q.c:HO/UM[pFXSTJ&o>]0?rNR>L("<3qs;2[4,C)^E`2_J)n<19CK9,GVslAh%)X-kQa>3IYUJ+=I#+G6YA$0IBE_R+=Z+"DFjC/WcG04=N>Gprb8jt9'oZj9_`On=TiJ&SUa"cKG_dSf[?/`dmGoUSBq0,==^@-mp+8D=P_@)-*=)X-,]tQe"D>1#Yc@=a;`/Dg0or#aOPof`Nbc7?lq]/Z(N9e@h8(;fo]*D,2iPrlaIf'OH*f36$QqS>u%YC18UEefD&F8,6\QTP)A0[D)K3q1QYAbJ?!\'hmDCCf(Yo$C]5f?AXokV1cZpA]h^[sRV:Y'p)'h%)Pee"?4QFQNOehR@lWq_0cq^Ls>_Y?LnSaU;.g5,SG^OORV#0dZ\9#>_U*4C,g6tf`3[@9cZ4!8g]kVsbm.2V*!(FnoUZOu%`(JH2X]k\Qn)pRg5(`n::rGKqq:On8=\8HY]eaV.luONS!(G4gbcGSdq(DM]t7&`8B6?;BAi=QT?I17I9Ul!!#IE90K1BhqUh%*jm(D1\R4L!.a&O-R\(qD\%c?^QkUsp?tet`'-ls!)S'=YK]&AAaeip>Y3YN5I;K9+YtYB3>)=B@V,JMoGS0:U[N=O.CV+&p0=t>II+9b!!(!bk9K+WhsO*7U?_DMa3O4B!!&6+P8C=#q./+@4(1],WnNHEcX+10pA#4!J.ed+j@*)7G)j9YQ;g3IeIu4Ni%k?5Z#gg>/,GQ6;G$*)\t/^l?53:,#67#Gp/K*&d5T(.MLD+VQkT@5#67"\Q^s[grs'dDmu8V.j'Lt-2>4!Z!!%J2Od1@l>=51SOJS[P8)6R/h2m;thH*j_06M1*AF!.\?1G0YtP5NUk.,]0mANI+?'Zo[ok$31(s_=r$":\KUkP.&pZ9m]Q>\172T$31(sc%L?m:MnTEqG(6m;KZ4)?1rYQ:NZd?5]JZ(iMt@qoSC6IQ5%#J?MSL7RZ4Su8H8`eJC9ac^$+-5dJ)L\,'N#4K2up3N.!Sc!.Y-[FS1B(?MQ5M%U;nrmV"h,I7@9(o+1m%'Tt?UdFJk+,nFbb)UlS!W[a;(&#HCqIik#h707I/*2\og"ABjcTM7.&4'&d:6SEdU@62M'gaSHS/V9h!rr=`^!UafjcoP0F%HPbEV2AB5%7:R1CXmF,/')NXN!!#T$^pGE&I]?WE]t1"em+`AiVCYseqs4@a!(ghCimjV===Q6-U%Np^X#Is\Y5ePfP"K)NEUt-%U[Qq`m:-+j@&,1G"TX(cAS,N*rGl08h7KJRm^[5!F)jCh&HDgtO:HnTGsj3_aE>?5>rn%9+8bs:!!#I3i#,0`D:C`FIU:G4G4BX%VL#U"!!(Y#F-a#Co#:UUGP.--gYM<.?aW'Bp,N3T!/e"')m^U^A9@IW]qfLF-)K(k]r1[Y?N:)I(EX1bTgj[akkfa!Rrum&h>0iK*;^-F!!(!\U]i8%Ia58%91dW50DA7H[Pmii!<<+WTf!cEs6%9sdJ*R%6N@%,N+_nh!.Y.DrfGg`lhat$.9\U$m/$D=\ZsH`!!#h>N1ZGciA80B:B=?"m(1aMr6@(u!#2;1lSIu/?tAn45UncoXkUBd\&k%@fs/Vh4bDr;USUXEVFClcAVYG$31(eK;GV-4S\I1kYm5#CfO'ko_@TZQ`o'Zqg0"W!6@q/mm7!ST^WA]Z1P&_qa[8KUdFC%f*>$?^G>M,*WQ0O6$@FsVo-tYDpfm,?m6>!B/]/Qp#rrk^Yo.mJB6;Zb\YgHEfC;&-s4HmP8\U]h.PIp80=]kW6n8SDP1&UopIC79QQH%Y!WW3Kc:6#aRh:Nq^\*2sd!G-ddBqb15.An11Wmf3>Q8[iSICV(Tk\+AM7*Su4]6GMdo!!!^=o2_r.eSXjp9m]8MZBU#Jnm%g=qbCM2C.%?;VZ6\sq'.COVpFEms86Q[nI<&tT=GZL?U*)Cm[)s'b[)@f+!psf5XAPd+nN#PF)G\Nf^D7q^lGPOq9HI)FWNJk6Y9BcIu+.*!/4t2b4T\$2tIQ^#=KZV<6uXeYOc,X)Z%k.+-q1[.f]RB"A;t-[WS3V=2!BRqO"/XX]k\Q45V+Ql0u(P[2H7LPlUjb,a%oelT,HGIJ[59X49k&5.bO,X'S$`mWXG92/;QZou:;m!h;$!!#G]qq`E7C8:4ELVXVOBh`p/qqd/&"(k;4Zo[p4*rl;6`6$-CR4rPj]DaVSH=qKi`]^%,M8cI:.@i).eMlTJZ(I#C1OJATfO&@n!!*"6mYZ.Xa3APVH/]::&,Ofi?)!CA7BUCu;m1[f@'e@>4XM^bm^[WE!!%n.XR)HK$W_^=m"^fY`a/CLs'tA32u\!;(F/*:SA-g(.m*IV%0-BY?*Z1@Hh)bg*QQB>eSXljmu=j<\NV4n+-F/8IJS%gR&`Q?3^H1+=XBsT.t?barV33^,'_/P>2eZH[iuAYC'E`EUl<9FLCtEkI0Ss?0_OcF;XPdfAF@Bo;FbHV^EfHl2gqcn;E!?12Y^u0ki.a:L<\4a>rYacZl>QUm*OPKrOZuf*D8OI!<2rM6-(9La^k2iQM=+*:lIJBmT@9i1[EFIJh$bD=)d!`dJ:lbnj_^0^X0,cN]al"%08'G9t3c2j3"Y8ae?^nbf,:bi'p?)GVzz5X&l6Yi3\OT:C0%YCHN:mskB7\@2\C!!%2tN_crB3<*<+br&!5IIpimmKaS-VqJ?U5LL#W"9GFV+R$Lp$67$AE:JV$ST.h]mB@WA]l-;e56`?pu)#AlaQ^>m.UJHZd1hGf.*X&s8#fn8sR90cT_6m@Ddh:ok)OB5QBl8D[u5gah8R+,`aH3MF!<<+mKZj,cp\F!E+$=f;m+J]M%NK`ecOuSjS2iCLX``s\SN_JuaH7]#\DVs;:H`j$7gS^)UIL4Yr1>i^eg)l?0k3]Mp?fnZ)&!MZbr=O55r]i9ERb:9Hk6c/rYoJ7DV_mXEUofY*np2+X&lK2Y_a#g3$EYnM5rOPgj%OeVu?%-^Dek75WDZT"$8/0XonbCDcTE^A@-cjid,!cTYe49)L6G:S0i0/\?2n)CDPkA]nD-n\pD%/P8`34oY6:pYUK#Rr?#dmFnsnI*g2'qlFDSRc,7t3p<500>03d=e#@P1`S`mfjg(+4q45cf<(_??kF@oC&Qn(Hm/N_O)2fH"Q'9j,Q2R9L)ZbFk(&i>rHTU\/@)7KOMDu^OAEHhu%iP=_A0\0OWD/;;j+EW-.ptQ\UpF*-^ng#IeBo@TsporquS#r-\M>k@`&.'b9!0FmIRB]CEl[YIsGK`6Ue0DZ&`J9cH$/4E05on7H)s4m]Dj>./7835W,dhm_Kl45?hf5N8t[bJM):kKoVQBC<=nSo;@=Af0FBVglSn2hXtGX#Do[^Z"4-+[(e[cTLemAnL1kD_l7aZsWds=1ND9#9S>4^]=ZcIOdD5A&f[@I++reoDAsnpqQtB<3KUkpXS1#p:%NfHL'C2hd)pBKbI6E0t_kms%]Y![;*%)142RMDU7@aH-a7aJ7Zoi%:@TREqhtSK28+'4nm[*N]JZa8('J>KM@.Rhm:Wm)t&J-9:"Xe"98FP_GmR:XY?l1(]NoZ5D3`$b_BOESND%5(l5%aSU/^U-U%.P;k(Hn@fFWC`L8`(*aT<9?K0L^m^_MMCDTINF3Zf/aX<\hP@3BU'(^&0?[&qshgX%0D[LEnXhUh5n`O8J^%B`GpYUK#5Q0hBDnPU0(q:3FD`RiPkq@G>_[\aZN)X424S6uf':81_mlrI.Z=M+B.G_U[5PNrSJ+pS4L!MJY\7!.)C=T=IqWO]L7ZH]bY?r+Z_sL$#Q%uj*H7Rb])`DNR]d,0]D8Lr4++F"DO[gI\42?St-J[NuVi;WS0$N?G++87+7ZHsuCj>\nfS'\Lk$A[<>Bm?ic[:6?Gm6M2nA>nm:S0iLJdX1:pO&@`:I"gM>Aq4Jpu@F]j5>4,^Wi6,%s)s_(GlEXG.:Te#J]8U.t7BMhd1TiQ$F?sb9I.*euY8tD;*paK>[Un\T6e#M\bDo"98FP6MAY_h]-UN!M`/G:VBC\aI&pp=Nl9QX>4;a8_WYF+8$&p=jM@,NKnbe+n*d_QZ%.^jn*cT6/LQ@B,kYF68Nf9X99T%17_iP9s"Y%j*uXlI7LVk'i,Wq"rr/F68,p*0(nCDU>&mBr@N1fi;HkbPMS*a,^aL2L4lS/['Kh^%_6WHgenkHJWr14n?Z=RpEGd:PUlMaX*;Oi=CFjoTCoeL3YoUe^W*un8T,V&=sGFbk^kns7l3'@>1C=O5%=Lq)@ieabaANhb8?BHK'EiS8lOdpYUK#[Z6lu&TSn9gi:T-29Y"h!!!!+g%+7J9:%8ZqsClMFONtCeZZ^`lHD'1XBrSdgU:rXHcqY."\jhgP7T='pAumT%RrpKZ7KcX8)l1T_7rsK;OdX`Cu)[FO#c?igl_EO(LO7GZ/V)<)fA6W6aln2D/--CDp+FubEXTEpUi_5lI>=FG3d^rX4Qd\&VBN6$X]mGhZa&\TTG^basgoEP\JUDc&Y(R>1=U?m#h1Oc7hM+mFjEkC*Q6/%!1ru2r=>iY0F^KL(%eM[-@)=_o#1El)10A\`]Q`WN"kIE+,S8Q,3c3Z=HOo-,99(sKR%Xp\ojLuc9['e^$rlHA&aIq0k3ZiILeU6d+`KR4`OJHooi08R5f1q\15.1`">MpHL%]D[r)0DpCB2Eggf0PG7PcPEK=s:K*De%qee;4Vkp5D,Q*U.&*4h]Y$Lpj>Aaa#9UILWEI!HX/]&P-q<+C555!@heZ0?bKs*r?ZA-]hl`\&5GKBI/?_;\P^\m1H.4H]k+(3mH/,oL(LMQ0R$to_WEd")^%^Bqku6\uq=N08:Yg6PIDa=>p=a;'5Ohm_B'"L6`4R0UB\B\&J+]jL2/CbopQ'egrqPMW[;(C7(63@N#q(D,EZYB51GeX%Vk+7i=Eq$EO$qsWG7?J>&1WO&q;O#lR)HM-Q?Go)1^4+-72bH"[GReum+6(#'t-"6][?_)]EiudOMl'pPm@;*o6FgqB(pT!`"Aln*nM"[[3?4+/SO$338<2ib4bW#K[lO,AY0__iF[rm@C%pX>7F^^dN2m6]0MW%n7pf@Fq!(j58n)!0LQf%']3UaO,T6rE_V^pI9\)2Z3G+YoC!!!!3*dQh/B:aCGJ.@&)l),o#(HC=6jQ':?<%0CNXWS)`!!#:@Ie_lWICCP.*rDf8!!#9uaiqu![Pd%7fJa6>zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzTP4+-dq?7L~>endstream +endobj +5 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceGray /Decode [ 0 1 ] /Filter [ /ASCII85Decode /FlateDecode ] /Height 720 /Length 259 + /Subtype /Image /Type /XObject /Width 1280 +>> +stream +Gb"0;JH,ZM!5fq/lendstream +endobj +6 0 obj +<< +/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 10 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.a56a6cd78f4025a118f6eea1a939b335 4 0 R +>> +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +7 0 obj +<< +/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 10 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +8 0 obj +<< +/PageMode /UseNone /Pages 10 0 R /Type /Catalog +>> +endobj +9 0 obj +<< +/Author (\(anonymous\)) /CreationDate (D:20260717094940+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260717094940+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False +>> +endobj +10 0 obj +<< +/Count 2 /Kids [ 6 0 R 7 0 R ] /Type /Pages +>> +endobj +11 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1005 +>> +stream +Gau0Ba\pkY&A@rkqN<>$bV6Y@E_@O:KqncNQ3.q+QALHP&hTgTpZ^'r[]o9g+=09nlb.ac4?_LSTQmaW'#>E+T8Bq0$4HZP&'8XZ:LK%oPAt!M,u`X!F->A@..$Y-68!b*#BBAZ3?gF7@[/&Q':S.@D!;;BJiT`24@Q=R;6/OSM,t[2)EJ!BF;edGa]?9YSK$9FR4!IOhbo?5El"'RBBs)4_HM'=,-BZ5`(Y*HQRX$X8OnL%B?;=q@(9AR))?oc8Jeri93t"8(S'SUlcm5@jp[9`LGHASGFL)&Z/lV@BP4=j6o^'-sn:DpWG@?"a=hJUil4c_\<;tN&Di*0@GFHQRb2"=!EUC/Q>G]f3[2*ti_i[/G?EM!pSaYf"RUoLPar\"\L\.DTS+N,9ldtAdlG1gdb>=Q6I>M:]>s.So8?2LdQADafpginCd1X?rOSWn(2Q-"dCApaj^J]QUiZ(nk(S(ncj?H(3&JKO10qBQ)W,r`6I`g@'gO>#1nB'E1Ur-0%Tl8e3(ek0hch\`\5T<>Z\9Vf"/2T2lI<:aZ6NGtJS]1bI#b8k)_B.7*_9W?@Fb:)G7opLniAN?G:h3Kd?hs7b!;C5VmWfG]CRdhf4ShBp8hcZQU&hVR4X,e3ZmW^[sMesPr$VYb*G+#cZO*36!FW8g+$"J(Nd[d.Me.5I@r<:j&MWk~>endstream +endobj +12 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 746 +>> +stream +Gb"/$fl!9E'Rf-pmRsB5MPi8JYk?8#S#B?"Uo*N8_./ta(s:jZJ"JeR2Pj_VjJT"E0Z3#-NI-\?!QBs3:Ho!WjMH[6#)n0r#:>6,pAmIig2DsN8BV4d'F70tH7-S7WU<$Wd*S3Jioq:(`*aRPXb%EiKt<`8:VAHNjX^-=IR_G_72"]:$tU8%g\9ViK6s`k4lWlqWLI:9?KNNADK&)GYmoYg%`G'b0q$2!-YD'<@:1U(l_&!g[XLqiQJ?-#Ts/!q)1>++RrQ3O/_pm3(_]X6XpZn]/qWc\Qrc-iQAb4sWK)fj`LoD6Rp=2T4_!NGWe_G6R>,mL&suEc\q`m/+skDNNa/hF8Q]U*=Z4?g$C39GE](/tRs=Ppa0u$us09Mbn^&>n_YuUp69^b78)$Xf?!h>kd6Xb;'BP]>BXcV(-G*:164T;dg-M6Y\cd\t*n@Fd;KIl@aF#e_O$8K=f'sA[.3c%&TGZ"_ebIkp[>S:B)CjD8,`l0HBdpOCqcgn1R7D$/^=^EeWgK65BS+oDIV0*;)<?VmfHOA~>endstream +endobj +xref +0 13 +0000000000 65535 f +0000000073 00000 n +0000000114 00000 n +0000000221 00000 n +0000000333 00000 n +0000039046 00000 n +0000039513 00000 n +0000039771 00000 n +0000039966 00000 n +0000040035 00000 n +0000040318 00000 n +0000040384 00000 n +0000041481 00000 n +trailer +<< +/ID +[<931ae11fb0d0eab65e3b1661ff7cedff><931ae11fb0d0eab65e3b1661ff7cedff>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 9 0 R +/Root 8 0 R +/Size 13 +>> +startxref +42318 +%%EOF diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt new file mode 100644 index 0000000..cfc9eaa --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt @@ -0,0 +1,64 @@ +############################## +Sub-module: Summary +------------------------------ +Name: Total Cycles +Description: cycles use by kernel +Value: 10,581,470.54(Kcycles) +------------------------------ +Name: AP busy Duty +Description: average AP busy duty of total cycles +Value: 15.15% +############################## +Sub-module: ISU Statistics +------------------------------ +Name: ISU stall cycles layout +Description: ISU stall cycles layout +Value: { + "data": { + "wsm_stall": 38538769129.22506, + "vls_pipeline_stall": 4604570054.1626835, + "vls_wdata_stall": 72943813.86809078, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717094852/ISU_stall_cycles_layout20260717094940283.png" +} +############################## +Sub-module: Memory Statistics +------------------------------ +Name: VL1 Hit Rate +Description: hit rate of all instructions in all VL1s +Value: 87.34% +------------------------------ +Name: L2C Hit Rate +Description: hit rate of all instructions in all L2Cs +Value: 97.30% +------------------------------ +Name: Global Memory Read bytes +Description: bytes read from global memory +Value: 10,241,134,592.0byte +------------------------------ +Name: Global Memory Write bytes +Description: bytes write from global memory +Value: 4,664,074,240.0byte +############################## +Sub-module: Workgroup Memory +------------------------------ +Name: shared memory access efficiency +Description: Proportion of NON-CONFLICT access +Value: 74.04% +############################## +Sub-module: Occupancy +------------------------------ +Name: Achieved waves +Description: number of achieved waves +Value: 1,554,177.00 +------------------------------ +Name: Dispatched waves +Description: number of dispatched waves +Value: 1,554,176.0 +############################## +Sub-module: GPU Throughput Statistics +------------------------------ +Name: AP MMA Duty ratio +Description: MMA Duty ratio relative to AP active +Value: 20.12% \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt.csv b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt.csv new file mode 100644 index 0000000..afe522b --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt.csv @@ -0,0 +1,20 @@ +Name,Description,Value +Total Cycles,cycles use by kernel,"10,581,470.54(Kcycles)" +AP busy Duty,average AP busy duty of total cycles,15.15% +ISU stall cycles layout,ISU stall cycles layout,"{ + ""data"": { + ""wsm_stall"": 38538769129.22506, + ""vls_pipeline_stall"": 4604570054.1626835, + ""vls_wdata_stall"": 72943813.86809078, + ""valu_stall"": 0.0 + }, + ""filename"": ""/opt/mcProfiler-ubuntu18.04/output20260717094852/ISU_stall_cycles_layout20260717094940283.png"" +}" +VL1 Hit Rate,hit rate of all instructions in all VL1s,87.34% +L2C Hit Rate,hit rate of all instructions in all L2Cs,97.30% +Global Memory Read bytes,bytes read from global memory,"10,241,134,592.0byte" +Global Memory Write bytes,bytes write from global memory,"4,664,074,240.0byte" +shared memory access efficiency,Proportion of NON-CONFLICT access,74.04% +Achieved waves,number of achieved waves,"1,554,177.00" +Dispatched waves,number of dispatched waves,"1,554,176.0" +AP MMA Duty ratio,MMA Duty ratio relative to AP active,20.12% diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt.json new file mode 100644 index 0000000..4b11977 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report.txt.json @@ -0,0 +1,77 @@ +{ + "Summary": [ + { + "name": "Total Cycles", + "description": "cycles use by kernel", + "value": "10,581,470.54(Kcycles)" + }, + { + "name": "AP busy Duty", + "description": "average AP busy duty of total cycles", + "value": "15.15%" + } + ], + "ISU Statistics": [ + { + "name": "ISU stall cycles layout", + "description": "ISU stall cycles layout", + "value": { + "data": { + "wsm_stall": 38538769129.22506, + "vls_pipeline_stall": 4604570054.1626835, + "vls_wdata_stall": 72943813.86809078, + "valu_stall": 0.0 + }, + "filename": "/opt/mcProfiler-ubuntu18.04/output20260717094852/ISU_stall_cycles_layout20260717094940283.png" + } + } + ], + "Memory Statistics": [ + { + "name": "VL1 Hit Rate", + "description": "hit rate of all instructions in all VL1s", + "value": "87.34%" + }, + { + "name": "L2C Hit Rate", + "description": "hit rate of all instructions in all L2Cs", + "value": "97.30%" + }, + { + "name": "Global Memory Read bytes", + "description": "bytes read from global memory", + "value": "10,241,134,592.0byte" + }, + { + "name": "Global Memory Write bytes", + "description": "bytes write from global memory", + "value": "4,664,074,240.0byte" + } + ], + "Workgroup Memory": [ + { + "name": "shared memory access efficiency", + "description": "Proportion of NON-CONFLICT access", + "value": "74.04%" + } + ], + "Occupancy": [ + { + "name": "Achieved waves", + "description": "number of achieved waves", + "value": "1,554,177.00" + }, + { + "name": "Dispatched waves", + "description": "number of dispatched waves", + "value": "1,554,176.0" + } + ], + "GPU Throughput Statistics": [ + { + "name": "AP MMA Duty ratio", + "description": "MMA Duty ratio relative to AP active", + "value": "20.12%" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report_dumped_result.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report_dumped_result.json new file mode 100644 index 0000000..a071393 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report_dumped_result.json @@ -0,0 +1,85 @@ +{ + "Summary": [ + { + "data": 10581470.542, + "isError": false, + "message": "", + "name": "Total Cycles" + }, + { + "data": 15.150450682982205, + "isError": false, + "message": "", + "name": "AP busy Duty" + } + ], + "ISU Statistics": [ + { + "data": { + "wsm_stall": 38538769129.22506, + "vls_pipeline_stall": 4604570054.1626835, + "vls_wdata_stall": 72943813.86809078, + "valu_stall": 0.0 + }, + "isError": false, + "message": "", + "name": "ISU stall cycles layout" + } + ], + "Memory Statistics": [ + { + "data": 87.34268582897053, + "isError": false, + "message": "", + "name": "VL1 Hit Rate" + }, + { + "data": 97.30243733459334, + "isError": false, + "message": "", + "name": "L2C Hit Rate" + }, + { + "data": 10241134592.0, + "isError": false, + "message": "", + "name": "Global Memory Read bytes" + }, + { + "data": 4664074240.0, + "isError": false, + "message": "", + "name": "Global Memory Write bytes" + } + ], + "Workgroup Memory": [ + { + "data": 74.03645154920846, + "isError": false, + "message": "", + "name": "shared memory access efficiency" + } + ], + "Occupancy": [ + { + "data": 1554176.9999999998, + "isError": false, + "message": "", + "name": "Achieved waves" + }, + { + "data": 1554176.0, + "isError": false, + "message": "", + "name": "Dispatched waves" + } + ], + "GPU Throughput Statistics": [ + { + "data": 20.12025201963649, + "isError": false, + "message": "", + "name": "AP MMA Duty ratio" + } + ] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report_js.html b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report_js.html new file mode 100644 index 0000000..0a3fd7a --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mcprofiler_opt012_case4_targeted/report_js.html @@ -0,0 +1,49 @@ + +

+

+
+ Sub-module: Summary +
+

+
+
+
+

+
+ Sub-module: ISU Statistics +
+

+
+
+
+

+
+ Sub-module: Memory Statistics +
+

+
+
+
+

+
+ Sub-module: Workgroup Memory +
+

+
+
+
+

+
+ Sub-module: Occupancy +
+

+
+
+
+

+
+ Sub-module: GPU Throughput Statistics +
+

+
+
\ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mctracer_opt012_case4/tracer_out-98428.json b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mctracer_opt012_case4/tracer_out-98428.json new file mode 100644 index 0000000..4b81705 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/mctracer_opt012_case4/tracer_out-98428.json @@ -0,0 +1,6997 @@ +{ +"traceEvents": [ +{ + "args": { + "name": "C500", + "version": "0.0.1" + }, + "cat": "__metadata", + "ph": "M", + "name": "process_name", + "pid": 2 +},{ + "args": { + "co_id": 1, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98515 + }, + "ph": "X", + "ts": 1784280205246989804, + "dur": 13877, + "name": "mcInit", + "pid": 1, + "tid": 98515 +} +,{ + "args": { + "co_id": 2, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205246993318, + "dur": 11146, + "name": "mcGetDeviceCount", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 3, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98515 + }, + "ph": "X", + "ts": 1784280205247969586, + "dur": 787, + "name": "mcInit", + "pid": 1, + "tid": 98515 +} +,{ + "args": { + "co_id": 4, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98515 + }, + "ph": "X", + "ts": 1784280205247971145, + "dur": 218, + "name": "mcInit", + "pid": 1, + "tid": 98515 +} +,{ + "args": { + "co_id": 5, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98515 + }, + "ph": "X", + "ts": 1784280205248003525, + "dur": 183, + "name": "mcInit", + "pid": 1, + "tid": 98515 +} +,{ + "args": { + "co_id": 6, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205882271366, + "dur": 5815, + "name": "mcGetDeviceCount", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 7, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205882348038, + "dur": 669, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 8, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205882351964, + "dur": 166, + "name": "mcGetDeviceCount", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 9, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205882458317, + "dur": 1762, + "name": "mcDevicePrimaryCtxGetState", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 10, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205882466365, + "dur": 234, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 11, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205882467015, + "dur": 173, + "name": "mcDevicePrimaryCtxGetState", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 12, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205882472813, + "dur": 157, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 13, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205882473233, + "dur": 120, + "name": "mcDevicePrimaryCtxGetState", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 14, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205896783311, + "dur": 5350, + "name": "mcGetDeviceProperties", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 15, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205897689986, + "dur": 1563, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 16, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205897695256, + "dur": 765, + "name": "mcDevicePrimaryCtxGetState", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 17, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205897863141, + "dur": 234, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 18, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205897875862, + "dur": 123, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 19, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205897885788, + "dur": 123, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 20, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205897905796, + "dur": 572, + "name": "mcDeviceGetStreamPriorityRange", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 21, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205897940113, + "dur": 190, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 22, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205897946626, + "dur": 7881, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 23, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205897965608, + "dur": 125325, + "name": "mcMalloc", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 24, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898117562, + "dur": 300, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 25, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898123223, + "dur": 143, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 26, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898161181, + "dur": 140, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 27, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898187060, + "dur": 138, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 28, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898241301, + "dur": 167, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 29, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898242382, + "dur": 115, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 30, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898243321, + "dur": 120, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 31, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898244218, + "dur": 414, + "name": "mcDevicePrimaryCtxGetState", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 32, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898245389, + "dur": 179, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 33, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898253483, + "dur": 514, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 34, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898254625, + "dur": 118, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 35, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898255006, + "dur": 149, + "name": "mcDevicePrimaryCtxGetState", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 36, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898255568, + "dur": 115, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 37, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898255991, + "dur": 185, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 38, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898257217, + "dur": 117, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 256, + "y": 1, + "z": 1 + }, + "co_id": 39, + "complete_ts": 1784280205903954690, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 832, + "y": 1, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 256, + "mem": { + "dynamic_shared": 0, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 44, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 8, + "name": "_ZN2at6native12_GLOBAL__N_147distribution_elementwise_grid_stride_kernel_optIN3c108BFloat16EfLi4EZNS0_9templates4cuda20normal_and_transformIS4_fPNS_17CUDAGeneratorImplEZZZNS6_13normal_kernelIS9_EEvRKNS_10TensorBaseEddT_ENKUlvE_clEvENKUlvE2_clEvEUlfE_EEvRNS_18TensorIteratorBaseET1_T2_EUlP24mcrandStatePhilox4_32_10E0_SH_EEvPSE_iNS_15PhiloxCudaStateESL_T3_", + "queue_id": 0, + "queue_ts": 1784280205901485612, + "shared_memeory_occupancy(%)": 0, + "submit_ts": 1784280205901496348 + }, + "ph": "X", + "ts": 1784280205901799424, + "dur": 1635584, + "name": "void at::native::(anonymous namespace)::distribution_elementwise_grid_stride_kernel_opt(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1}>(at::TensorIteratorBase&, at::CUDAGeneratorImpl*, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1})::{lambda(mcrandStatePhilox4_32_10*)#2}, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1}>(c10::BFloat16*, int, at::PhiloxCudaState, at::native::templates::cuda::normal_and_transform(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1}>(at::TensorIteratorBase&, at::CUDAGeneratorImpl*, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1})::{lambda(mcrandStatePhilox4_32_10*)#2}, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1})", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777255, + "ts": 1784280205901799424, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 39, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205898265971, + "dur": 3224484, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777255, + "ts": 1784280205898265971, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 40, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901497998, + "dur": 365, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 41, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901534257, + "dur": 251, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 42, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901536275, + "dur": 124, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 43, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901538059, + "dur": 120, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 44, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901543705, + "dur": 132, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 45, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901544665, + "dur": 567, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 46, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901546122, + "dur": 52987, + "name": "mcMalloc", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 47, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901607379, + "dur": 289, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 48, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901608505, + "dur": 119, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 49, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901610048, + "dur": 121, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 50, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901611861, + "dur": 123, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 51, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901620676, + "dur": 126, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 52, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901621531, + "dur": 121, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 53, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901622145, + "dur": 126, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 54, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901623396, + "dur": 420, + "name": "mcDevicePrimaryCtxGetState", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 55, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901624567, + "dur": 119, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 56, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901625408, + "dur": 309, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 57, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901626132, + "dur": 121, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 58, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901626523, + "dur": 128, + "name": "mcDevicePrimaryCtxGetState", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 59, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901628045, + "dur": 117, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 60, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901628578, + "dur": 190, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 61, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901629609, + "dur": 117, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 256, + "y": 1, + "z": 1 + }, + "co_id": 62, + "complete_ts": 1784280205903964784, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 832, + "y": 1, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 256, + "mem": { + "dynamic_shared": 0, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 44, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 8, + "name": "_ZN2at6native12_GLOBAL__N_147distribution_elementwise_grid_stride_kernel_optIN3c108BFloat16EfLi4EZNS0_9templates4cuda20normal_and_transformIS4_fPNS_17CUDAGeneratorImplEZZZNS6_13normal_kernelIS9_EEvRKNS_10TensorBaseEddT_ENKUlvE_clEvENKUlvE2_clEvEUlfE_EEvRNS_18TensorIteratorBaseET1_T2_EUlP24mcrandStatePhilox4_32_10E0_SH_EEvPSE_iNS_15PhiloxCudaStateESL_T3_", + "queue_id": 0, + "queue_ts": 1784280205901639708, + "shared_memeory_occupancy(%)": 0, + "submit_ts": 1784280205901794687 + }, + "ph": "X", + "ts": 1784280205903441408, + "dur": 224000, + "name": "void at::native::(anonymous namespace)::distribution_elementwise_grid_stride_kernel_opt(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1}>(at::TensorIteratorBase&, at::CUDAGeneratorImpl*, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1})::{lambda(mcrandStatePhilox4_32_10*)#2}, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1}>(c10::BFloat16*, int, at::PhiloxCudaState, at::native::templates::cuda::normal_and_transform(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1}>(at::TensorIteratorBase&, at::CUDAGeneratorImpl*, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1})::{lambda(mcrandStatePhilox4_32_10*)#2}, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1})", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777278, + "ts": 1784280205903441408, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 62, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901631313, + "dur": 9233, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777278, + "ts": 1784280205901631313, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 63, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901641485, + "dur": 121, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 64, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901769952, + "dur": 175, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 65, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901771769, + "dur": 117, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 66, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901773797, + "dur": 124, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 67, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901775373, + "dur": 122, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 68, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901775980, + "dur": 191, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 69, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901776836, + "dur": 28043, + "name": "mcMalloc", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 70, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901809218, + "dur": 171, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 71, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901810011, + "dur": 119, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 72, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901812629, + "dur": 126, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 73, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901813106, + "dur": 123, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 74, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901815027, + "dur": 126, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 75, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901815413, + "dur": 121, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 76, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901815941, + "dur": 122, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 77, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901816492, + "dur": 147, + "name": "mcDevicePrimaryCtxGetState", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 78, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901816913, + "dur": 120, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 79, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901817493, + "dur": 173, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 80, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901818041, + "dur": 123, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 81, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901818403, + "dur": 154, + "name": "mcDevicePrimaryCtxGetState", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 82, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901818923, + "dur": 120, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 83, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901819308, + "dur": 141, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 84, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901819939, + "dur": 119, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 256, + "y": 1, + "z": 1 + }, + "co_id": 85, + "complete_ts": 1784280205903966578, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 832, + "y": 1, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 256, + "mem": { + "dynamic_shared": 0, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 44, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 8, + "name": "_ZN2at6native12_GLOBAL__N_147distribution_elementwise_grid_stride_kernel_optIN3c108BFloat16EfLi4EZNS0_9templates4cuda20normal_and_transformIS4_fPNS_17CUDAGeneratorImplEZZZNS6_13normal_kernelIS9_EEvRKNS_10TensorBaseEddT_ENKUlvE_clEvENKUlvE2_clEvEUlfE_EEvRNS_18TensorIteratorBaseET1_T2_EUlP24mcrandStatePhilox4_32_10E0_SH_EEvPSE_iNS_15PhiloxCudaStateESL_T3_", + "queue_id": 0, + "queue_ts": 1784280205901826771, + "shared_memeory_occupancy(%)": 0, + "submit_ts": 1784280205901828854 + }, + "ph": "X", + "ts": 1784280205903671296, + "dur": 221184, + "name": "void at::native::(anonymous namespace)::distribution_elementwise_grid_stride_kernel_opt(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1}>(at::TensorIteratorBase&, at::CUDAGeneratorImpl*, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1})::{lambda(mcrandStatePhilox4_32_10*)#2}, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1}>(c10::BFloat16*, int, at::PhiloxCudaState, at::native::templates::cuda::normal_and_transform(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1}>(at::TensorIteratorBase&, at::CUDAGeneratorImpl*, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1})::{lambda(mcrandStatePhilox4_32_10*)#2}, at::native::templates::cuda::normal_kernel(at::TensorBase const&, double, double, at::CUDAGeneratorImpl*)::{lambda()#1}::operator()() const::{lambda()#4}::operator()() const::{lambda(float)#1})", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777301, + "ts": 1784280205903671296, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 85, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901820615, + "dur": 7458, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777301, + "ts": 1784280205901820615, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 86, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901828653, + "dur": 126, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 87, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901850371, + "dur": 174, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 88, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901851021, + "dur": 119, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 89, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901851522, + "dur": 418, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 90, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901853699, + "dur": 172, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 91, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901854139, + "dur": 159, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 92, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901854633, + "dur": 23450, + "name": "mcMalloc", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 93, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901885629, + "dur": 194, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 94, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901886265, + "dur": 124, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 95, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205901980476, + "dur": 282, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 96, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205902026399, + "dur": 169, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 97, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205902027034, + "dur": 121, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 98, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205902027709, + "dur": 121, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 99, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205902028862, + "dur": 125, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 100, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205902029290, + "dur": 175, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 101, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205902029809, + "dur": 24161, + "name": "mcMalloc", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 102, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205902056900, + "dur": 172, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 103, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205902057448, + "dur": 117, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 104, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205902098892, + "dur": 143, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 105, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205902106318, + "dur": 118, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "bytes": 8, + "chnl_id": 0, + "chnl_type": 11, + "co_id": 106, + "copy_kind": 1, + "device_id": 0, + "dst_kind": 3, + "flags": 1, + "kind": 1, + "link": true, + "src_kind": 2, + "stream_id": 0 + }, + "ph": "X", + "ts": 1784280205903897856, + "dur": 49408, + "name": "memcpy HTOD(pinned,device)", + "pid": 3, + "cat": "0", + "tid": 0 +} +,{ + "ph": "f", + "id": 16777322, + "ts": 1784280205903897856, + "name": "Launch", + "pid": 3, + "bp": "e", + "cat": "Launch", + "tid": 0 +} +,{ + "args": { + "co_id": 106, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205902113933, + "dur": 1863987, + "name": "mcMemcpyAsync", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777322, + "ts": 1784280205902113933, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 107, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205903980613, + "dur": 3634, + "name": "mcStreamSynchronize", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 108, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280205903985926, + "dur": 171, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 109, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280209966542068, + "dur": 4306, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 110, + "complete_ts": 1784280210012812058, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280209966768495, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280209966781224 + }, + "ph": "X", + "ts": 1784280209966798080, + "dur": 45982464, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777326, + "ts": 1784280209966798080, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 110, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280209966680845, + "dur": 95385, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777326, + "ts": 1784280209966680845, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 111, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280209966778008, + "dur": 322, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 112, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280209966810042, + "dur": 318, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 113, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280209966814983, + "dur": 130, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 114, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280209966833628, + "dur": 45993155, + "name": "mcDeviceSynchronize", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 115, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210012831666, + "dur": 250, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 116, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210012854703, + "dur": 133, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 117, + "complete_ts": 1784280210473149827, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210012904408, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210012906926 + }, + "ph": "X", + "ts": 1784280210012914432, + "dur": 45993472, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777333, + "ts": 1784280210012914432, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 117, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210012895651, + "dur": 11041, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777333, + "ts": 1784280210012895651, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 118, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210012907260, + "dur": 226, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 119, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210012919645, + "dur": 200, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 120, + "complete_ts": 1784280210473153793, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210012954277, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210012955623 + }, + "ph": "X", + "ts": 1784280210058910720, + "dur": 46011392, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777336, + "ts": 1784280210058910720, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 120, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210012949742, + "dur": 5291, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777336, + "ts": 1784280210012949742, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 121, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210012955452, + "dur": 111, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 122, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210012963636, + "dur": 150, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 123, + "complete_ts": 1784280210473156087, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210012995789, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210012997015 + }, + "ph": "X", + "ts": 1784280210104924928, + "dur": 46029568, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777339, + "ts": 1784280210104924928, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 123, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210012991747, + "dur": 4719, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777339, + "ts": 1784280210012991747, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 124, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210012996696, + "dur": 145, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 125, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013004580, + "dur": 244, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 126, + "complete_ts": 1784280210473157854, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210013042596, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210013044117 + }, + "ph": "X", + "ts": 1784280210150957056, + "dur": 46014976, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777342, + "ts": 1784280210150957056, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 126, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013032495, + "dur": 11181, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777342, + "ts": 1784280210013032495, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 127, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013044063, + "dur": 139, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 128, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013051052, + "dur": 163, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 129, + "complete_ts": 1784280210473159493, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210013080660, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210013081847 + }, + "ph": "X", + "ts": 1784280210196974848, + "dur": 46018048, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777345, + "ts": 1784280210196974848, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 129, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013076870, + "dur": 4509, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777345, + "ts": 1784280210013076870, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 130, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013081733, + "dur": 110, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 131, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013087992, + "dur": 160, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 132, + "complete_ts": 1784280210473161010, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210013117154, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210013118768 + }, + "ph": "X", + "ts": 1784280210242995456, + "dur": 46004736, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777348, + "ts": 1784280210242995456, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 132, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013113744, + "dur": 4524, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777348, + "ts": 1784280210013113744, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 133, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013118490, + "dur": 120, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 134, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013124554, + "dur": 164, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 135, + "complete_ts": 1784280210473162551, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210013153623, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210013154959 + }, + "ph": "X", + "ts": 1784280210289002752, + "dur": 46028032, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777351, + "ts": 1784280210289002752, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 135, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013150253, + "dur": 4225, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777351, + "ts": 1784280210013150253, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 136, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013154706, + "dur": 114, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 137, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013160653, + "dur": 173, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 138, + "complete_ts": 1784280210473164117, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210013189847, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210013190931 + }, + "ph": "X", + "ts": 1784280210335033600, + "dur": 46027776, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777354, + "ts": 1784280210335033600, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 138, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013186137, + "dur": 4323, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777354, + "ts": 1784280210013186137, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 139, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013190687, + "dur": 117, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 140, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013196728, + "dur": 203, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 141, + "complete_ts": 1784280210473165897, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210013225819, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210013226997 + }, + "ph": "X", + "ts": 1784280210381064192, + "dur": 46023168, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777357, + "ts": 1784280210381064192, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 141, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013222202, + "dur": 4283, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777357, + "ts": 1784280210013222202, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 142, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013226708, + "dur": 114, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 143, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013232815, + "dur": 167, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 144, + "complete_ts": 1784280210473167650, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210013262129, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210013263580 + }, + "ph": "X", + "ts": 1784280210427090176, + "dur": 46013440, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777360, + "ts": 1784280210427090176, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 144, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013258244, + "dur": 4605, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777360, + "ts": 1784280210013258244, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 145, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013263074, + "dur": 117, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 146, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013275373, + "dur": 164, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 147, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013278958, + "dur": 148, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 148, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210013280518, + "dur": 459896844, + "name": "mcDeviceSynchronize", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 149, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473181115, + "dur": 331, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 150, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473229678, + "dur": 196, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 151, + "complete_ts": 1784280211393645703, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473285107, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473291416 + }, + "ph": "X", + "ts": 1784280210473299968, + "dur": 45995008, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777367, + "ts": 1784280210473299968, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 151, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473270240, + "dur": 17877, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777367, + "ts": 1784280210473270240, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 152, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473288680, + "dur": 231, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 153, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473299502, + "dur": 180, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 154, + "complete_ts": 1784280211393649683, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473333431, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473334612 + }, + "ph": "X", + "ts": 1784280210519297792, + "dur": 46029312, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777370, + "ts": 1784280210519297792, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 154, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473329172, + "dur": 5078, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777370, + "ts": 1784280210473329172, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 155, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473334480, + "dur": 146, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 156, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473342005, + "dur": 162, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 157, + "complete_ts": 1784280211393651438, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473372291, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473373578 + }, + "ph": "X", + "ts": 1784280210565329920, + "dur": 46009856, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777373, + "ts": 1784280210565329920, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 157, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473368553, + "dur": 4602, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777373, + "ts": 1784280210473368553, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 158, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473373497, + "dur": 138, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 159, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473380059, + "dur": 176, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 160, + "complete_ts": 1784280211393653348, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473409618, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473411078 + }, + "ph": "X", + "ts": 1784280210611342592, + "dur": 45999104, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777376, + "ts": 1784280210611342592, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 160, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473405936, + "dur": 4843, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777376, + "ts": 1784280210473405936, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 161, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473411114, + "dur": 110, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 162, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473417595, + "dur": 171, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 163, + "complete_ts": 1784280211393655350, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473446829, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473448116 + }, + "ph": "X", + "ts": 1784280210657344512, + "dur": 46006528, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777379, + "ts": 1784280210657344512, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 163, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473443340, + "dur": 4341, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777379, + "ts": 1784280210473443340, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 164, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473447905, + "dur": 112, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 165, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473454071, + "dur": 175, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 166, + "complete_ts": 1784280211393656882, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473483286, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473484315 + }, + "ph": "X", + "ts": 1784280210703353856, + "dur": 46003200, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777382, + "ts": 1784280210703353856, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 166, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473479799, + "dur": 4120, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777382, + "ts": 1784280210473479799, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 167, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473484143, + "dur": 116, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 168, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473490265, + "dur": 177, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 169, + "complete_ts": 1784280211393658713, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473519412, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473520950 + }, + "ph": "X", + "ts": 1784280210749359616, + "dur": 46014208, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777385, + "ts": 1784280210749359616, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 169, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473515871, + "dur": 4523, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777385, + "ts": 1784280210473515871, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 170, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473520624, + "dur": 115, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 171, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473526999, + "dur": 171, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 172, + "complete_ts": 1784280211393660508, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473556179, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473557370 + }, + "ph": "X", + "ts": 1784280210795376640, + "dur": 45997312, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777388, + "ts": 1784280210795376640, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 172, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473552491, + "dur": 4609, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777388, + "ts": 1784280210473552491, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 173, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473557324, + "dur": 115, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 174, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473563265, + "dur": 177, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 175, + "complete_ts": 1784280211393662145, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473592412, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473593792 + }, + "ph": "X", + "ts": 1784280210841376768, + "dur": 46011392, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777391, + "ts": 1784280210841376768, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 175, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473588727, + "dur": 4568, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777391, + "ts": 1784280210473588727, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 176, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473593526, + "dur": 114, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 177, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473599513, + "dur": 169, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 178, + "complete_ts": 1784280211393663857, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473628617, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473629876 + }, + "ph": "X", + "ts": 1784280210887390976, + "dur": 46017280, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777394, + "ts": 1784280210887390976, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 178, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473624822, + "dur": 4476, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777394, + "ts": 1784280210473624822, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 179, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473629526, + "dur": 115, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 180, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473635547, + "dur": 177, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 181, + "complete_ts": 1784280211393665823, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473664490, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473665772 + }, + "ph": "X", + "ts": 1784280210933411072, + "dur": 45990144, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777397, + "ts": 1784280210933411072, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 181, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473661051, + "dur": 4372, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777397, + "ts": 1784280210473661051, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 182, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473665653, + "dur": 111, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 183, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473671822, + "dur": 179, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 184, + "complete_ts": 1784280211393667456, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473701050, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473702464 + }, + "ph": "X", + "ts": 1784280210979404032, + "dur": 46020352, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777400, + "ts": 1784280210979404032, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 184, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473697291, + "dur": 4730, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777400, + "ts": 1784280210473697291, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 185, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473702245, + "dur": 120, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 186, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473708194, + "dur": 171, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 187, + "complete_ts": 1784280211393668799, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473737292, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473738497 + }, + "ph": "X", + "ts": 1784280211025427200, + "dur": 46040576, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777403, + "ts": 1784280211025427200, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 187, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473733621, + "dur": 4316, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777403, + "ts": 1784280210473733621, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 188, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473738160, + "dur": 112, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 189, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473744470, + "dur": 177, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 190, + "complete_ts": 1784280211393669875, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473773299, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473774839 + }, + "ph": "X", + "ts": 1784280211071470592, + "dur": 46025728, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777406, + "ts": 1784280211071470592, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 190, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473769701, + "dur": 4474, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777406, + "ts": 1784280210473769701, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 191, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473774398, + "dur": 116, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 192, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473780413, + "dur": 168, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 193, + "complete_ts": 1784280211393671410, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473809943, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473811243 + }, + "ph": "X", + "ts": 1784280211117499136, + "dur": 46016000, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777409, + "ts": 1784280211117499136, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 193, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473805907, + "dur": 4794, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777409, + "ts": 1784280210473805907, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 194, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473810930, + "dur": 114, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 195, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473817274, + "dur": 177, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 196, + "complete_ts": 1784280211393672985, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473846804, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473848293 + }, + "ph": "X", + "ts": 1784280211163517952, + "dur": 46036736, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777412, + "ts": 1784280211163517952, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 196, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473842770, + "dur": 5136, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777412, + "ts": 1784280210473842770, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 197, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473848132, + "dur": 119, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 198, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473854145, + "dur": 175, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 199, + "complete_ts": 1784280211393674368, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473883359, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473884752 + }, + "ph": "X", + "ts": 1784280211209557504, + "dur": 46023936, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777415, + "ts": 1784280211209557504, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 199, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473879520, + "dur": 4776, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777415, + "ts": 1784280210473879520, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 200, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473884528, + "dur": 117, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 201, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473890459, + "dur": 168, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 202, + "complete_ts": 1784280211393676123, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473919516, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473921007 + }, + "ph": "X", + "ts": 1784280211255584256, + "dur": 46000640, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777418, + "ts": 1784280211255584256, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 202, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473915848, + "dur": 4582, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777418, + "ts": 1784280210473915848, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 203, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473920660, + "dur": 113, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 204, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473926832, + "dur": 177, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 205, + "complete_ts": 1784280211393677863, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473956283, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473957806 + }, + "ph": "X", + "ts": 1784280211301587712, + "dur": 45988096, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777421, + "ts": 1784280211301587712, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 205, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473952293, + "dur": 4855, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777421, + "ts": 1784280210473952293, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 206, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473957374, + "dur": 116, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 207, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473963334, + "dur": 177, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 208, + "complete_ts": 1784280211393679545, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1024, + "y": 4, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 53248, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 254, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 49, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "queue_id": 0, + "queue_ts": 1784280210473992498, + "shared_memeory_occupancy(%)": 81, + "submit_ts": 1784280210473993694 + }, + "ph": "X", + "ts": 1784280211347578624, + "dur": 46038784, + "name": "packed_kernel_dense_softmax_cleanup_v12_kernel", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777424, + "ts": 1784280211347578624, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 208, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473988764, + "dur": 4435, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777424, + "ts": 1784280210473988764, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 209, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210473993424, + "dur": 111, + "name": "mcGetLastError", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 210, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210474002873, + "dur": 165, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 211, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210474004721, + "dur": 132, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 212, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280210474005919, + "dur": 919684684, + "name": "mcDeviceSynchronize", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 213, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393695391, + "dur": 235, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 214, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393838799, + "dur": 232, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 215, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393842920, + "dur": 120, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 216, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393850364, + "dur": 120, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 217, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393856311, + "dur": 125, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 218, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393857160, + "dur": 118, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 219, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393877167, + "dur": 126, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 220, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393926576, + "dur": 148, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 221, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393927233, + "dur": 114, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 222, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393938406, + "dur": 123, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 223, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393940541, + "dur": 908, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 224, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211393943854, + "dur": 64297, + "name": "mcMalloc", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 225, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394015734, + "dur": 208, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 226, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394047164, + "dur": 175, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 256, + "y": 1, + "z": 1 + }, + "co_id": 227, + "complete_ts": 1784280211400266898, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 32768, + "y": 1, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 256, + "mem": { + "dynamic_shared": 0, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 18, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 3, + "name": "_ZN2at6native29vectorized_elementwise_kernelILi4ENS0_10AbsFunctorIN3c108BFloat16EEESt5arrayIPcLm2EEEEviT0_T1_", + "queue_id": 0, + "queue_ts": 1784280211394565912, + "shared_memeory_occupancy(%)": 0, + "submit_ts": 1784280211394574494 + }, + "ph": "X", + "ts": 1784280211394586112, + "dur": 198144, + "name": "void at::native::vectorized_elementwise_kernel<4, at::native::AbsFunctor, std::array >(int, at::native::AbsFunctor, std::array)", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777443, + "ts": 1784280211394586112, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 227, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394050780, + "dur": 519631, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777443, + "ts": 1784280211394050780, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 228, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394574623, + "dur": 343, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 229, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394654206, + "dur": 255, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 230, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394655859, + "dur": 117, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 231, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394657256, + "dur": 117, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 232, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394661615, + "dur": 126, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 233, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394662610, + "dur": 439, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 234, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394663673, + "dur": 30242, + "name": "mcMalloc", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 235, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394697141, + "dur": 189, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 236, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394728687, + "dur": 179, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 256, + "y": 1, + "z": 1 + }, + "co_id": 237, + "complete_ts": 1784280211400270450, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 32768, + "y": 1, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 256, + "mem": { + "dynamic_shared": 0, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 32, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 6, + "name": "_ZN2at6native29vectorized_elementwise_kernelILi4ENS0_13AUnaryFunctorIN3c108BFloat16ES4_bNS0_12_GLOBAL__N_116CompareEqFunctorIS4_EEEESt5arrayIPcLm2EEEEviT0_T1_", + "queue_id": 0, + "queue_ts": 1784280211395852193, + "shared_memeory_occupancy(%)": 0, + "submit_ts": 1784280211395858309 + }, + "ph": "X", + "ts": 1784280211395866880, + "dur": 155392, + "name": "void at::native::vectorized_elementwise_kernel<4, at::native::AUnaryFunctor >, std::array >(int, at::native::AUnaryFunctor >, std::array)", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777453, + "ts": 1784280211395866880, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 237, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211394730115, + "dur": 1125667, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777453, + "ts": 1784280211394730115, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 238, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211395860447, + "dur": 378, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 239, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211395917451, + "dur": 190, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 240, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211395919358, + "dur": 224, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 241, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211395920606, + "dur": 118, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 242, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211395925184, + "dur": 125, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 243, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211395926423, + "dur": 359, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 244, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211395927432, + "dur": 32292, + "name": "mcMalloc", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 245, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211395963660, + "dur": 162, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 246, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211395970162, + "dur": 121, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 256, + "y": 1, + "z": 1 + }, + "co_id": 247, + "complete_ts": 1784280211400272108, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 32768, + "y": 1, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 256, + "mem": { + "dynamic_shared": 0, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 32, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 6, + "name": "_ZN2at6native29vectorized_elementwise_kernelILi4ENS0_13BinaryFunctorIN3c108BFloat16ES4_bNS0_12_GLOBAL__N_116CompareEqFunctorIS4_EEEESt5arrayIPcLm3EEEEviT0_T1_", + "queue_id": 0, + "queue_ts": 1784280211396002697, + "shared_memeory_occupancy(%)": 0, + "submit_ts": 1784280211396007805 + }, + "ph": "X", + "ts": 1784280211396025344, + "dur": 161280, + "name": "void at::native::vectorized_elementwise_kernel<4, at::native::BinaryFunctor >, std::array >(int, at::native::BinaryFunctor >, std::array)", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777463, + "ts": 1784280211396025344, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 247, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211395971709, + "dur": 32610, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777463, + "ts": 1784280211395971709, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 248, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211396004926, + "dur": 124, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 249, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211396035263, + "dur": 155, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 250, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211396035963, + "dur": 114, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 251, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211396036370, + "dur": 119, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 252, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211396037731, + "dur": 119, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 253, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211396038170, + "dur": 196, + "name": "mcStreamIsCapturing", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 254, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211396038830, + "dur": 19984, + "name": "mcMalloc", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 255, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211396061552, + "dur": 788, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 256, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211396079455, + "dur": 126, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 257, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211396080337, + "dur": 117, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 256, + "y": 1, + "z": 1 + }, + "co_id": 258, + "complete_ts": 1784280211400273825, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 32768, + "y": 1, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 256, + "mem": { + "dynamic_shared": 0, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 32, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 6, + "name": "_ZN2at6native29vectorized_elementwise_kernelILi4ENS0_13BinaryFunctorIbbbNS0_15binary_internal10MulFunctorIbEEEENS_6detail5ArrayIPcLi3EEEEEviT0_T1_", + "queue_id": 0, + "queue_ts": 1784280211397620652, + "shared_memeory_occupancy(%)": 0, + "submit_ts": 1784280211397627086 + }, + "ph": "X", + "ts": 1784280211397635328, + "dur": 145920, + "name": "void at::native::vectorized_elementwise_kernel<4, at::native::BinaryFunctor >, at::detail::Array >(int, at::native::BinaryFunctor >, at::detail::Array)", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777474, + "ts": 1784280211397635328, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 258, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211396081447, + "dur": 1542936, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777474, + "ts": 1784280211396081447, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 259, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397627985, + "dur": 574, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 260, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397748512, + "dur": 390, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 261, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397750456, + "dur": 113, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 262, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397751606, + "dur": 117, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 263, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397755356, + "dur": 127, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 264, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397844203, + "dur": 140, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 265, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397845583, + "dur": 114, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 266, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397846243, + "dur": 121, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 267, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397849965, + "dur": 116, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 268, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397850628, + "dur": 116, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 269, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397851230, + "dur": 113, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 270, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397860167, + "dur": 126, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 271, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397860680, + "dur": 115, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 272, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397861079, + "dur": 118, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 273, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397861777, + "dur": 120, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 274, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397862285, + "dur": 113, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 275, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397862650, + "dur": 113, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 276, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397863600, + "dur": 117, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 277, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397864391, + "dur": 113, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 278, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397869427, + "dur": 312, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 279, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397870800, + "dur": 116, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 280, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397873922, + "dur": 119, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 64, + "y": 1, + "z": 1 + }, + "co_id": 281, + "complete_ts": 1784280211400275707, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1, + "y": 1, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 0, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 12, + "static_shared": 0 + }, + "mtreg_occupancy(%)": 2, + "name": "_ZN2at6native21semaphores_reset_implEPii", + "queue_id": 0, + "queue_ts": 1784280211397929924, + "shared_memeory_occupancy(%)": 0, + "submit_ts": 1784280211397935817 + }, + "ph": "X", + "ts": 1784280211397943552, + "dur": 3840, + "name": "at::native::semaphores_reset_impl(int*, int)", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777497, + "ts": 1784280211397943552, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 281, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397874870, + "dur": 56961, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777497, + "ts": 1784280211397874870, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "block": { + "x": 512, + "y": 1, + "z": 1 + }, + "co_id": 282, + "complete_ts": 1784280211400277130, + "device_id": 0, + "dispatch_id": 0, + "grid": { + "x": 1, + "y": 512, + "z": 1 + }, + "hw_queue_id": [2], + "is_dynamic_parallel": false, + "is_recompiled": false, + "launch_type": 0, + "link": true, + "max_block_size": 512, + "mem": { + "dynamic_shared": 520, + "private_per_thread": 0, + "private_total": 0, + "registers_per_thread": 21, + "static_shared": 4 + }, + "mtreg_occupancy(%)": 4, + "name": "_ZN2at6native36InputPerOutputContinuousReduceKernelIbbbLi8ELb1ELb0ENS0_14func_wrapper_tIbZZZNS0_15and_kernel_cudaERNS_14TensorIteratorEENKUlvE_clEvENKUlvE10_clEvEUlbbE_EENS0_6reduce16OffsetCalculatorILi1EjLb0EEENSA_ILi2EjLb0EEEEENSt9enable_ifIXooaaaantsr3std7is_sameIT1_N6thrust4pairIT_lEEEE5valuentsr3std7is_sameISE_NSG_IT0_lEEEE5valuentsr3std7is_sameISE_NSG_IflEEEE5valuesr3std7is_sameISE_NSG_IllEEEE5valueEvE4typeEPKSH_T5_SE_iiT6_T7_ibPKcSV_PvPiSW_lbb", + "queue_id": 0, + "queue_ts": 1784280211400080768, + "shared_memeory_occupancy(%)": 0, + "submit_ts": 1784280211400086790 + }, + "ph": "X", + "ts": 1784280211400097024, + "dur": 79104, + "name": "std::enable_if<(((!std::is_same >::value)&&(!std::is_same >::value))&&(!std::is_same >::value))||std::is_same >::value, void>::type at::native::InputPerOutputContinuousReduceKernel, at::native::reduce::OffsetCalculator<1, unsigned int, false>, at::native::reduce::OffsetCalculator<2, unsigned int, false> >(bool const*, at::native::func_wrapper_t, bool, int, int, at::native::reduce::OffsetCalculator<1, unsigned int, false>, at::native::reduce::OffsetCalculator<2, unsigned int, false>, int, bool, char const*, char const*, void*, int*, void*, long, bool, bool)", + "pid": 2, + "cat": "0", + "tid": 1024 +} +,{ + "ph": "f", + "id": 16777498, + "ts": 1784280211400097024, + "name": "Launch", + "pid": 2, + "bp": "e", + "cat": "Launch", + "tid": 1024 +} +,{ + "args": { + "co_id": 282, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211397934191, + "dur": 2149859, + "name": "mcLaunchKernel", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777498, + "ts": 1784280211397934191, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 283, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211400091748, + "dur": 559, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 284, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211400161571, + "dur": 176, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 285, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211400175915, + "dur": 152, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 286, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211400178785, + "dur": 522, + "name": "mcDevicePrimaryCtxGetState", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 287, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211400180854, + "dur": 123, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 288, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211400193857, + "dur": 154, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 289, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211400208217, + "dur": 126, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "bytes": 1, + "chnl_id": 32570, + "chnl_type": 5, + "co_id": 290, + "copy_kind": 2, + "device_id": 0, + "dst_kind": 2, + "flags": 1, + "kind": 1, + "link": true, + "src_kind": 3, + "stream_id": 0 + }, + "ph": "X", + "ts": 1784280211400243968, + "dur": 20736, + "name": "memcpy DTOH(device,pinned)", + "pid": 3, + "cat": "0", + "tid": 0 +} +,{ + "ph": "f", + "id": 16777506, + "ts": 1784280211400243968, + "name": "Launch", + "pid": 3, + "bp": "e", + "cat": "Launch", + "tid": 0 +} +,{ + "args": { + "co_id": 290, + "link": true, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211400225238, + "dur": 9148, + "name": "mcMemcpyAsync", + "pid": 1, + "tid": 98428 +} +,{ + "ph": "s", + "id": 16777506, + "ts": 1784280211400225238, + "name": "Launch", + "pid": 1, + "cat": "Launch", + "tid": 98428 +} +,{ + "args": { + "co_id": 291, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211400236621, + "dur": 48338, + "name": "mcStreamSynchronize", + "pid": 1, + "tid": 98428 +} +,{ + "args": { + "co_id": 292, + "link": false, + "process_id": 98428, + "ret": 0, + "thread_id": 98428 + }, + "ph": "X", + "ts": 1784280211400297673, + "dur": 161, + "name": "mcGetDevice", + "pid": 1, + "tid": 98428 +} +] +} \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_benchmark.csv b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_benchmark.csv new file mode 100644 index 0000000..7196cad --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_benchmark.csv @@ -0,0 +1,16 @@ +case_id,config,batch,total_q,total_kv,max_q,max_kv,seq_len,compile_first_launch_s,pilot_ms,repeats_per_sample,sample_count,median_ms,p10_ms,p90_ms,min_ms,max_ms,spread_pct +1,ragged_b33_total16294,33,16294,16294,987,987,987,4.095663,2.072576,48,15,2.050485,2.049415,2.051076,2.048971,2.051813,0.081 +2,equal_b1_s1024,1,1024,1024,1024,1024,1024,0.209597,0.309931,322,15,0.290686,0.290553,0.290940,0.290066,0.291083,0.133 +3,equal_b1_s4096,1,4096,4096,4096,4096,4096,0.210687,3.035733,32,15,3.018648,3.017800,3.019238,3.017704,3.019256,0.048 +4,equal_b1_s16384,1,16384,16384,16384,16384,16384,0.251069,45.958740,2,15,45.972607,45.957453,45.993779,45.947903,46.003456,0.079 +5,equal_b4_s1024,4,4096,4096,1024,1024,1024,0.204058,0.921856,108,15,0.906871,0.905927,0.907311,0.905169,0.907750,0.153 +6,equal_b4_s4096,4,16384,16384,4096,4096,4096,0.222118,12.360874,8,15,12.336992,12.333901,12.340026,12.332096,12.340640,0.050 +7,equal_b16_s1024,16,16384,16384,1024,1024,1024,0.206309,3.361109,29,15,3.348056,3.347334,3.350782,3.346600,3.352947,0.103 +8,equal_b16_s2048,16,32768,32768,2048,2048,2048,0.292793,13.144918,7,15,13.120476,13.118625,13.123906,13.117549,13.132983,0.040 +9,varlen_uniform_q512_k1024_b4,4,2048,4096,512,1024,1024,0.215894,0.737451,135,15,0.717845,0.717765,0.717965,0.717282,0.718033,0.028 +10,varlen_mixed_b4,4,1536,3584,640,1280,1280,0.212858,0.552704,180,15,0.533872,0.533763,0.534045,0.533238,0.534074,0.053 +11,varlen_q_lt_kv_b2,2,1024,3072,512,2048,2048,0.215189,0.603221,165,15,0.584819,0.584664,0.585137,0.584329,0.585174,0.081 +12,ragged_b27_total12251,27,12251,12251,873,873,873,0.216958,1.495125,66,15,1.478202,1.477512,1.478641,1.477295,1.478931,0.076 +13,short_ragged_b15_total969,15,969,969,123,123,123,0.176575,0.288768,346,15,0.272169,0.272088,0.272253,0.271831,0.272271,0.061 +14,single_token,1,1,1,1,1,1,0.170628,0.041813,2000,15,0.030645,0.030608,0.031089,0.030598,0.031225,1.567 +15,tail_non_power2,2,98,98,65,65,65,0.169383,0.069803,1432,15,0.051921,0.051709,0.051938,0.051699,0.051939,0.441 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler.log b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler.log new file mode 100644 index 0000000..84eb979 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler.log @@ -0,0 +1,407 @@ + * Serving Flask app 'Profiler' (lazy loading) + * Environment: production + WARNING: This is a development server. Do not use it in a production deployment. + Use a production WSGI server instead. + * Debug mode: off +profiler http listen to 127.0.0.1:50123 +try to connect to server... +connect to server success +cmdline is: python tests/trace_tilelang_64g_case4.py +casename is: opt012_case4_targeted +metrics is: ['Total Cycles', 'AP busy Duty', 'AP MMA Duty ratio', 'ISU stall cycles layout', 'VL1 Hit Rate', 'L2C Hit Rate', 'Global Memory Read bytes', 'Global Memory Write bytes', 'shared memory access efficiency', 'Achieved waves', 'Dispatched waves'] +start a local task... +[info] start a new perf exec thread +[info] start perf_exec +[info] new exec 054b0685-1efd-4049-82d2-21af8938b66e:('python tests/trace_tilelang_64g_case4.py', 'opt012_case4_targeted', ['Total Cycles', 'AP busy Duty', 'AP MMA Duty ratio', 'ISU stall cycles layout', 'VL1 Hit Rate', 'L2C Hit Rate', 'Global Memory Read bytes', 'Global Memory Write bytes', 'shared memory access efficiency', 'Achieved waves', 'Dispatched waves']) +########## exec_id: 054b0685-1efd-4049-82d2-21af8938b66e ########## +[info] start generate batch files +[info] output path is: /opt/mcProfiler-ubuntu18.04/output20260717094852 +[info] generate event_batch_0.json successfully! +[info] generate batch files done +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +Loading tilelang libs from dev root: /data/tilelang-metax/build +[09:48:54.609][MXS][I]| MACA_LAUNCH_BLOCKING | 1 | 0 | +[09:48:54.610][MXS][W]| MCTX_TARGET_INIT | 1 | 0 | +[09:48:54.612][MCR][I]mc_device.cpp :562 : Signal SIGUSR1 now has a custom handler to enable mctx at runtime! +[09:48:54.612][MCR][I]mc_device.cpp :309 : mcSnapShotCtx: Attempting to open shared memory: /shm_snapshot_100986 +mctxAutoStart called! +[09:48:54.612][MCTX][I]mctxTPImpl.cpp :201 : MACA configuration file path redirected from ${MACA_PATH}/etc to MACA_ETC_PATH +[09:48:54.612][MCTX][I]mctxTPImpl.cpp :201 : MACA configuration file path redirected from ${MACA_PATH}/etc to MACA_ETC_PATH +[09:48:54.612][MCTX][I]mctxTPImpl.cpp :300 : profiler target ENV file[/opt/mcProfiler-ubuntu18.04/output20260717094852/mcProfiler.json] exist! +[09:48:54.613][MCR][I]mc_device.cpp :849 : Init enter! +[09:48:54.613][MXC][I]MxcInit: entering +[09:48:54.627][MXKW][I]topology.c :1358: [topology_sysfs_get_system_props]PlatformCpuNodes:2 ,num_sysfs_nodes:10 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/2/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 1,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/4/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 2,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/5/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 3,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/6/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 4,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/7/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 5,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/8/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 6,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/9/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 7,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :1460: [topology_sysfs_get_system_props]cpu total 2 nodes, map list: +[09:48:54.627][MXKW][I]topology.c :1463: [topology_sysfs_get_system_props]map_cpu[0]:0 +[09:48:54.627][MXKW][I]topology.c :1463: [topology_sysfs_get_system_props]map_cpu[1]:1 +[09:48:54.627][MXKW][I]topology.c :1465: [topology_sysfs_get_system_props]gpu total 1 nodes, map list: +[09:48:54.627][MXKW][I]topology.c :1468: [topology_sysfs_get_system_props]map_gpu[0]:3 +[09:48:54.627][MXKW][I]topology.c :1516: [topology_sysfs_init_gpu_page_size]XCORE_PAGE_SIZE: 0x200000, GPU_PAGE_SIZE: 0x200000 +[09:48:54.627][MXKW][I]topology.c :954 : [find_pci_info]create pci_info_array. It has 10 element. directory_name is 0. +[09:48:54.627][MXKW][I]topology.c :962 : [find_pci_info]node 0 's pci info is not found +[09:48:54.627][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/0/location file! +[09:48:54.627][MXKW][I]topology.c :962 : [find_pci_info]node 0 's pci info is not found +[09:48:54.627][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/0/location file! +[09:48:54.627][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 0, isa_minor is 0, MXName is +[09:48:54.627][MXKW][I]topology.c :962 : [find_pci_info]node 1 's pci info is not found +[09:48:54.627][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/1/location file! +[09:48:54.627][MXKW][I]topology.c :962 : [find_pci_info]node 1 's pci info is not found +[09:48:54.627][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/1/location file! +[09:48:54.627][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 0, isa_minor is 0, MXName is +[09:48:54.627][MXKW][I]topology.c :962 : [find_pci_info]node 3 's pci info is not found +[09:48:54.627][MXKW][I]topology.c :984 : [add_pci_info]added node 3 pci info , bdf_value:3840, domain_value:0 +[09:48:54.627][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 10, isa_minor is 0, MXName is +[09:48:54.627][MXKW][I]fmm.c :2445: [init_mmap_apertures]Initialized unreserved SVM apertures: 0xa00000000 - 0x7fffffffffff +[09:48:54.627][MXKW][I]topology.c :1358: [topology_sysfs_get_system_props]PlatformCpuNodes:2 ,num_sysfs_nodes:10 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/2/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 1,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/4/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 2,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/5/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 3,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/6/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 4,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/7/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 5,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/8/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 6,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/9/gpu_id,res: 0,errno:1 +[09:48:54.627][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 7,ret is 0,is_node_supported is 0 +[09:48:54.627][MXKW][I]topology.c :1460: [topology_sysfs_get_system_props]cpu total 2 nodes, map list: +[09:48:54.627][MXKW][I]topology.c :1463: [topology_sysfs_get_system_props]map_cpu[0]:0 +[09:48:54.627][MXKW][I]topology.c :1463: [topology_sysfs_get_system_props]map_cpu[1]:1 +[09:48:54.627][MXKW][I]topology.c :1465: [topology_sysfs_get_system_props]gpu total 1 nodes, map list: +[09:48:54.627][MXKW][I]topology.c :1468: [topology_sysfs_get_system_props]map_gpu[0]:3 +[09:48:54.627][MXKW][I]topology.c :962 : [find_pci_info]node 0 's pci info is not found +[09:48:54.627][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/0/location file! +[09:48:54.627][MXKW][I]topology.c :962 : [find_pci_info]node 0 's pci info is not found +[09:48:54.627][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/0/location file! +[09:48:54.627][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 0, isa_minor is 0, MXName is +[09:48:54.628][MXKW][I]topology.c :2548: [topology_take_snapshot]node0 direct_links route: +[09:48:54.628][MXKW][I]topology.c :2562: [topology_take_snapshot]link0 type:2, 0--->1 +[09:48:54.628][MXKW][I]topology.c :2562: [topology_take_snapshot]link1 type:3, 0--->2 +[09:48:54.628][MXKW][I]topology.c :962 : [find_pci_info]node 1 's pci info is not found +[09:48:54.628][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/1/location file! +[09:48:54.628][MXKW][I]topology.c :962 : [find_pci_info]node 1 's pci info is not found +[09:48:54.628][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/1/location file! +[09:48:54.628][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 0, isa_minor is 0, MXName is +[09:48:54.628][MXKW][I]topology.c :2548: [topology_take_snapshot]node1 direct_links route: +[09:48:54.628][MXKW][I]topology.c :2562: [topology_take_snapshot]link0 type:2, 1--->0 +[09:48:54.628][MXKW][I]topology.c :2573: [topology_take_snapshot]node1 indirect_links route: +[09:48:54.628][MXKW][I]topology.c :2597: [topology_take_snapshot]link1 type:105 1--->2 +[09:48:54.628][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 10, isa_minor is 0, MXName is +[09:48:54.630][MXKW][I]topology.c :2548: [topology_take_snapshot]node2 direct_links route: +[09:48:54.630][MXKW][I]topology.c :2562: [topology_take_snapshot]link0 type:3, 2--->0 +[09:48:54.630][MXKW][I]topology.c :2573: [topology_take_snapshot]node2 indirect_links route: +[09:48:54.630][MXKW][I]topology.c :2597: [topology_take_snapshot]link1 type:105 2--->1 +[09:48:54.630][MXC][I]MxcInit: leaving +[09:48:54.630][MXC][I]InitDma: Entering +[09:48:54.634][MXC][I]InitDma: Leaving +[09:48:54.634][MCR][I]mx_device.cpp :2294: Device xcore1000 create, major:10, minor:0 +[09:48:54.634][MCR][I]mx_device.cpp :2795: private_mem:436207616, info_.globalMemSize_:68283269120, gpu_single_alloc_percent:0.990000 +[09:48:54.634][MCR][I]mx_device.cpp :2865: get registersPerMtreg_:64,info_dpcNum_:8,info_wavePerDpc_:416, wavefrontWidth_:64 +[09:48:54.634][MCR][I]mx_device.cpp :3042: rmNum_:8, isuNum_:13, sl1Num_:7, vlsNum_:13, vl1Num_:13, l2cNum_:32, l2aNum_:4, l2xNum_:4 + +[09:48:54.635][MCR][I]mx_device.cpp :1083: getQueueCnt ce queue bitmap:ffff +[09:48:54.635][MCR][I]mx_device.cpp :1091: getQueueCnt hwQueueNum:16 +[09:48:54.635][MCR][I]mx_device.cpp :1153: agent_handle=0x55f372b7d800,hardware queues number:16, queue count configuration: 8-4-4(H-N-L), highForMccl:0 +[09:48:54.635][MCR][I]mx_device.cpp :2445: Device xcore1000 create fininshed! + +[09:48:54.635][MCR][I]mx_device.cpp :2294: Device xcore1000 create, major:10, minor:0 +[09:48:54.635][MCR][I]mx_device.cpp :2795: private_mem:436207616, info_.globalMemSize_:68283269120, gpu_single_alloc_percent:0.990000 +[09:48:54.635][MCR][I]mx_device.cpp :2865: get registersPerMtreg_:64,info_dpcNum_:8,info_wavePerDpc_:416, wavefrontWidth_:64 +[09:48:54.635][MCR][I]mx_device.cpp :3042: rmNum_:8, isuNum_:13, sl1Num_:7, vlsNum_:13, vl1Num_:13, l2cNum_:32, l2aNum_:4, l2xNum_:4 + +[09:48:54.635][MCR][I]mx_device.cpp :1083: getQueueCnt ce queue bitmap:ffff +[09:48:54.635][MCR][I]mx_device.cpp :1091: getQueueCnt hwQueueNum:16 +[09:48:54.635][MCR][I]mx_device.cpp :1153: agent_handle=0x55f372b7d800,hardware queues number:16, queue count configuration: 8-4-4(H-N-L), highForMccl:0 +[09:48:54.635][MCR][I]mx_device.cpp :2445: Device xcore1000 create fininshed! + +[09:48:54.636][MCR][I]mc_vpu_impl.cpp :80 : mcVpuLoad mxvpu lib version: 1.0.20260512_081136 + +[09:48:54.636][MCR][I]mc_vpu_impl.cpp :86 : mcVpuLoad load mxvpu lib path: /opt/maca-3.7.1/lib/libmxvpu.so + +[09:48:54.636][MCC][I]AddDevice device_id:0, arch:xcore1000 +[09:48:54.636][MCC][I]Get compiler from environment variable MACA_CLANG_PATH: /opt/maca/mxgpu_llvm/bin. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[09:49:16.482][MXS][I] Node0 Node1 +[09:49:16.482][MXS][I]Gpu0 X +[09:49:16.482][MXS][I]CpuBind X X +get_mempolicy: Operation not permitted +[09:49:16.482][MXS][I]MemBind X X +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[09:49:17.300][MXS][I]mcruntime 100% 0% +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[09:49:18.121][MXS][I]mccompiler 100% 0% +[09:49:18.941][MXS][I]mxc-runtime 99% 1% +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[09:49:19.758][MXS][I]mxkw 100% +[09:49:19.758][PTI][I]mcpti_profiler.cpp :618 : getModuleInfo:1,8,13,7,13,13,32,4,4 + +[09:49:19.760][MCR][I]mx_device.cpp :5792: agent_handle=0x55f372b7d800 +[09:49:19.760][MXKW][I]queues.c :388 : [get_quantum_map_value]clockGrain 4 +[09:49:19.760][MXKW][I]queues.c :393 : [get_quantum_map_value]highQuantum 16 normal 8 low 4 +[09:49:19.761][MCR][I]mx_device.cpp :1446: created hardware queue 0x7faf2da1e000(HWq=0x7fab3c001cd0) with size 1024 with priority 0(L), cooperative: 0, is_exclusive: 0 +[09:49:19.761][MCR][I]mx_device.cpp :1458: number of allocated hardware queues 0-0-1(H-N-L), number of users 0-0-1 +[09:49:19.764][MCR][W]mx_perf_counter.cpp :568 : Perf is not exclusive, can not be disabled! +[09:49:19.764][MCR][W]mx_perf_counter.cpp :568 : Perf is not exclusive, can not be disabled! +[09:49:19.765][MCTX][I]mctxTPImpl.cpp :186 : Automatically acquire a port. +[09:49:19.765][MCTX][I]mcRpcAsyncImpl.cpp :421 : mcRpcServerAsyncInit 0x55f372b6a2b0 0 +[09:49:19.765][MCTX][I]mcRpcAsyncImpl.cpp :500 : mcRpcAsyncServerTask start! +[09:49:19.765][MCTX][I]mcRpcAsyncImpl.cpp :472 : mcRpcServerAsyncRun start +[09:49:19.766][MCTX][I]server.cpp :69 : Server thread num: 1, listening on: 39971. +[info] MctxStreamProfilerCountDataGet Start +[info] MctxStreamProfilerCountDataGet Loop +mcToolsExtPid_UsedPort:100986-39971 +[09:49:23.465][MXC][I]raw dispatch ts:[252024761964536,252024762027490] +[09:49:23.465][MXC][I]dispatch ts translate ret [1784281763465289495, 1784281763465919033] +[09:49:23.466][MXC][I]raw dispatch ts:[252024762046270,252024762055562] +[09:49:23.466][MXC][I]dispatch ts translate ret [1784281763466106883, 1784281763466199838] +[09:49:23.466][MXC][I]raw dispatch ts:[252024762075727,252024762084970] +[09:49:23.466][MXC][I]dispatch ts translate ret [1784281763466401432, 1784281763466493831] +[09:49:23.466][MCR][I]mc_memory.cpp :1671: copy strategy - H2DCpuCopy:0,D2HCpuCopy:0,cpuCopy:0,d2dCrossDevices:0,pageableHToDAsync:0 +[09:49:23.466][MCR][I]mc_memory.cpp :1672: copy strategy - isAsync:0,waitComplete:1 +[09:49:23.466][MXC][I]GpuDevice 0x72b7d800 enable profiling, sdm_counter:202345146698043, sys_time:1784281763466835437 +[09:49:23.466][MXC][I]raw async_copy ts:[202345146719485,202345146722136] +[09:49:23.466][MXC][I]sdma_ts_.sdma_counter:202345146698043 +[09:49:23.466][MXC][I]DNOCfreq:900000000, async_copy ts translate ret [1784281763466859261, 1784281763466862206] +[info] MctxStreamProfilerCountDataGet Loop +[09:49:27.561][MXC][I]raw dispatch ts:[252025166946751,252025171544787] +[09:49:27.561][MXC][I]dispatch ts translate ret [1784281767515100424, 1784281767561080657] +[09:49:27.607][MXC][I]raw dispatch ts:[252025171612630,252025176205174] +[09:49:27.607][MXC][I]dispatch ts translate ret [1784281767561759085, 1784281767607684381] +[09:49:27.653][MXC][I]raw dispatch ts:[252025176237850,252025180832045] +[09:49:27.653][MXC][I]dispatch ts translate ret [1784281767608011140, 1784281767653952975] +[09:49:27.700][MXC][I]raw dispatch ts:[252025180847484,252025185443434] +[09:49:27.700][MXC][I]dispatch ts translate ret [1784281767654107364, 1784281767700066737] +[info] MctxStreamProfilerCountDataGet Loop +[09:49:27.746][MXC][I]raw dispatch ts:[252025185454245,252025190049041] +[09:49:27.746][MXC][I]dispatch ts translate ret [1784281767700174846, 1784281767746122668] +[09:49:27.792][MXC][I]raw dispatch ts:[252025190059345,252025194653531] +[09:49:27.792][MXC][I]dispatch ts translate ret [1784281767746225707, 1784281767792167451] +[09:49:27.838][MXC][I]raw dispatch ts:[252025194664186,252025199259399] +[09:49:27.838][MXC][I]dispatch ts translate ret [1784281767792274000, 1784281767838225993] +[09:49:27.884][MXC][I]raw dispatch ts:[252025199269658,252025203864078] +[09:49:27.884][MXC][I]dispatch ts translate ret [1784281767838328582, 1784281767884272657] +[09:49:27.930][MXC][I]raw dispatch ts:[252025203875030,252025208469093] +[09:49:27.930][MXC][I]dispatch ts translate ret [1784281767884382176, 1784281767930322678] +[09:49:27.976][MXC][I]raw dispatch ts:[252025208479330,252025213073049] +[09:49:27.976][MXC][I]dispatch ts translate ret [1784281767930425047, 1784281767976362108] +[09:49:28.022][MXC][I]raw dispatch ts:[252025213083311,252025217678740] +[09:49:28.022][MXC][I]dispatch ts translate ret [1784281767976464728, 1784281768022419179] +TRACE_REGION_BEGIN repeats=20 +[09:49:28.068][MXC][I]raw dispatch ts:[252025217695726,252025222288192] +[09:49:28.068][MXC][I]dispatch ts translate ret [1784281768022589038, 1784281768068513296] +[09:49:28.114][MXC][I]raw dispatch ts:[252025222301060,252025226895822] +[09:49:28.114][MXC][I]dispatch ts translate ret [1784281768068641975, 1784281768114589469] +[09:49:28.160][MXC][I]raw dispatch ts:[252025226910125,252025231501698] +[09:49:28.160][MXC][I]dispatch ts translate ret [1784281768114732498, 1784281768160648098] +[09:49:28.206][MXC][I]raw dispatch ts:[252025231511388,252025236106131] +[09:49:28.206][MXC][I]dispatch ts translate ret [1784281768160744997, 1784281768206692290] +[09:49:28.252][MXC][I]raw dispatch ts:[252025236116876,252025240710679] +[09:49:28.252][MXC][I]dispatch ts translate ret [1784281768206799739, 1784281768252737652] +[09:49:28.298][MXC][I]raw dispatch ts:[252025240720750,252025245316326] +[09:49:28.298][MXC][I]dispatch ts translate ret [1784281768252838361, 1784281768298793984] +[09:49:28.344][MXC][I]raw dispatch ts:[252025245326523,252025249922572] +[09:49:28.344][MXC][I]dispatch ts translate ret [1784281768298895953, 1784281768344856325] +[09:49:28.390][MXC][I]raw dispatch ts:[252025249932766,252025254524670] +[09:49:28.390][MXC][I]dispatch ts translate ret [1784281768344958264, 1784281768390877177] +[09:49:28.436][MXC][I]raw dispatch ts:[252025254534745,252025259130791] +[09:49:28.436][MXC][I]dispatch ts translate ret [1784281768390977926, 1784281768436938259] +[09:49:28.483][MXC][I]raw dispatch ts:[252025259142769,252025263736648] +[09:49:28.483][MXC][I]dispatch ts translate ret [1784281768437058038, 1784281768482996703] +[09:49:28.529][MXC][I]raw dispatch ts:[252025263748950,252025268343798] +[09:49:28.529][MXC][I]dispatch ts translate ret [1784281768483119722, 1784281768529068064] +[09:49:28.575][MXC][I]raw dispatch ts:[252025268354282,252025272947734] +[09:49:28.575][MXC][I]dispatch ts translate ret [1784281768529172903, 1784281768575107306] +[09:49:28.621][MXC][I]raw dispatch ts:[252025272958606,252025277553670] +[09:49:28.621][MXC][I]dispatch ts translate ret [1784281768575216025, 1784281768621166537] +[09:49:28.667][MXC][I]raw dispatch ts:[252025277563357,252025282158967] +[09:49:28.667][MXC][I]dispatch ts translate ret [1784281768621263406, 1784281768667219389] +[09:49:28.713][MXC][I]raw dispatch ts:[252025282168721,252025286763403] +[09:49:28.713][MXC][I]dispatch ts translate ret [1784281768667316928, 1784281768713263611] +[09:49:28.759][MXC][I]raw dispatch ts:[252025286774296,252025291371592] +[09:49:28.759][MXC][I]dispatch ts translate ret [1784281768713372541, 1784281768759345531]/tmp/_MEI4fqWsX/phttp/http_server.py:89: UserWarning: + +The 'environ['werkzeug.server.shutdown']' function is deprecated and will be removed in Werkzeug 2.1. + + +[09:49:28.805][MXC][I]raw dispatch ts:[252025291381474,252025295975968] +[09:49:28.805][MXC][I]dispatch ts translate ret [1784281768759444351, 1784281768805389014] +[09:49:28.851][MXC][I]raw dispatch ts:[252025295986210,252025300579049] +[09:49:28.851][MXC][I]dispatch ts translate ret [1784281768805491433, 1784281768851419688] +[09:49:28.897][MXC][I]raw dispatch ts:[252025300590839,252025305184548] +[09:49:28.897][MXC][I]dispatch ts translate ret [1784281768851537587, 1784281768897474550] +[09:49:28.943][MXC][I]raw dispatch ts:[252025305196876,252025309791449] +[09:49:28.943][MXC][I]dispatch ts translate ret [1784281768897597829, 1784281768943543442] +TRACE_REGION_END +[09:49:28.944][MXC][I]raw dispatch ts:[252025309881486,252025309900362] +[09:49:28.944][MXC][I]dispatch ts translate ret [1784281768944443884, 1784281768944632659] +[09:49:28.946][MXC][I]raw dispatch ts:[252025310035564,252025310050351] +[09:49:28.946][MXC][I]dispatch ts translate ret [1784281768945984566, 1784281768946132424] +[09:49:28.946][MXC][I]raw dispatch ts:[252025310070673,252025310085532] +[09:49:28.946][MXC][I]dispatch ts translate ret [1784281768946335649, 1784281768946484244] +[09:49:28.948][MXC][I]raw dispatch ts:[252025310248003,252025310262412] +[09:49:28.948][MXC][I]dispatch ts translate ret [1784281768948108944, 1784281768948253034] +[09:49:28.948][MXC][I]raw dispatch ts:[252025310295859,252025310296366] +[09:49:28.948][MXC][I]dispatch ts translate ret [1784281768948587500, 1784281768948592570] +[09:49:28.950][MXC][I]raw dispatch ts:[252025310515936,252025310523599] +[09:49:28.950][MXC][I]dispatch ts translate ret [1784281768950788250, 1784281768950864880] +[09:49:28.951][MCR][I]mc_memory.cpp :1671: copy strategy - H2DCpuCopy:0,D2HCpuCopy:0,cpuCopy:0,d2dCrossDevices:0,pageableHToDAsync:0 +[09:49:28.951][MCR][I]mc_memory.cpp :1672: copy strategy - isAsync:0,waitComplete:0 +[09:49:28.951][MXC][I]raw async_copy ts:[202351727798658,202351727800587] +[09:49:28.951][MXC][I]sdma_ts_.sdma_counter:202345146698043 +[09:49:28.951][MXC][I]DNOCfreq:900000000, async_copy ts translate ret [1784281770779169453, 1784281770779171596] +[09:49:28.951][MCR][W]mx_command.cpp :1883: HW exec timestamp will be adjusted!!! +[09:49:28.951][MCR][W]mx_command.cpp :1885: floor:1784281768951060820, start:1784281770779169536, end:1784281770779171584, ceiling:1784281768951080722 +TILELANG_64G_CASE4_TRACE_PASS +[09:49:29.173][MCR][I]mc_device.cpp :1002: tearDown enter! + +[09:49:29.173][MCR][I]mx_device.cpp :1578: deleting hardware queue 0x7faf2da1e000 with refCount 0 +[09:49:29.173][MCR][I]mx_device.cpp :1601: number of allocated hardware queues 0-0-0(H-N-L), number of users 0-0-0 +[09:49:29.174][MXC][I]~GpuDevice: Entering +[09:49:29.174][MCTX][I]mcRpcAsyncImpl.cpp :550 : callback mcRpcAsyncDone! +[09:49:29.174][PTI][I]mcpti_tracer.hpp :309 : stopProcessThread +[09:49:29.174][MCTX][I]mcRpcAsyncImpl.cpp :491 : mcRpcServerAsync TearDown! +[09:49:29.174][MCTX][I]server.cpp :116 : Server will tearDown[3]. +[09:49:29.181][MCTX][I]mcRpcAsyncImpl.cpp :250 : ProfilerCountDataGet the last msg:[ +{ +"CE" : [ +{ +"blockId" : 0, +"dpcId" : 0, +"events" : { +"2" : 175708168690490, +"4" : 450071379102 +} +} +], +"ISU" : [ +{ +"blockId" : 0, +"dpcId" : 0, +"events" : { +"1" : 1212512628467, +"72" : 1786425550280, +"73" : 1347731440785, +"74" : 1246633206573, +"78" : 7260895072502, +"80" : 9324991417010, +"81" : 1362363000338 +} +}, +{ +"blockId" : 1, +"dpcId" : 0, +"events" : { +"1" : 1212538968661, +"43" : 1255515835759, +"79" : 19719449634867, +"82" : 16744769089836, +"89" : 2422296694583 +} +} +], +"L2C" : [ +{ +"blockId" : 0, +"dpcId" : 0, +"events" : { +"269" : 24165782165, +"270" : 10537367113, +"272" : 365067716547, +"46" : 734181528377 +} +}, +{ +[info] MctxStreamProfilerCountDataGet Loop +"blockId" : 1, +"dpcId" : 0, +"events" : { +"19" : 1358922567291, +"21" : 3611410135643, +"271" : 776485210, +"48" : 3342619794 +} +}, +{ +"blockId" : 2, +"dpcId" : 0, +"events" : { +"20" : 1920936811968, +"47" : 1025093557705 +} +} +], +"RM" : [ +{ +"blockId" : 0, +"dpcId" : 0, +"events" : { +"20" : 0, +"36" : 0, +"4" : 194453959131, +"52" : 0 +} +} +], +"VL1" : [ +{ +"blockId" : 0, +"dpcId" : 0, +"events" :[09:49:29.193][MCTX][I]server.cpp :348 : HandleRpcs exit. thread_no=[0]. +[09:49:30.193][MCTX][I]server.cpp :89 : Server Shutdown! +[09:49:30.193][MCTX][I]mcRpcAsyncImpl.cpp :477 : mcRpcServerAsyncRun stop +[09:49:30.275][MCTX][I]mctxTPImpl.cpp :433 : clear port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. + +[info] profiling task 054b0685-1efd-4049-82d2-21af8938b66e +[info] complete task 054b0685-1efd-4049-82d2-21af8938b66e +stop server +perf done, please check report file /opt/mcProfiler-ubuntu18.04/output20260717094852 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler_analysis_64g.md b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler_analysis_64g.md new file mode 100644 index 0000000..d9a4f0e --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler_analysis_64g.md @@ -0,0 +1,149 @@ +# opt_012 case 4 mcProfiler analysis (64 GiB C500) + +## Scope + +- Case: `equal_b1_s16384` +- Kernel: `packed_kernel_dense_softmax_cleanup_v12_kernel` +- Device: full MetaX C500, 64 GiB container +- Collection: two per-kernel samples for each metric set, `--single-pass` +- Reference: opt_007 case-4 mcTracer and mcProfiler reports + +Both opt_012 samples are highly consistent. Total cycles differ by 0.32%, and +the principal duty and memory metrics are effectively identical. The reports +are suitable for bottleneck comparison. + +## Timeline and resources + +The opt_012 mcTracer result established: + +```text +device median: 46.012800 ms +target-kernel share of the 20-launch device span: 99.994214% +grid: (1024, 4, 1) +block: (512, 1, 1) +dynamic shared memory: 53,248 bytes/CTA +registers: 254/thread +private memory: 0 +MT-register occupancy: 49% +shared-memory occupancy: 81% +``` + +Case 4 is therefore device-kernel dominated. The shared-memory footprint still +limits the kernel to one CTA per AP; there is no visible private-memory spill. + +## Core counter comparison + +The opt_012 values below are the mean of its two per-kernel samples. The opt_007 +values come from its corresponding per-kernel report. + +| Metric | opt_007 | opt_012 | Change | +|---|---:|---:|---:| +| Total cycles | 55,369.05 K | 52,042.51 K | -6.01% | +| AP busy duty | 95.64% | 99.29% | +3.65 pp | +| AP MMA duty, core pass | 15.03% | 20.14% | +5.11 pp | +| VL1 hit rate | 87.27% | 87.31% | +0.04 pp | +| L2 hit rate | 95.24% | 97.50% | +2.26 pp | +| Global read bytes | 711,921,664 | 310,777,856 | -56.35% | +| Global write bytes | 134,219,776 | 134,217,728 | unchanged | +| Shared-memory efficiency | 79.62% | 74.04% | -5.58 pp | +| Achieved waves | 32,768 | 32,768 | unchanged | +| Dispatched waves | 32,768 | 32,768 | unchanged | + +The 6.01% cycle reduction agrees with mcTracer's 6.42% median-time reduction. +This cross-tool agreement confirms that the speedup is real and is not caused by +host timing or launch noise. + +Global counter values collected with `--single-pass` are inferred from a limited +event set. Their direction is useful, but the 56.35% global-read reduction should +not be treated as an exact byte-saving proof without a non-single-pass control +run. The unchanged 128-MiB write value is consistent with one output write. + +## Pipeline duty comparison + +| Pipeline metric | opt_007 | opt_012 | Change | +|---|---:|---:|---:| +| AP MTE duty / AP active | 38.86% | 38.31% | -0.55 pp | +| AP STE duty / AP active | 1.70% | 1.09% | -0.61 pp | +| AP MMA duty / AP active | 18.18% | 20.10% | +1.92 pp | +| VLS duty / AP active | 0.0% | 0.0% | unchanged | +| L2C duty / L2C active | 7.88% | 8.41% | +0.53 pp | + +The second metric set confirms that opt_012 spends a larger share of active time +issuing useful MMA work and less in STE work. MTE duty is essentially unchanged, +so data movement remains a large part of the active pipeline mix. The reported +zero VLS duty is not consistent with the nonzero VLS stall counters and should be +treated as unsupported or uninformative on this tool version, not as proof that +the kernel performs no vector loads/stores. + +## Stall transition + +Mean opt_012 stall values and opt_007 reference: + +| Stall source | opt_007 cycles | opt_012 cycles | Relative change | +|---|---:|---:|---:| +| `wsm_stall` | 1,357,933,682 | 1,246,525,947 | -8.20% | +| `vls_pipeline_stall` | 22,391,979 | 149,924,523 | +569.55% | +| `vls_wdata_stall` | 2,097,152 | 2,097,152 | unchanged | + +Distribution across these three reported sources: + +| Stall share | opt_007 | opt_012 | +|---|---:|---:| +| `wsm_stall` | 98.23% | 89.13% | +| `vls_pipeline_stall` | 1.62% | 10.72% | +| `vls_wdata_stall` | 0.15% | 0.15% | + +The original WSM constraint has improved in absolute terms but remains dominant. +At the same time, VLS pipeline stalls increased substantially and shared-memory +efficiency fell from 79.62% to 74.04%. The optimization shifted part of the +bottleneck toward the vector/shared-memory access path. + +## Bottleneck conclusion + +1. Host launch, Python, synchronization, and inter-kernel gaps are eliminated as + meaningful case-4 bottlenecks. +2. opt_012's dense specialization and instruction cleanup reduce total work and + increase MMA duty without changing launch geometry or residency. +3. The kernel still has only one resident CTA/AP because it allocates 53,248 + bytes of dynamic shared memory. This limits latency hiding across the strict + online-softmax dependency chain. +4. Shared-memory efficiency regressed and VLS pipeline stalls grew. Shared-memory + layout/access and vector-pipeline pressure are now the clearest immediate + optimization targets. +5. MMA duty improved to about 20%, but remains low relative to 99% AP busy duty. + Most active time is still spent in movement, softmax, synchronization, or + dependency waits rather than matrix instructions. + +## Next controlled experiments + +Run each experiment as a separate version and preserve opt_012 as the reference. + +1. **Same 128x64 tile, shared-layout experiment.** Add only a MetaX-supported + padding or swizzle to `q_shared` and `kv_shared`. Keep grid, threads, loop + structure, and scheduling unchanged. Accept only if shared efficiency rises, + VLS/WSM stalls fall, and correctness remains intact. +2. **Inspect generated device code before changing stages.** Count shared-memory + accesses and barriers in the KV loop, and identify the instructions associated + with Q/K/V copies, score-to-probability conversion, and output rescaling. +3. **Residency experiment, M64/N32/256 threads.** This is the realistic shape for + reducing shared use below the two-CTA threshold. It doubles KV-loop iterations + relative to N64, so it must be measured rather than assumed beneficial. +4. **Reduce vector softmax traffic.** Look for a supported way to reduce fragment + copies or repeated row-scale passes without increasing register spill. The + acceptance signals are lower VLS pipeline stalls and unchanged private memory. +5. **Do not enable two pipeline stages blindly.** Online softmax has loop-carried + state, and the current shared footprint is already the residency limit. A + second stage is justified only after a concrete double-buffered lifetime and + resource calculation. + +For every candidate, compare case-4 device time, resource metadata, shared +efficiency, VLS/WSM stalls, and MMA duty against this report. + +## Artifacts + +```text +results/tilelang_64g/opt_012_case4_mctracer_analysis_64g.md +results/tilelang_64g/mcprofiler_opt012_case4_targeted/ +results/tilelang_64g/mcprofiler_opt012_case4_duty/ +results/tilelang_64g/opt_012_case4_mcprofiler_analysis_64g.md +``` diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler_duty.log b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler_duty.log new file mode 100644 index 0000000..c74ade5 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mcprofiler_duty.log @@ -0,0 +1,385 @@ + * Serving Flask app 'Profiler' (lazy loading) + * Environment: production + WARNING: This is a development server. Do not use it in a production deployment. + Use a production WSGI server instead. + * Debug mode: off +profiler http listen to 127.0.0.1:50123 +try to connect to server... +connect to server success +cmdline is: python tests/trace_tilelang_64g_case4.py +casename is: opt012_case4_duty +metrics is: ['Total Cycles', 'AP busy Duty', 'ISU stall cycles layout', 'AP MTE Duty ratio', 'AP STE Duty ratio', 'AP MMA Duty ratio', 'VLS Duty ratio', 'L2C Duty ratio'] +start a local task... +[info] start a new perf exec thread +[info] start perf_exec +[info] new exec 577aafc1-d8d5-4d8f-9372-43de52e48907:('python tests/trace_tilelang_64g_case4.py', 'opt012_case4_duty', ['Total Cycles', 'AP busy Duty', 'ISU stall cycles layout', 'AP MTE Duty ratio', 'AP STE Duty ratio', 'AP MMA Duty ratio', 'VLS Duty ratio', 'L2C Duty ratio']) +########## exec_id: 577aafc1-d8d5-4d8f-9372-43de52e48907 ########## +[info] start generate batch files +[info] output path is: /opt/mcProfiler-ubuntu18.04/output20260717095614 +[info] generate event_batch_0.json successfully! +[info] generate batch files done +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +Loading tilelang libs from dev root: /data/tilelang-metax/build +[09:56:16.212][MXS][I]| MACA_LAUNCH_BLOCKING | 1 | 0 | +[09:56:16.212][MXS][W]| MCTX_TARGET_INIT | 1 | 0 | +[09:56:16.215][MCR][I]mc_device.cpp :562 : Signal SIGUSR1 now has a custom handler to enable mctx at runtime! +[09:56:16.215][MCR][I]mc_device.cpp :309 : mcSnapShotCtx: Attempting to open shared memory: /shm_snapshot_102181 +mctxAutoStart called! +[09:56:16.215][MCTX][I]mctxTPImpl.cpp :201 : MACA configuration file path redirected from ${MACA_PATH}/etc to MACA_ETC_PATH +[09:56:16.215][MCTX][I]mctxTPImpl.cpp :201 : MACA configuration file path redirected from ${MACA_PATH}/etc to MACA_ETC_PATH +[09:56:16.215][MCTX][I]mctxTPImpl.cpp :300 : profiler target ENV file[/opt/mcProfiler-ubuntu18.04/output20260717095614/mcProfiler.json] exist! +[09:56:16.216][MCR][I]mc_device.cpp :849 : Init enter! +[09:56:16.216][MXC][I]MxcInit: entering +[09:56:16.230][MXKW][I]topology.c :1358: [topology_sysfs_get_system_props]PlatformCpuNodes:2 ,num_sysfs_nodes:10 +[09:56:16.230][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/2/gpu_id,res: 0,errno:1 +[09:56:16.230][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 1,ret is 0,is_node_supported is 0 +[09:56:16.230][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/4/gpu_id,res: 0,errno:1 +[09:56:16.230][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 2,ret is 0,is_node_supported is 0 +[09:56:16.230][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/5/gpu_id,res: 0,errno:1 +[09:56:16.230][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 3,ret is 0,is_node_supported is 0 +[09:56:16.230][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/6/gpu_id,res: 0,errno:1 +[09:56:16.230][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 4,ret is 0,is_node_supported is 0 +[09:56:16.230][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/7/gpu_id,res: 0,errno:1 +[09:56:16.230][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 5,ret is 0,is_node_supported is 0 +[09:56:16.230][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/8/gpu_id,res: 0,errno:1 +[09:56:16.230][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 6,ret is 0,is_node_supported is 0 +[09:56:16.230][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/9/gpu_id,res: 0,errno:1 +[09:56:16.230][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 7,ret is 0,is_node_supported is 0 +[09:56:16.230][MXKW][I]topology.c :1460: [topology_sysfs_get_system_props]cpu total 2 nodes, map list: +[09:56:16.230][MXKW][I]topology.c :1463: [topology_sysfs_get_system_props]map_cpu[0]:0 +[09:56:16.230][MXKW][I]topology.c :1463: [topology_sysfs_get_system_props]map_cpu[1]:1 +[09:56:16.230][MXKW][I]topology.c :1465: [topology_sysfs_get_system_props]gpu total 1 nodes, map list: +[09:56:16.230][MXKW][I]topology.c :1468: [topology_sysfs_get_system_props]map_gpu[0]:3 +[09:56:16.230][MXKW][I]topology.c :1516: [topology_sysfs_init_gpu_page_size]XCORE_PAGE_SIZE: 0x200000, GPU_PAGE_SIZE: 0x200000 +[09:56:16.230][MXKW][I]topology.c :954 : [find_pci_info]create pci_info_array. It has 10 element. directory_name is 0. +[09:56:16.230][MXKW][I]topology.c :962 : [find_pci_info]node 0 's pci info is not found +[09:56:16.230][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/0/location file! +[09:56:16.230][MXKW][I]topology.c :962 : [find_pci_info]node 0 's pci info is not found +[09:56:16.230][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/0/location file! +[09:56:16.230][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 0, isa_minor is 0, MXName is +[09:56:16.230][MXKW][I]topology.c :962 : [find_pci_info]node 1 's pci info is not found +[09:56:16.230][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/1/location file! +[09:56:16.230][MXKW][I]topology.c :962 : [find_pci_info]node 1 's pci info is not found +[09:56:16.230][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/1/location file! +[09:56:16.230][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 0, isa_minor is 0, MXName is +[09:56:16.230][MXKW][I]topology.c :962 : [find_pci_info]node 3 's pci info is not found +[09:56:16.230][MXKW][I]topology.c :984 : [add_pci_info]added node 3 pci info , bdf_value:3840, domain_value:0 +[09:56:16.230][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 10, isa_minor is 0, MXName is +[09:56:16.231][MXKW][I]fmm.c :2445: [init_mmap_apertures]Initialized unreserved SVM apertures: 0xa00000000 - 0x7fffffffffff +[09:56:16.231][MXKW][I]topology.c :1358: [topology_sysfs_get_system_props]PlatformCpuNodes:2 ,num_sysfs_nodes:10 +[09:56:16.231][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/2/gpu_id,res: 0,errno:1 +[09:56:16.231][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 1,ret is 0,is_node_supported is 0 +[09:56:16.231][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/4/gpu_id,res: 0,errno:1 +[09:56:16.231][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 2,ret is 0,is_node_supported is 0 +[09:56:16.231][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/5/gpu_id,res: 0,errno:1 +[09:56:16.231][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 3,ret is 0,is_node_supported is 0 +[09:56:16.231][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/6/gpu_id,res: 0,errno:1 +[09:56:16.231][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 4,ret is 0,is_node_supported is 0 +[09:56:16.231][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/7/gpu_id,res: 0,errno:1 +[09:56:16.231][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 5,ret is 0,is_node_supported is 0 +[09:56:16.231][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/8/gpu_id,res: 0,errno:1 +[09:56:16.231][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 6,ret is 0,is_node_supported is 0 +[09:56:16.231][MXKW][I]topology.c :283 : [get_directory_socket_id]fscanf path:/sys/devices/virtual/mxcd/mxcd/layout/nodes/9/gpu_id,res: 0,errno:1 +[09:56:16.231][MXKW][W]topology.c :1424: [topology_sysfs_get_system_props]err_node_num is 7,ret is 0,is_node_supported is 0 +[09:56:16.231][MXKW][I]topology.c :1460: [topology_sysfs_get_system_props]cpu total 2 nodes, map list: +[09:56:16.231][MXKW][I]topology.c :1463: [topology_sysfs_get_system_props]map_cpu[0]:0 +[09:56:16.231][MXKW][I]topology.c :1463: [topology_sysfs_get_system_props]map_cpu[1]:1 +[09:56:16.231][MXKW][I]topology.c :1465: [topology_sysfs_get_system_props]gpu total 1 nodes, map list: +[09:56:16.231][MXKW][I]topology.c :1468: [topology_sysfs_get_system_props]map_gpu[0]:3 +[09:56:16.231][MXKW][I]topology.c :962 : [find_pci_info]node 0 's pci info is not found +[09:56:16.231][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/0/location file! +[09:56:16.231][MXKW][I]topology.c :962 : [find_pci_info]node 0 's pci info is not found +[09:56:16.231][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/0/location file! +[09:56:16.231][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 0, isa_minor is 0, MXName is +[09:56:16.231][MXKW][I]topology.c :2548: [topology_take_snapshot]node0 direct_links route: +[09:56:16.231][MXKW][I]topology.c :2562: [topology_take_snapshot]link0 type:2, 0--->1 +[09:56:16.231][MXKW][I]topology.c :2562: [topology_take_snapshot]link1 type:3, 0--->2 +[09:56:16.231][MXKW][I]topology.c :962 : [find_pci_info]node 1 's pci info is not found +[09:56:16.231][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/1/location file! +[09:56:16.231][MXKW][I]topology.c :962 : [find_pci_info]node 1 's pci info is not found +[09:56:16.231][MXKW][I]topology.c :911 : [read_pci_info_from_file]can't open /sys/devices/virtual/mxcd/mxcd/layout/nodes/1/location file! +[09:56:16.231][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 0, isa_minor is 0, MXName is +[09:56:16.231][MXKW][I]topology.c :2548: [topology_take_snapshot]node1 direct_links route: +[09:56:16.231][MXKW][I]topology.c :2562: [topology_take_snapshot]link0 type:2, 1--->0 +[09:56:16.231][MXKW][I]topology.c :2573: [topology_take_snapshot]node1 indirect_links route: +[09:56:16.231][MXKW][I]topology.c :2597: [topology_take_snapshot]link1 type:105 1--->2 +[09:56:16.231][MXKW][I]topology.c :1944: [topology_sysfs_get_node_props]Device isa_major is 10, isa_minor is 0, MXName is +[09:56:16.233][MXKW][I]topology.c :2548: [topology_take_snapshot]node2 direct_links route: +[09:56:16.233][MXKW][I]topology.c :2562: [topology_take_snapshot]link0 type:3, 2--->0 +[09:56:16.233][MXKW][I]topology.c :2573: [topology_take_snapshot]node2 indirect_links route: +[09:56:16.233][MXKW][I]topology.c :2597: [topology_take_snapshot]link1 type:105 2--->1 +[09:56:16.234][MXC][I]MxcInit: leaving +[09:56:16.234][MXC][I]InitDma: Entering +[09:56:16.237][MXC][I]InitDma: Leaving +[09:56:16.238][MCR][I]mx_device.cpp :2294: Device xcore1000 create, major:10, minor:0 +[09:56:16.238][MCR][I]mx_device.cpp :2795: private_mem:436207616, info_.globalMemSize_:68283269120, gpu_single_alloc_percent:0.990000 +[09:56:16.238][MCR][I]mx_device.cpp :2865: get registersPerMtreg_:64,info_dpcNum_:8,info_wavePerDpc_:416, wavefrontWidth_:64 +[09:56:16.238][MCR][I]mx_device.cpp :3042: rmNum_:8, isuNum_:13, sl1Num_:7, vlsNum_:13, vl1Num_:13, l2cNum_:32, l2aNum_:4, l2xNum_:4 + +[09:56:16.238][MCR][I]mx_device.cpp :1083: getQueueCnt ce queue bitmap:ffff +[09:56:16.238][MCR][I]mx_device.cpp :1091: getQueueCnt hwQueueNum:16 +[09:56:16.238][MCR][I]mx_device.cpp :1153: agent_handle=0x56303b05b5a0,hardware queues number:16, queue count configuration: 8-4-4(H-N-L), highForMccl:0 +[09:56:16.238][MCR][I]mx_device.cpp :2445: Device xcore1000 create fininshed! + +[09:56:16.238][MCR][I]mx_device.cpp :2294: Device xcore1000 create, major:10, minor:0 +[09:56:16.238][MCR][I]mx_device.cpp :2795: private_mem:436207616, info_.globalMemSize_:68283269120, gpu_single_alloc_percent:0.990000 +[09:56:16.238][MCR][I]mx_device.cpp :2865: get registersPerMtreg_:64,info_dpcNum_:8,info_wavePerDpc_:416, wavefrontWidth_:64 +[09:56:16.239][MCR][I]mx_device.cpp :3042: rmNum_:8, isuNum_:13, sl1Num_:7, vlsNum_:13, vl1Num_:13, l2cNum_:32, l2aNum_:4, l2xNum_:4 + +[09:56:16.239][MCR][I]mx_device.cpp :1083: getQueueCnt ce queue bitmap:ffff +[09:56:16.239][MCR][I]mx_device.cpp :1091: getQueueCnt hwQueueNum:16 +[09:56:16.239][MCR][I]mx_device.cpp :1153: agent_handle=0x56303b05b5a0,hardware queues number:16, queue count configuration: 8-4-4(H-N-L), highForMccl:0 +[09:56:16.239][MCR][I]mx_device.cpp :2445: Device xcore1000 create fininshed! + +[09:56:16.239][MCR][I]mc_vpu_impl.cpp :80 : mcVpuLoad mxvpu lib version: 1.0.20260512_081136 + +[09:56:16.239][MCR][I]mc_vpu_impl.cpp :86 : mcVpuLoad load mxvpu lib path: /opt/maca-3.7.1/lib/libmxvpu.so + +[09:56:16.239][MCC][I]AddDevice device_id:0, arch:xcore1000 +[09:56:16.239][MCC][I]Get compiler from environment variable MACA_CLANG_PATH: /opt/maca/mxgpu_llvm/bin. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[09:56:38.215][MXS][I] Node0 Node1 +[09:56:38.215][MXS][I]Gpu0 X +[09:56:38.215][MXS][I]CpuBind X X +get_mempolicy: Operation not permitted +[09:56:38.215][MXS][I]MemBind X X +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[09:56:39.090][MXS][I]mcruntime 100% 0% +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[09:56:39.968][MXS][I]mccompiler 100% 0% +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[09:56:40.844][MXS][I]mxc-runtime 99% 1% +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[09:56:41.719][MXS][I]mxkw 100% +[09:56:41.719][PTI][I]mcpti_profiler.cpp :618 : getModuleInfo:1,8,13,7,13,13,32,4,4 + +[09:56:41.721][MCR][I]mx_device.cpp :5792: agent_handle=0x56303b05b5a0 +[09:56:41.721][MXKW][I]queues.c :388 : [get_quantum_map_value]clockGrain 4 +[09:56:41.721][MXKW][I]queues.c :393 : [get_quantum_map_value]highQuantum 16 normal 8 low 4 +[09:56:41.722][MCR][I]mx_device.cpp :1446: created hardware queue 0x7f9d97a1e000(HWq=0x7f99a8001cd0) with size 1024 with priority 0(L), cooperative: 0, is_exclusive: 0 +[09:56:41.722][MCR][I]mx_device.cpp :1458: number of allocated hardware queues 0-0-1(H-N-L), number of users 0-0-1 +[09:56:41.725][MCR][W]mx_perf_counter.cpp :568 : Perf is not exclusive, can not be disabled! +[09:56:41.725][MCR][W]mx_perf_counter.cpp :568 : Perf is not exclusive, can not be disabled! +[09:56:41.726][MCTX][I]mctxTPImpl.cpp :186 : Automatically acquire a port. +[09:56:41.726][MCTX][I]mcRpcAsyncImpl.cpp :421 : mcRpcServerAsyncInit 0x56303b04f790 0 +[09:56:41.726][MCTX][I]mcRpcAsyncImpl.cpp :500 : mcRpcAsyncServerTask start! +[09:56:41.726][MCTX][I]mcRpcAsyncImpl.cpp :472 : mcRpcServerAsyncRun start +[09:56:41.727][MCTX][I]server.cpp :69 : Server thread num: 1, listening on: 39945. +[info] MctxStreamProfilerCountDataGet Start +[info] MctxStreamProfilerCountDataGet Loop +mcToolsExtPid_UsedPort:102181-39945 +[09:56:45.442][MXC][I]raw dispatch ts:[252068959726940,252068959789928] +[09:56:45.442][MXC][I]dispatch ts translate ret [1784282205441364895, 1784282205441994772] +[09:56:45.442][MXC][I]raw dispatch ts:[252068959809647,252068959818842] +[09:56:45.442][MXC][I]dispatch ts translate ret [1784282205442191926, 1784282205442283852] +[09:56:45.442][MXC][I]raw dispatch ts:[252068959840003,252068959849325] +[09:56:45.442][MXC][I]dispatch ts translate ret [1784282205442495500, 1784282205442588741] +[09:56:45.442][MCR][I]mc_memory.cpp :1671: copy strategy - H2DCpuCopy:0,D2HCpuCopy:0,cpuCopy:0,d2dCrossDevices:0,pageableHToDAsync:0 +[09:56:45.442][MCR][I]mc_memory.cpp :1672: copy strategy - isAsync:0,waitComplete:1 +[09:56:45.442][MXC][I]GpuDevice 0x3b05b5a0 enable profiling, sdm_counter:202851652513868, sys_time:1784282205442923326 +[09:56:45.442][MXC][I]raw async_copy ts:[202851652533034,202851652535620] +[09:56:45.442][MXC][I]sdma_ts_.sdma_counter:202851652513868 +[09:56:45.442][MXC][I]DNOCfreq:900000000, async_copy ts translate ret [1784282205442944621, 1784282205442947494] +[09:56:49.540][MXC][I]raw dispatch ts:[252069365081844,252069369684876] +[09:56:49.540][MXC][I]dispatch ts translate ret [1784282209494897644, 1784282209540927779] +[info] MctxStreamProfilerCountDataGet Loop +[09:56:49.587][MXC][I]raw dispatch ts:[252069369737563,252069374342478] +[09:56:49.587][MXC][I]dispatch ts translate ret [1784282209541454647, 1784282209587503617] +[09:56:49.633][MXC][I]raw dispatch ts:[252069374371453,252069378974857] +[09:56:49.633][MXC][I]dispatch ts translate ret [1784282209587793366, 1784282209633827225] +[09:56:49.679][MXC][I]raw dispatch ts:[252069378986174,252069383588798] +[09:56:49.680][MXC][I]dispatch ts translate ret [1784282209633940394, 1784282209679966428] +[09:56:49.726][MXC][I]raw dispatch ts:[252069383600189,252069388203670] +[09:56:49.726][MXC][I]dispatch ts translate ret [1784282209680080337, 1784282209726114974] +[09:56:49.772][MXC][I]raw dispatch ts:[252069388216463,252069392820065] +[09:56:49.772][MXC][I]dispatch ts translate ret [1784282209726242903, 1784282209772278738] +[info] MctxStreamProfilerCountDataGet Loop +[09:56:49.818][MXC][I]raw dispatch ts:[252069392830979,252069397432392] +[09:56:49.818][MXC][I]dispatch ts translate ret [1784282209772387877, 1784282209818401831] +[09:56:49.864][MXC][I]raw dispatch ts:[252069397446703,252069402047915] +[09:56:49.864][MXC][I]dispatch ts translate ret [1784282209818544940, 1784282209864556866] +[09:56:49.910][MXC][I]raw dispatch ts:[252069402058757,252069406659014] +[09:56:49.910][MXC][I]dispatch ts translate ret [1784282209864665285, 1784282209910667673] +[09:56:49.956][MXC][I]raw dispatch ts:[252069406669311,252069411269645] +[09:56:49.956][MXC][I]dispatch ts translate ret [1784282209910770642, 1784282209956773807] +[09:56:50.002][MXC][I]raw dispatch ts:[252069411280116,252069415882571] +[09:56:50.002][MXC][I]dispatch ts translate ret [1784282209956878516, 1784282210002902883] +TRACE_REGION_BEGIN repeats=20 +[09:56:50.049][MXC][I]raw dispatch ts:[252069415900942,252069420504316] +[09:56:50.049][MXC][I]dispatch ts translate ret [1784282210003086592, 1784282210049120137] +[09:56:50.095][MXC][I]raw dispatch ts:[252069420515347,252069425116419] +[09:56:50.095][MXC][I]dispatch ts translate ret [1784282210049230446, 1784282210095240997] +[09:56:50.141][MXC][I]raw dispatch ts:[252069425130231,252069429732109] +[09:56:50.141][MXC][I]dispatch ts translate ret [1784282210095379116, 1784282210141397698] +[09:56:50.187][MXC][I]raw dispatch ts:[252069429741220,252069434342012] +[09:56:50.187][MXC][I]dispatch ts translate ret [1784282210141488807, 1784282210187496538] +[09:56:50.233][MXC][I]raw dispatch ts:[252069434351834,252069438952531] +[09:56:50.233][MXC][I]dispatch ts translate ret [1784282210187594757, 1784282210233601547] +[09:56:50.279][MXC][I]raw dispatch ts:[252069438963609,252069443567746] +[09:56:50.279][MXC][I]dispatch ts translate ret [1784282210233712326, 1784282210279753521] +[09:56:50.325][MXC][I]raw dispatch ts:[252069443577738,252069448180989] +[09:56:50.325][MXC][I]dispatch ts translate ret [1784282210279853441, 1784282210325885985] +[09:56:50.372][MXC][I]raw dispatch ts:[252069448191227,252069452794172] +[09:56:50.372][MXC][I]dispatch ts translate ret [1784282210325988365, 1784282210372017409] +[09:56:50.418][MXC][I]raw dispatch ts:[252069452804012,252069457405310] +[09:56:50.418][MXC][I]dispatch ts translate ret [1784282210372115808, 1784282210418128606] +[09:56:50.464][MXC][I]raw dispatch ts:[252069457415442,252069462018434] +[09:56:50.464][MXC][I]dispatch ts translate ret [1784282210418229925, 1784282210464259660] +[09:56:50.510][MXC][I]raw dispatch ts:[252069462030134,252069466630818] +[09:56:50.510][MXC][I]dispatch ts translate ret [1784282210464376659, 1784282210510383314] +[09:56:50.556][MXC][I]raw dispatch ts:[252069466642079,252069471243554] +[09:56:50.556][MXC][I]dispatch ts translate ret [1784282210510495923, 1784282210556510489] +[09:56:50.602][MXC][I]raw dispatch ts:[252069471256288,252069475855218] +[09:56:50.602][MXC][I]dispatch ts translate ret [1784282210556637828, 1784282210602626943] +[09:56:50.648][MXC][I]raw dispatch ts:[252069475865856,252069480467022] +[09:56:50.648][MXC][I]dispatch ts translate ret [1784282210602733322, 1784282210648744798] +[09:56:50.694][MXC][I]raw dispatch ts:[252069480477167,252069485078109] +[09:56:50.694][MXC][I]dispatch ts translate ret [1784282210648846247, 1784282210694855495] +[09:56:50.741][MXC][I]raw dispatch ts:[252069485090275,252069489694434] +[09:56:50.741][MXC][I]dispatch ts translate ret [1784282210694977154, 1784282210741018537] +[09:56:50.787][MXC][I]raw dispatch ts:[252069489706600,252069494307902] +[09:56:50.787][MXC][I]dispatch ts translate ret [1784282210741140196, 1784282210787153051]/tmp/_MEI0UzLWv/phttp/http_server.py:89: UserWarning: + +The 'environ['werkzeug.server.shutdown']' function is deprecated and will be removed in Werkzeug 2.1. + + +[09:56:50.833][MXC][I]raw dispatch ts:[252069494318798,252069498920962] +[09:56:50.833][MXC][I]dispatch ts translate ret [1784282210787262010, 1784282210833283467] +[09:56:50.879][MXC][I]raw dispatch ts:[252069498931922,252069503531948] +[09:56:50.879][MXC][I]dispatch ts translate ret [1784282210833393066, 1784282210879393141] +[09:56:50.925][MXC][I]raw dispatch ts:[252069503541845,252069508140374] +[09:56:50.925][MXC][I]dispatch ts translate ret [1784282210879492110, 1784282210925477217] +TRACE_REGION_END +[09:56:50.926][MXC][I]raw dispatch ts:[252069508243987,252069508262780] +[09:56:50.926][MXC][I]dispatch ts translate ret [1784282210926513342, 1784282210926701272] +[09:56:50.928][MXC][I]raw dispatch ts:[252069508400043,252069508414568] +[09:56:50.928][MXC][I]dispatch ts translate ret [1784282210928073893, 1784282210928219142] +[09:56:50.928][MXC][I]raw dispatch ts:[252069508435916,252069508450838] +[09:56:50.928][MXC][I]dispatch ts translate ret [1784282210928432612, 1784282210928581824] +[09:56:50.930][MXC][I]raw dispatch ts:[252069508617779,252069508632234] +[09:56:50.930][MXC][I]dispatch ts translate ret [1784282210930251225, 1784282210930395775] +[09:56:50.930][MXC][I]raw dispatch ts:[252069508669861,252069508670383] +[09:56:50.930][MXC][I]dispatch ts translate ret [1784282210930772010, 1784282210930777230] +[09:56:50.933][MXC][I]raw dispatch ts:[252069508892189,252069508900152] +[09:56:50.933][MXC][I]dispatch ts translate ret [1784282210932995306, 1784282210933074936] +[09:56:50.933][MCR][I]mc_memory.cpp :1671: copy strategy - H2DCpuCopy:0,D2HCpuCopy:0,cpuCopy:0,d2dCrossDevices:0,pageableHToDAsync:0 +[09:56:50.933][MCR][I]mc_memory.cpp :1672: copy strategy - isAsync:0,waitComplete:0 +[09:56:50.933][MXC][I]raw async_copy ts:[202858240993819,202858240995704] +[09:56:50.933][MXC][I]sdma_ts_.sdma_counter:202851652513868 +[09:56:50.933][MXC][I]DNOCfreq:900000000, async_copy ts translate ret [1784282212763456604, 1784282212763458698] +[09:56:50.933][MCR][W]mx_command.cpp :1883: HW exec timestamp will be adjusted!!! +[09:56:50.933][MCR][W]mx_command.cpp :1885: floor:1784282210933289811, start:1784282212763456512, end:1784282212763458816, ceiling:1784282210933311481 +TILELANG_64G_CASE4_TRACE_PASS +[09:56:51.159][MCR][I]mc_device.cpp :1002: tearDown enter! + +[09:56:51.159][MCR][I]mx_device.cpp :1578: deleting hardware queue 0x7f9d97a1e000 with refCount 0 +[09:56:51.159][MCR][I]mx_device.cpp :1601: number of allocated hardware queues 0-0-0(H-N-L), number of users 0-0-0 +[09:56:51.159][MXC][I]~GpuDevice: Entering +[09:56:51.160][MCTX][I]mcRpcAsyncImpl.cpp :550 : callback mcRpcAsyncDone! +[09:56:51.160][PTI][I]mcpti_tracer.hpp :309 : stopProcessThread +[09:56:51.160][MCTX][I]mcRpcAsyncImpl.cpp :491 : mcRpcServerAsync TearDown! +[09:56:51.160][MCTX][I]server.cpp :116 : Server will tearDown[3]. +[09:56:51.171][MCTX][I]mcRpcAsyncImpl.cpp :250 : ProfilerCountDataGet the last msg:[ +{ +"CE" : [ +{ +"blockId" : 0, +"dpcId" : 0, +"events" : { +"2" : 175719836902556, +"4" : 450072933279 +} +} +], +"ISU" : [ +{ +"blockId" : 0, +"dpcId" : 0, +"events" : { +"1" : 1212512643443, +"10" : 1786443662588, +"40" : 1347817262993, +"41" : 1246633206573, +"79" : 7261267993368, +"81" : 9324992117274, +"82" : 1362363000338 +} +}, +{ +"blockId" : 1, +"dpcId" : 0, +"events" : { +"1" : 1212538983697, +"101" : 1647186773391, +"43" : 1256805977455, +"52" : 19721579495299, +"80" : 16744813480297, +"89" : 2423902457246 +} +} +], +"L2C" : [ +[info] MctxStreamProfilerCountDataGet Loop +{ +"blockId" : 0, +"dpcId" : 0, +"events" : { +"1" : 744790559108, +"74" : 24301834034 +} +} +], +"VLS" : [ +{ +"blockId" : 0, +"dpcId" : 0, +"events" : { +"23" : 0 +} +} +] +} +] + +[09:56:51.182][MCTX][I]server.cpp :348 : HandleRpcs exit. thread_no=[0]. +[09:56:52.182][MCTX][I]server.cpp :89 : Server Shutdown! +[09:56:52.182][MCTX][I]mcRpcAsyncImpl.cpp :477 : mcRpcServerAsyncRun stop +[09:56:52.261][MCTX][I]mctxTPImpl.cpp :433 : clear port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. +[warning] get_srvrpc_port get rpc server ports failed: cannot retrieve rpc server port. + +[info] profiling task 577aafc1-d8d5-4d8f-9372-43de52e48907 +[info] complete task 577aafc1-d8d5-4d8f-9372-43de52e48907 +stop server +perf done, please check report file /opt/mcProfiler-ubuntu18.04/output20260717095614 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mctracer_analysis_64g.md b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mctracer_analysis_64g.md new file mode 100644 index 0000000..2f52577 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_case4_mctracer_analysis_64g.md @@ -0,0 +1,147 @@ +# opt_012 case 4 mcTracer analysis on the 64 GiB C500 + +## Trace setup + +```text +case: equal_b1_s16384 +kernel: packed_kernel_dense_softmax_cleanup_v12_kernel +first launch: 1 +warmup launches: 10 +analyzed consecutive launches: 20 +``` + +The process loads PyTorch and the TileLang kernel only. The trace harness loads +`tilelang/run_kernel.py`, whose SHA-256 is identical to +`tilelang/opt_012_dense_softmax_cleanup.py`. The import alias in the harness still +contains `opt007`, but that alias does not select the kernel and does not affect +the trace. + +## Collection result + +```text +trace events: 419 +target kernel events: 31 = 1 first launch + 10 warmup + 20 analyzed +trace file size: approximately 115 KiB +``` + +The final 20 target launches contain no device memcpy or unrelated GPU kernel. +They are asynchronously enqueued and followed by one device synchronization. +Consequently, the increasing `queue_ts -> start_ts` of later launches is time +spent behind earlier kernels in the same queue, not per-launch scheduling +overhead. + +## Kernel launch metadata + +```text +grid: (1024, 4, 1) +block: (512, 1, 1) +dynamic shared memory: 53248 bytes +static shared memory: 0 bytes +private memory per thread: 0 bytes +private memory total: 0 bytes +registers per thread: 254 +MT register occupancy: 49% +shared-memory occupancy: 81% +hardware queue: 2 +recompiled: false +``` + +There is no private-memory spill allocation visible in mcTracer. Dynamic shared +memory remains large enough to prevent two 53,248-byte CTAs from fitting in a +64-KiB WSM allocation. + +## Timeline statistics + +For the final 20 consecutive target kernels: + +```text +duration minimum: 45.988096 ms +duration P10: 45.994522 ms +duration median: 46.012800 ms +duration mean: 46.013210 ms +duration P90: 46.036941 ms +duration maximum: 46.040576 ms +population stdev: 0.015535 ms +coefficient of variation: 0.0338% +``` + +The run is extremely stable. Across the complete 20-launch device interval: + +```text +sum of kernel durations: 920.264192 ms +first-start to last-end span: 920.317440 ms +sum of 19 inter-kernel gaps: 0.053248 ms +target-kernel share of the span: 99.994214% +``` + +The matched runtime `mcLaunchKernel` calls for the same 20 kernels take: + +```text +minimum: 4.120 us +median: 4.592 us +mean: 5.275 us +maximum: 17.877 us +sum: 105.507 us +``` + +Queue submission itself has a median latency of 1.340 us. Host launch overhead, +Python overhead, synchronization, and device bubbles are therefore negligible +relative to one approximately 46-ms kernel. + +## Comparison with opt_007 + +Using the same final-20-launch mcTracer method: + +| Metric | opt_007 | opt_012 | Change | +|---|---:|---:|---:| +| Kernel median | 49.170432 ms | 46.012800 ms | -6.42% | +| Kernel speed | 1.000x | 1.0686x | +6.86% | +| Dynamic shared memory | 53,248 B | 53,248 B | unchanged | +| Registers/thread | 255 | 254 | -1 | +| MT register occupancy | 49% | 49% | unchanged | +| Shared-memory occupancy | 81% | 81% | unchanged | +| Private memory | 0 B | 0 B | unchanged | + +The improvement did not come from higher reported occupancy, smaller shared +memory, fewer CTAs, or removal of a spill. It is consistent with opt_012's +within-kernel work reduction and scheduling changes: dense equal-length +specialization, reverse dense tile order, fully-visible causal tile cleanup, and +softmax cleanup. mcTracer measures their aggregate result but cannot attribute +time to individual instructions. + +## Bottleneck conclusion + +1. Case 4 is entirely device-kernel dominated. Optimizing wrappers, launch count, + or host synchronization cannot materially improve this testcase. +2. The current kernel still runs one CTA per AP due to its 53,248-byte dynamic + shared-memory footprint. Registers changed only from 255 to 254, leaving the + reported 49% MT-register occupancy unchanged. +3. opt_012 improves the device median by 3.157632 ms over opt_007 while preserving + the same launch geometry and effective resource limits. This validates the + instruction/work-reduction direction, but does not remove the original + shared-memory residency constraint. +4. mcTracer cannot distinguish MMA under-utilization, shared-memory conflicts, + barriers, instruction dependencies, or cache/bandwidth limits. A filtered + opt_012 mcProfiler run is required to compare those counters directly with the + existing opt_007 profile. + +## Next profiling comparison + +Collect the same opt_012 target-kernel mcProfiler metrics used for opt_007: + +- AP busy, AP MMA/MTE/STE duty; +- shared-memory access efficiency and ISU stall breakdown; +- global read/write bytes, VL1 and L2 hit rates; +- achieved/dispatched waves and runtime resource metadata. + +The decisive comparison is whether opt_012's 6.42% time reduction came from +higher MMA duty, lower `wsm_stall`, fewer memory transactions, or fewer non-MMA +instructions. Use the per-kernel report rather than the aggregate process report. + +## Artifacts + +```text +tests/trace_tilelang_64g_case4.py +results/tilelang_64g/mctracer_opt012_case4/tracer_out-98428.json +results/tilelang_64g/opt_012_case4_mctracer_analysis_64g.md +``` diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_015_case4_device_kernel.cu b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_015_case4_device_kernel.cu new file mode 100644 index 0000000..3d617de --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_015_case4_device_kernel.cu @@ -0,0 +1,168 @@ +#include +#include +#include +#include +#include +#include +#include + +extern "C" __global__ void packed_kernel_v_prefetch_after_qk_v15_kernel(const bfloat16_t* __restrict__ k, const int* __restrict__ kv_indptr, bfloat16_t* __restrict__ output, const bfloat16_t* __restrict__ q, const bfloat16_t* __restrict__ v); +extern "C" __global__ void __launch_bounds__(512, 1) packed_kernel_v_prefetch_after_qk_v15_kernel(const bfloat16_t* __restrict__ k, const int* __restrict__ kv_indptr, bfloat16_t* __restrict__ output, const bfloat16_t* __restrict__ q, const bfloat16_t* __restrict__ v) { + extern __shared__ __align__(1024) uchar buf_dyn_shmem[]; + float output_accum[32]; + float row_denom[1]; + float row_max[1]; + float row_scale[1]; + float scores[16]; + float row_max_prev[1]; + bfloat16_t probs[16]; + bfloat16_t output_local_cast[4]; + int copy_kv_len = kv_indptr[1]; + #pragma unroll + for (int i = 0; i < 4; ++i) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + ((((((((((int)threadIdx.x) & 15) >> 3) * 8192) + (i * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8))) = *(uint4*)(q + ((((((i * 16384) + ((((int)threadIdx.x) >> 7) * 4096)) + (((int)blockIdx.y) * 1024)) + ((((int)threadIdx.x) & 127) * 8)) + 67043328) - (((int)blockIdx.x) * 65536))); + } + #pragma unroll + for (int i_1 = 0; i_1 < 8; ++i_1) { + float broadcast_var = 0x0p+0f/*0.000000e+00*/; + *(float4*)(output_accum + (i_1 * 4)) = make_float4(broadcast_var, broadcast_var, broadcast_var, broadcast_var); + } + row_denom[0] = 0x0p+0f/*0.000000e+00*/; + row_max[0] = -MACART_INF_F; + for (int kv_tile = 0; kv_tile < ((16447 - (((int)blockIdx.x) * 16)) >> 6); ++kv_tile) { + __syncthreads(); + if (((kv_tile * 64) + 64) <= copy_kv_len) { + #pragma unroll + for (int i_2 = 0; i_2 < 2; ++i_2) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_2 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(k + (((((kv_tile * 32768) + (i_2 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } + } else { + #pragma unroll + for (int i_3 = 0; i_3 < 2; ++i_3) { + if ((((kv_tile * 64) + (i_3 * 32)) + (((int)threadIdx.x) >> 4)) < copy_kv_len) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_3 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(k + (((((kv_tile * 32768) + (i_3 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } else { + bfloat16_t broadcast_var_1 = bfloat16_t(0x0p+0f/*0.000000e+00*/); + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_3 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = make_uint4(__pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1)); + } + } + } + if (kv_tile < ((16369 - (((int)blockIdx.x) * 16)) >> 6)) { + #pragma unroll + for (int i_4 = 0; i_4 < 4; ++i_4) { + float broadcast_var_2 = 0x0p+0f/*0.000000e+00*/; + *(float4*)(scores + (i_4 * 4)) = make_float4(broadcast_var_2, broadcast_var_2, broadcast_var_2, broadcast_var_2); + } + } else { + #pragma unroll + for (int i_5 = 0; i_5 < 16; ++i_5) { + float condval; + if ((((((kv_tile * 64) + ((i_5 >> 2) * 16)) + (((((int)threadIdx.x) & 63) >> 4) * 4)) + (i_5 & 3)) <= (((((((int)threadIdx.x) >> 6) * 2) + ((((int)threadIdx.x) & 15) >> 3)) + 16368) - (((int)blockIdx.x) * 16)))) { + condval = 0x0p+0f/*0.000000e+00*/; + } else { + condval = -MACART_INF_F; + } + scores[i_5] = condval; + } + } + bfloat16_t A_local[4]; + bfloat16_t B_local[16]; + __syncthreads(); + for (int ki = 0; ki < 8; ++ki) { + *(uint2*)(A_local + 0) = *(uint2*)(((bfloat16_t*)buf_dyn_shmem) + ((((((((ki >> 2) * 8192) + ((((int)threadIdx.x) >> 6) * 1024)) + ((((int)threadIdx.x) & 15) * 64)) + (((((((int)threadIdx.x) & 7) >> 2) + ((ki & 3) >> 1)) & 1) * 32)) + (((((((int)threadIdx.x) & 3) >> 1) + (ki & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 63) >> 5) + (((int)threadIdx.x) & 1)) & 1) * 8)) + (((((int)threadIdx.x) & 31) >> 4) * 4))); + for (int j = 0; j < 4; ++j) { + *(uint2*)(B_local + (j * 4)) = *(uint2*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((ki >> 2) * 4096) + (j * 1024)) + ((((int)threadIdx.x) & 15) * 64)) + (((((((int)threadIdx.x) & 7) >> 2) + ((ki & 3) >> 1)) & 1) * 32)) + (((((((int)threadIdx.x) & 3) >> 1) + (ki & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 63) >> 5) + (((int)threadIdx.x) & 1)) & 1) * 8)) + (((((int)threadIdx.x) & 31) >> 4) * 4)) + 16384)); + } + for (int j_1 = 0; j_1 < 4; ++j_1) { + { + *(((float32x4*)scores) + j_1) = __builtin_mxc_mma_16x16x16bf16(*(((bfloat16x4_vec*)B_local) + j_1), + *(((bfloat16x4_vec*)A_local) + 0), + *(((float32x4*)scores) + j_1)); + }; + } + } + row_max_prev[0] = -MACART_INF_F; + #pragma unroll + for (int rv = 0; rv < 16; ++rv) { + row_max_prev[0] = max(row_max_prev[0], scores[(((rv & 3) * 4) + (rv >> 2))]); + } + __syncthreads(); + row_max_prev[0] = tl::AllReduce::run(row_max_prev[0], (&(((float*)buf_dyn_shmem)[12800]))); + __syncthreads(); + if (((kv_tile * 64) + 64) <= copy_kv_len) { + #pragma unroll + for (int i_6 = 0; i_6 < 2; ++i_6) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_6 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(v + (((((kv_tile * 32768) + (i_6 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } + } else { + #pragma unroll + for (int i_7 = 0; i_7 < 2; ++i_7) { + if ((((kv_tile * 64) + (i_7 * 32)) + (((int)threadIdx.x) >> 4)) < copy_kv_len) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_7 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(v + (((((kv_tile * 32768) + (i_7 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } else { + bfloat16_t broadcast_var_3 = bfloat16_t(0x0p+0f/*0.000000e+00*/); + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_7 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = make_uint4(__pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3)); + } + } + } + row_scale[0] = exp2f(((row_max[0] * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/) - (max(row_max[0], row_max_prev[0]) * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/))); + row_max[0] = max(row_max[0], row_max_prev[0]); + #pragma unroll + for (int i_8 = 0; i_8 < 16; ++i_8) { + scores[i_8] = exp2f(((scores[i_8] * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/) - (row_max[0] * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/))); + } + row_max_prev[0] = 0x0p+0f/*0.000000e+00*/; + #pragma unroll + for (int rv_1 = 0; rv_1 < 16; ++rv_1) { + row_max_prev[0] = (row_max_prev[0] + scores[(((rv_1 & 3) * 4) + (rv_1 >> 2))]); + } + __syncthreads(); + row_max_prev[0] = tl::AllReduce::run(row_max_prev[0], (&(((float*)buf_dyn_shmem)[12288]))); + row_denom[0] = ((row_denom[0] * row_scale[0]) + row_max_prev[0]); + #pragma unroll + for (int i_9 = 0; i_9 < 4; ++i_9) { + uint2 __1; + float4 v_ = *(float4*)(scores + (i_9 * 4)); + (reinterpret_cast<__maca_bfloat162*>(&__1))[0] = __float22bfloat162_rn(((float2*)(&v_))[0]); + (reinterpret_cast<__maca_bfloat162*>(&__1))[1] = __float22bfloat162_rn(((float2*)(&v_))[1]); + *(uint2*)(probs + (i_9 * 4)) = __1; + } + #pragma unroll + for (int i_10 = 0; i_10 < 32; ++i_10) { + output_accum[i_10] = (output_accum[i_10] * row_scale[0]); + } + bfloat16_t B_local_1[32]; + __syncthreads(); + for (int ki_1 = 0; ki_1 < 4; ++ki_1) { + for (int j_2 = 0; j_2 < 8; ++j_2) { + for (int local_id = 0; local_id < 4; ++local_id) { + B_local_1[((j_2 * 4) + local_id)] = ((bfloat16_t*)buf_dyn_shmem)[((((((((((j_2 >> 2) * 4096) + (ki_1 * 1024)) + (((((int)threadIdx.x) & 63) >> 4) * 256)) + (local_id * 64)) + (((((((int)threadIdx.x) & 31) >> 4) + ((j_2 & 3) >> 1)) & 1) * 32)) + ((((local_id >> 1) + (j_2 & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 15) >> 3) + (local_id & 1)) & 1) * 8)) + (((int)threadIdx.x) & 7)) + 16384)]; + } + } + for (int j_3 = 0; j_3 < 8; ++j_3) { + { + *(((float32x4*)output_accum) + j_3) = __builtin_mxc_mma_16x16x16bf16(*(((bfloat16x4_vec*)B_local_1) + j_3), + *(((bfloat16x4_vec*)probs) + ki_1), + *(((float32x4*)output_accum) + j_3)); + }; + } + } + } + row_scale[0] = (0x1p+0f/*1.000000e+00*/ / row_denom[0]); + #pragma unroll + for (int i_11 = 0; i_11 < 8; ++i_11) { + uint2 __2; + float4 __3; + float4 v__1 = *(float4*)(output_accum + (i_11 * 4)); + float4 v__2 = make_float4(row_scale[0], row_scale[0], row_scale[0], row_scale[0]); + __3.x = (v__1.x*v__2.x); + __3.y = (v__1.y*v__2.y); + __3.z = (v__1.z*v__2.z); + __3.w = (v__1.w*v__2.w); + (reinterpret_cast<__maca_bfloat162*>(&__2))[0] = __float22bfloat162_rn(((float2*)(&__3))[0]); + (reinterpret_cast<__maca_bfloat162*>(&__2))[1] = __float22bfloat162_rn(((float2*)(&__3))[1]); + *(uint2*)(output_local_cast + 0) = __2; + *(uint2*)(output + (((((((((((int)threadIdx.x) >> 6) * 8192) + (((((int)threadIdx.x) & 15) >> 3) * 4096)) + (((int)blockIdx.y) * 1024)) + ((((int)threadIdx.x) & 7) * 128)) + (i_11 * 16)) + (((((int)threadIdx.x) & 63) >> 4) * 4)) + 67043328) - (((int)blockIdx.x) * 65536))) = *(uint2*)(output_local_cast + 0); + } +} + diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_015_case4_host_kernel.cu b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_015_case4_host_kernel.cu new file mode 100644 index 0000000..18bba07 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_015_case4_host_kernel.cu @@ -0,0 +1,194 @@ +#include +#include +#include +#include +#include +#include +#include + +extern "C" __global__ void packed_kernel_v_prefetch_after_qk_v15_kernel(const bfloat16_t* __restrict__ k, const int* __restrict__ kv_indptr, bfloat16_t* __restrict__ output, const bfloat16_t* __restrict__ q, const bfloat16_t* __restrict__ v); +extern "C" __global__ void __launch_bounds__(512, 1) packed_kernel_v_prefetch_after_qk_v15_kernel(const bfloat16_t* __restrict__ k, const int* __restrict__ kv_indptr, bfloat16_t* __restrict__ output, const bfloat16_t* __restrict__ q, const bfloat16_t* __restrict__ v) { + extern __shared__ __align__(1024) uchar buf_dyn_shmem[]; + float output_accum[32]; + float row_denom[1]; + float row_max[1]; + float row_scale[1]; + float scores[16]; + float row_max_prev[1]; + bfloat16_t probs[16]; + bfloat16_t output_local_cast[4]; + int copy_kv_len = kv_indptr[1]; + #pragma unroll + for (int i = 0; i < 4; ++i) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + ((((((((((int)threadIdx.x) & 15) >> 3) * 8192) + (i * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8))) = *(uint4*)(q + ((((((i * 16384) + ((((int)threadIdx.x) >> 7) * 4096)) + (((int)blockIdx.y) * 1024)) + ((((int)threadIdx.x) & 127) * 8)) + 67043328) - (((int)blockIdx.x) * 65536))); + } + #pragma unroll + for (int i_1 = 0; i_1 < 8; ++i_1) { + float broadcast_var = 0x0p+0f/*0.000000e+00*/; + *(float4*)(output_accum + (i_1 * 4)) = make_float4(broadcast_var, broadcast_var, broadcast_var, broadcast_var); + } + row_denom[0] = 0x0p+0f/*0.000000e+00*/; + row_max[0] = -MACART_INF_F; + for (int kv_tile = 0; kv_tile < ((16447 - (((int)blockIdx.x) * 16)) >> 6); ++kv_tile) { + __syncthreads(); + if (((kv_tile * 64) + 64) <= copy_kv_len) { + #pragma unroll + for (int i_2 = 0; i_2 < 2; ++i_2) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_2 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(k + (((((kv_tile * 32768) + (i_2 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } + } else { + #pragma unroll + for (int i_3 = 0; i_3 < 2; ++i_3) { + if ((((kv_tile * 64) + (i_3 * 32)) + (((int)threadIdx.x) >> 4)) < copy_kv_len) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_3 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(k + (((((kv_tile * 32768) + (i_3 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } else { + bfloat16_t broadcast_var_1 = bfloat16_t(0x0p+0f/*0.000000e+00*/); + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_3 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = make_uint4(__pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1)); + } + } + } + if (kv_tile < ((16369 - (((int)blockIdx.x) * 16)) >> 6)) { + #pragma unroll + for (int i_4 = 0; i_4 < 4; ++i_4) { + float broadcast_var_2 = 0x0p+0f/*0.000000e+00*/; + *(float4*)(scores + (i_4 * 4)) = make_float4(broadcast_var_2, broadcast_var_2, broadcast_var_2, broadcast_var_2); + } + } else { + #pragma unroll + for (int i_5 = 0; i_5 < 16; ++i_5) { + float condval; + if ((((((kv_tile * 64) + ((i_5 >> 2) * 16)) + (((((int)threadIdx.x) & 63) >> 4) * 4)) + (i_5 & 3)) <= (((((((int)threadIdx.x) >> 6) * 2) + ((((int)threadIdx.x) & 15) >> 3)) + 16368) - (((int)blockIdx.x) * 16)))) { + condval = 0x0p+0f/*0.000000e+00*/; + } else { + condval = -MACART_INF_F; + } + scores[i_5] = condval; + } + } + bfloat16_t A_local[4]; + bfloat16_t B_local[16]; + __syncthreads(); + for (int ki = 0; ki < 8; ++ki) { + *(uint2*)(A_local + 0) = *(uint2*)(((bfloat16_t*)buf_dyn_shmem) + ((((((((ki >> 2) * 8192) + ((((int)threadIdx.x) >> 6) * 1024)) + ((((int)threadIdx.x) & 15) * 64)) + (((((((int)threadIdx.x) & 7) >> 2) + ((ki & 3) >> 1)) & 1) * 32)) + (((((((int)threadIdx.x) & 3) >> 1) + (ki & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 63) >> 5) + (((int)threadIdx.x) & 1)) & 1) * 8)) + (((((int)threadIdx.x) & 31) >> 4) * 4))); + for (int j = 0; j < 4; ++j) { + *(uint2*)(B_local + (j * 4)) = *(uint2*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((ki >> 2) * 4096) + (j * 1024)) + ((((int)threadIdx.x) & 15) * 64)) + (((((((int)threadIdx.x) & 7) >> 2) + ((ki & 3) >> 1)) & 1) * 32)) + (((((((int)threadIdx.x) & 3) >> 1) + (ki & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 63) >> 5) + (((int)threadIdx.x) & 1)) & 1) * 8)) + (((((int)threadIdx.x) & 31) >> 4) * 4)) + 16384)); + } + for (int j_1 = 0; j_1 < 4; ++j_1) { + { + *(((float32x4*)scores) + j_1) = __builtin_mxc_mma_16x16x16bf16(*(((bfloat16x4_vec*)B_local) + j_1), + *(((bfloat16x4_vec*)A_local) + 0), + *(((float32x4*)scores) + j_1)); + }; + } + } + row_max_prev[0] = -MACART_INF_F; + #pragma unroll + for (int rv = 0; rv < 16; ++rv) { + row_max_prev[0] = max(row_max_prev[0], scores[(((rv & 3) * 4) + (rv >> 2))]); + } + __syncthreads(); + row_max_prev[0] = tl::AllReduce::run(row_max_prev[0], (&(((float*)buf_dyn_shmem)[12800]))); + __syncthreads(); + if (((kv_tile * 64) + 64) <= copy_kv_len) { + #pragma unroll + for (int i_6 = 0; i_6 < 2; ++i_6) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_6 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(v + (((((kv_tile * 32768) + (i_6 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } + } else { + #pragma unroll + for (int i_7 = 0; i_7 < 2; ++i_7) { + if ((((kv_tile * 64) + (i_7 * 32)) + (((int)threadIdx.x) >> 4)) < copy_kv_len) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_7 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(v + (((((kv_tile * 32768) + (i_7 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } else { + bfloat16_t broadcast_var_3 = bfloat16_t(0x0p+0f/*0.000000e+00*/); + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_7 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = make_uint4(__pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3)); + } + } + } + row_scale[0] = exp2f(((row_max[0] * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/) - (max(row_max[0], row_max_prev[0]) * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/))); + row_max[0] = max(row_max[0], row_max_prev[0]); + #pragma unroll + for (int i_8 = 0; i_8 < 16; ++i_8) { + scores[i_8] = exp2f(((scores[i_8] * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/) - (row_max[0] * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/))); + } + row_max_prev[0] = 0x0p+0f/*0.000000e+00*/; + #pragma unroll + for (int rv_1 = 0; rv_1 < 16; ++rv_1) { + row_max_prev[0] = (row_max_prev[0] + scores[(((rv_1 & 3) * 4) + (rv_1 >> 2))]); + } + __syncthreads(); + row_max_prev[0] = tl::AllReduce::run(row_max_prev[0], (&(((float*)buf_dyn_shmem)[12288]))); + row_denom[0] = ((row_denom[0] * row_scale[0]) + row_max_prev[0]); + #pragma unroll + for (int i_9 = 0; i_9 < 4; ++i_9) { + uint2 __1; + float4 v_ = *(float4*)(scores + (i_9 * 4)); + (reinterpret_cast<__maca_bfloat162*>(&__1))[0] = __float22bfloat162_rn(((float2*)(&v_))[0]); + (reinterpret_cast<__maca_bfloat162*>(&__1))[1] = __float22bfloat162_rn(((float2*)(&v_))[1]); + *(uint2*)(probs + (i_9 * 4)) = __1; + } + #pragma unroll + for (int i_10 = 0; i_10 < 32; ++i_10) { + output_accum[i_10] = (output_accum[i_10] * row_scale[0]); + } + bfloat16_t B_local_1[32]; + __syncthreads(); + for (int ki_1 = 0; ki_1 < 4; ++ki_1) { + for (int j_2 = 0; j_2 < 8; ++j_2) { + for (int local_id = 0; local_id < 4; ++local_id) { + B_local_1[((j_2 * 4) + local_id)] = ((bfloat16_t*)buf_dyn_shmem)[((((((((((j_2 >> 2) * 4096) + (ki_1 * 1024)) + (((((int)threadIdx.x) & 63) >> 4) * 256)) + (local_id * 64)) + (((((((int)threadIdx.x) & 31) >> 4) + ((j_2 & 3) >> 1)) & 1) * 32)) + ((((local_id >> 1) + (j_2 & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 15) >> 3) + (local_id & 1)) & 1) * 8)) + (((int)threadIdx.x) & 7)) + 16384)]; + } + } + for (int j_3 = 0; j_3 < 8; ++j_3) { + { + *(((float32x4*)output_accum) + j_3) = __builtin_mxc_mma_16x16x16bf16(*(((bfloat16x4_vec*)B_local_1) + j_3), + *(((bfloat16x4_vec*)probs) + ki_1), + *(((float32x4*)output_accum) + j_3)); + }; + } + } + } + row_scale[0] = (0x1p+0f/*1.000000e+00*/ / row_denom[0]); + #pragma unroll + for (int i_11 = 0; i_11 < 8; ++i_11) { + uint2 __2; + float4 __3; + float4 v__1 = *(float4*)(output_accum + (i_11 * 4)); + float4 v__2 = make_float4(row_scale[0], row_scale[0], row_scale[0], row_scale[0]); + __3.x = (v__1.x*v__2.x); + __3.y = (v__1.y*v__2.y); + __3.z = (v__1.z*v__2.z); + __3.w = (v__1.w*v__2.w); + (reinterpret_cast<__maca_bfloat162*>(&__2))[0] = __float22bfloat162_rn(((float2*)(&__3))[0]); + (reinterpret_cast<__maca_bfloat162*>(&__2))[1] = __float22bfloat162_rn(((float2*)(&__3))[1]); + *(uint2*)(output_local_cast + 0) = __2; + *(uint2*)(output + (((((((((((int)threadIdx.x) >> 6) * 8192) + (((((int)threadIdx.x) & 15) >> 3) * 4096)) + (((int)blockIdx.y) * 1024)) + ((((int)threadIdx.x) & 7) * 128)) + (i_11 * 16)) + (((((int)threadIdx.x) & 63) >> 4) * 4)) + 67043328) - (((int)blockIdx.x) * 65536))) = *(uint2*)(output_local_cast + 0); + } +} + + +#define ERROR_BUF_SIZE 1024 +static char error_buf[ERROR_BUF_SIZE]; + +extern "C" const char* get_last_error() { + return error_buf; +} + +extern "C" int init() { + error_buf[0] = '\0'; + + if (53248 > 65536) { + snprintf(error_buf, ERROR_BUF_SIZE, "Failed to set the allowed dynamic shared memory size for packed_kernel_v_prefetch_after_qk_v15_kernel to %d", 53248); + return -1; + } + return 0; + + return 0; +} + +extern "C" int call(bfloat16_t* __restrict__ q, bfloat16_t* __restrict__ k, bfloat16_t* __restrict__ v, bfloat16_t* __restrict__ output, int* __restrict__ qo_indptr, int* __restrict__ kv_indptr, mcStream_t stream=mcStreamDefault) { + packed_kernel_v_prefetch_after_qk_v15_kernel<<>>(k, kv_indptr, output, q, v); + TILELANG_CHECK_LAST_ERROR("packed_kernel_v_prefetch_after_qk_v15_kernel"); + + return 0; +} diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_018_case4_device_kernel.cu b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_018_case4_device_kernel.cu new file mode 100644 index 0000000..45fe119 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_018_case4_device_kernel.cu @@ -0,0 +1,167 @@ +#include +#include +#include +#include +#include +#include +#include + +extern "C" __global__ void packed_kernel_factor_softmax_scale_v18_kernel(const bfloat16_t* __restrict__ k, const int* __restrict__ kv_indptr, bfloat16_t* __restrict__ output, const bfloat16_t* __restrict__ q, const bfloat16_t* __restrict__ v); +extern "C" __global__ void __launch_bounds__(512, 1) packed_kernel_factor_softmax_scale_v18_kernel(const bfloat16_t* __restrict__ k, const int* __restrict__ kv_indptr, bfloat16_t* __restrict__ output, const bfloat16_t* __restrict__ q, const bfloat16_t* __restrict__ v) { + extern __shared__ __align__(1024) uchar buf_dyn_shmem[]; + float output_accum[32]; + float row_denom[1]; + float row_max[1]; + float row_scale[1]; + float scores[16]; + float row_max_prev[1]; + bfloat16_t probs[16]; + bfloat16_t output_local_cast[4]; + int copy_kv_len = kv_indptr[1]; + #pragma unroll + for (int i = 0; i < 4; ++i) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + ((((((((((int)threadIdx.x) & 15) >> 3) * 8192) + (i * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8))) = *(uint4*)(q + ((((((i * 16384) + ((((int)threadIdx.x) >> 7) * 4096)) + (((int)blockIdx.y) * 1024)) + ((((int)threadIdx.x) & 127) * 8)) + 67043328) - (((int)blockIdx.x) * 65536))); + } + #pragma unroll + for (int i_1 = 0; i_1 < 8; ++i_1) { + float broadcast_var = 0x0p+0f/*0.000000e+00*/; + *(float4*)(output_accum + (i_1 * 4)) = make_float4(broadcast_var, broadcast_var, broadcast_var, broadcast_var); + } + row_denom[0] = 0x0p+0f/*0.000000e+00*/; + row_max[0] = -MACART_INF_F; + for (int kv_tile = 0; kv_tile < ((16447 - (((int)blockIdx.x) * 16)) >> 6); ++kv_tile) { + __syncthreads(); + if (((kv_tile * 64) + 64) <= copy_kv_len) { + #pragma unroll + for (int i_2 = 0; i_2 < 2; ++i_2) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_2 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(k + (((((kv_tile * 32768) + (i_2 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } + } else { + #pragma unroll + for (int i_3 = 0; i_3 < 2; ++i_3) { + if ((((kv_tile * 64) + (i_3 * 32)) + (((int)threadIdx.x) >> 4)) < copy_kv_len) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_3 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(k + (((((kv_tile * 32768) + (i_3 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } else { + bfloat16_t broadcast_var_1 = bfloat16_t(0x0p+0f/*0.000000e+00*/); + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_3 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = make_uint4(__pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1)); + } + } + } + if (kv_tile < ((16369 - (((int)blockIdx.x) * 16)) >> 6)) { + #pragma unroll + for (int i_4 = 0; i_4 < 4; ++i_4) { + float broadcast_var_2 = 0x0p+0f/*0.000000e+00*/; + *(float4*)(scores + (i_4 * 4)) = make_float4(broadcast_var_2, broadcast_var_2, broadcast_var_2, broadcast_var_2); + } + } else { + #pragma unroll + for (int i_5 = 0; i_5 < 16; ++i_5) { + float condval; + if ((((((kv_tile * 64) + ((i_5 >> 2) * 16)) + (((((int)threadIdx.x) & 63) >> 4) * 4)) + (i_5 & 3)) <= (((((((int)threadIdx.x) >> 6) * 2) + ((((int)threadIdx.x) & 15) >> 3)) + 16368) - (((int)blockIdx.x) * 16)))) { + condval = 0x0p+0f/*0.000000e+00*/; + } else { + condval = -MACART_INF_F; + } + scores[i_5] = condval; + } + } + bfloat16_t A_local[4]; + bfloat16_t B_local[16]; + __syncthreads(); + for (int ki = 0; ki < 8; ++ki) { + *(uint2*)(A_local + 0) = *(uint2*)(((bfloat16_t*)buf_dyn_shmem) + ((((((((ki >> 2) * 8192) + ((((int)threadIdx.x) >> 6) * 1024)) + ((((int)threadIdx.x) & 15) * 64)) + (((((((int)threadIdx.x) & 7) >> 2) + ((ki & 3) >> 1)) & 1) * 32)) + (((((((int)threadIdx.x) & 3) >> 1) + (ki & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 63) >> 5) + (((int)threadIdx.x) & 1)) & 1) * 8)) + (((((int)threadIdx.x) & 31) >> 4) * 4))); + for (int j = 0; j < 4; ++j) { + *(uint2*)(B_local + (j * 4)) = *(uint2*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((ki >> 2) * 4096) + (j * 1024)) + ((((int)threadIdx.x) & 15) * 64)) + (((((((int)threadIdx.x) & 7) >> 2) + ((ki & 3) >> 1)) & 1) * 32)) + (((((((int)threadIdx.x) & 3) >> 1) + (ki & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 63) >> 5) + (((int)threadIdx.x) & 1)) & 1) * 8)) + (((((int)threadIdx.x) & 31) >> 4) * 4)) + 16384)); + } + for (int j_1 = 0; j_1 < 4; ++j_1) { + { + *(((float32x4*)scores) + j_1) = __builtin_mxc_mma_16x16x16bf16(*(((bfloat16x4_vec*)B_local) + j_1), + *(((bfloat16x4_vec*)A_local) + 0), + *(((float32x4*)scores) + j_1)); + }; + } + } + row_max_prev[0] = -MACART_INF_F; + #pragma unroll + for (int rv = 0; rv < 16; ++rv) { + row_max_prev[0] = max(row_max_prev[0], scores[(((rv & 3) * 4) + (rv >> 2))]); + } + __syncthreads(); + row_max_prev[0] = tl::AllReduce::run(row_max_prev[0], (&(((float*)buf_dyn_shmem)[12800]))); + row_scale[0] = exp2f(((row_max[0] - max(row_max[0], row_max_prev[0])) * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/)); + row_max[0] = max(row_max[0], row_max_prev[0]); + #pragma unroll + for (int i_6 = 0; i_6 < 16; ++i_6) { + scores[i_6] = exp2f(((scores[i_6] - row_max[0]) * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/)); + } + row_max_prev[0] = 0x0p+0f/*0.000000e+00*/; + #pragma unroll + for (int rv_1 = 0; rv_1 < 16; ++rv_1) { + row_max_prev[0] = (row_max_prev[0] + scores[(((rv_1 & 3) * 4) + (rv_1 >> 2))]); + } + row_max_prev[0] = tl::AllReduce::run(row_max_prev[0], (&(((float*)buf_dyn_shmem)[12288]))); + row_denom[0] = ((row_denom[0] * row_scale[0]) + row_max_prev[0]); + #pragma unroll + for (int i_7 = 0; i_7 < 4; ++i_7) { + uint2 __1; + float4 v_ = *(float4*)(scores + (i_7 * 4)); + (reinterpret_cast<__maca_bfloat162*>(&__1))[0] = __float22bfloat162_rn(((float2*)(&v_))[0]); + (reinterpret_cast<__maca_bfloat162*>(&__1))[1] = __float22bfloat162_rn(((float2*)(&v_))[1]); + *(uint2*)(probs + (i_7 * 4)) = __1; + } + #pragma unroll + for (int i_8 = 0; i_8 < 32; ++i_8) { + output_accum[i_8] = (output_accum[i_8] * row_scale[0]); + } + __syncthreads(); + if (((kv_tile * 64) + 64) <= copy_kv_len) { + #pragma unroll + for (int i_9 = 0; i_9 < 2; ++i_9) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_9 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(v + (((((kv_tile * 32768) + (i_9 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } + } else { + #pragma unroll + for (int i_10 = 0; i_10 < 2; ++i_10) { + if ((((kv_tile * 64) + (i_10 * 32)) + (((int)threadIdx.x) >> 4)) < copy_kv_len) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_10 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(v + (((((kv_tile * 32768) + (i_10 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } else { + bfloat16_t broadcast_var_3 = bfloat16_t(0x0p+0f/*0.000000e+00*/); + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_10 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = make_uint4(__pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3)); + } + } + } + bfloat16_t B_local_1[32]; + __syncthreads(); + for (int ki_1 = 0; ki_1 < 4; ++ki_1) { + for (int j_2 = 0; j_2 < 8; ++j_2) { + for (int local_id = 0; local_id < 4; ++local_id) { + B_local_1[((j_2 * 4) + local_id)] = ((bfloat16_t*)buf_dyn_shmem)[((((((((((j_2 >> 2) * 4096) + (ki_1 * 1024)) + (((((int)threadIdx.x) & 63) >> 4) * 256)) + (local_id * 64)) + (((((((int)threadIdx.x) & 31) >> 4) + ((j_2 & 3) >> 1)) & 1) * 32)) + ((((local_id >> 1) + (j_2 & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 15) >> 3) + (local_id & 1)) & 1) * 8)) + (((int)threadIdx.x) & 7)) + 16384)]; + } + } + for (int j_3 = 0; j_3 < 8; ++j_3) { + { + *(((float32x4*)output_accum) + j_3) = __builtin_mxc_mma_16x16x16bf16(*(((bfloat16x4_vec*)B_local_1) + j_3), + *(((bfloat16x4_vec*)probs) + ki_1), + *(((float32x4*)output_accum) + j_3)); + }; + } + } + } + row_scale[0] = (0x1p+0f/*1.000000e+00*/ / row_denom[0]); + #pragma unroll + for (int i_11 = 0; i_11 < 8; ++i_11) { + uint2 __2; + float4 __3; + float4 v__1 = *(float4*)(output_accum + (i_11 * 4)); + float4 v__2 = make_float4(row_scale[0], row_scale[0], row_scale[0], row_scale[0]); + __3.x = (v__1.x*v__2.x); + __3.y = (v__1.y*v__2.y); + __3.z = (v__1.z*v__2.z); + __3.w = (v__1.w*v__2.w); + (reinterpret_cast<__maca_bfloat162*>(&__2))[0] = __float22bfloat162_rn(((float2*)(&__3))[0]); + (reinterpret_cast<__maca_bfloat162*>(&__2))[1] = __float22bfloat162_rn(((float2*)(&__3))[1]); + *(uint2*)(output_local_cast + 0) = __2; + *(uint2*)(output + (((((((((((int)threadIdx.x) >> 6) * 8192) + (((((int)threadIdx.x) & 15) >> 3) * 4096)) + (((int)blockIdx.y) * 1024)) + ((((int)threadIdx.x) & 7) * 128)) + (i_11 * 16)) + (((((int)threadIdx.x) & 63) >> 4) * 4)) + 67043328) - (((int)blockIdx.x) * 65536))) = *(uint2*)(output_local_cast + 0); + } +} + diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_018_case4_host_kernel.cu b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_018_case4_host_kernel.cu new file mode 100644 index 0000000..fe11f96 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_018_case4_host_kernel.cu @@ -0,0 +1,193 @@ +#include +#include +#include +#include +#include +#include +#include + +extern "C" __global__ void packed_kernel_factor_softmax_scale_v18_kernel(const bfloat16_t* __restrict__ k, const int* __restrict__ kv_indptr, bfloat16_t* __restrict__ output, const bfloat16_t* __restrict__ q, const bfloat16_t* __restrict__ v); +extern "C" __global__ void __launch_bounds__(512, 1) packed_kernel_factor_softmax_scale_v18_kernel(const bfloat16_t* __restrict__ k, const int* __restrict__ kv_indptr, bfloat16_t* __restrict__ output, const bfloat16_t* __restrict__ q, const bfloat16_t* __restrict__ v) { + extern __shared__ __align__(1024) uchar buf_dyn_shmem[]; + float output_accum[32]; + float row_denom[1]; + float row_max[1]; + float row_scale[1]; + float scores[16]; + float row_max_prev[1]; + bfloat16_t probs[16]; + bfloat16_t output_local_cast[4]; + int copy_kv_len = kv_indptr[1]; + #pragma unroll + for (int i = 0; i < 4; ++i) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + ((((((((((int)threadIdx.x) & 15) >> 3) * 8192) + (i * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8))) = *(uint4*)(q + ((((((i * 16384) + ((((int)threadIdx.x) >> 7) * 4096)) + (((int)blockIdx.y) * 1024)) + ((((int)threadIdx.x) & 127) * 8)) + 67043328) - (((int)blockIdx.x) * 65536))); + } + #pragma unroll + for (int i_1 = 0; i_1 < 8; ++i_1) { + float broadcast_var = 0x0p+0f/*0.000000e+00*/; + *(float4*)(output_accum + (i_1 * 4)) = make_float4(broadcast_var, broadcast_var, broadcast_var, broadcast_var); + } + row_denom[0] = 0x0p+0f/*0.000000e+00*/; + row_max[0] = -MACART_INF_F; + for (int kv_tile = 0; kv_tile < ((16447 - (((int)blockIdx.x) * 16)) >> 6); ++kv_tile) { + __syncthreads(); + if (((kv_tile * 64) + 64) <= copy_kv_len) { + #pragma unroll + for (int i_2 = 0; i_2 < 2; ++i_2) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_2 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(k + (((((kv_tile * 32768) + (i_2 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } + } else { + #pragma unroll + for (int i_3 = 0; i_3 < 2; ++i_3) { + if ((((kv_tile * 64) + (i_3 * 32)) + (((int)threadIdx.x) >> 4)) < copy_kv_len) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_3 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(k + (((((kv_tile * 32768) + (i_3 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } else { + bfloat16_t broadcast_var_1 = bfloat16_t(0x0p+0f/*0.000000e+00*/); + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_3 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = make_uint4(__pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1), __pack_maca_bfloat162(broadcast_var_1, broadcast_var_1)); + } + } + } + if (kv_tile < ((16369 - (((int)blockIdx.x) * 16)) >> 6)) { + #pragma unroll + for (int i_4 = 0; i_4 < 4; ++i_4) { + float broadcast_var_2 = 0x0p+0f/*0.000000e+00*/; + *(float4*)(scores + (i_4 * 4)) = make_float4(broadcast_var_2, broadcast_var_2, broadcast_var_2, broadcast_var_2); + } + } else { + #pragma unroll + for (int i_5 = 0; i_5 < 16; ++i_5) { + float condval; + if ((((((kv_tile * 64) + ((i_5 >> 2) * 16)) + (((((int)threadIdx.x) & 63) >> 4) * 4)) + (i_5 & 3)) <= (((((((int)threadIdx.x) >> 6) * 2) + ((((int)threadIdx.x) & 15) >> 3)) + 16368) - (((int)blockIdx.x) * 16)))) { + condval = 0x0p+0f/*0.000000e+00*/; + } else { + condval = -MACART_INF_F; + } + scores[i_5] = condval; + } + } + bfloat16_t A_local[4]; + bfloat16_t B_local[16]; + __syncthreads(); + for (int ki = 0; ki < 8; ++ki) { + *(uint2*)(A_local + 0) = *(uint2*)(((bfloat16_t*)buf_dyn_shmem) + ((((((((ki >> 2) * 8192) + ((((int)threadIdx.x) >> 6) * 1024)) + ((((int)threadIdx.x) & 15) * 64)) + (((((((int)threadIdx.x) & 7) >> 2) + ((ki & 3) >> 1)) & 1) * 32)) + (((((((int)threadIdx.x) & 3) >> 1) + (ki & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 63) >> 5) + (((int)threadIdx.x) & 1)) & 1) * 8)) + (((((int)threadIdx.x) & 31) >> 4) * 4))); + for (int j = 0; j < 4; ++j) { + *(uint2*)(B_local + (j * 4)) = *(uint2*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((ki >> 2) * 4096) + (j * 1024)) + ((((int)threadIdx.x) & 15) * 64)) + (((((((int)threadIdx.x) & 7) >> 2) + ((ki & 3) >> 1)) & 1) * 32)) + (((((((int)threadIdx.x) & 3) >> 1) + (ki & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 63) >> 5) + (((int)threadIdx.x) & 1)) & 1) * 8)) + (((((int)threadIdx.x) & 31) >> 4) * 4)) + 16384)); + } + for (int j_1 = 0; j_1 < 4; ++j_1) { + { + *(((float32x4*)scores) + j_1) = __builtin_mxc_mma_16x16x16bf16(*(((bfloat16x4_vec*)B_local) + j_1), + *(((bfloat16x4_vec*)A_local) + 0), + *(((float32x4*)scores) + j_1)); + }; + } + } + row_max_prev[0] = -MACART_INF_F; + #pragma unroll + for (int rv = 0; rv < 16; ++rv) { + row_max_prev[0] = max(row_max_prev[0], scores[(((rv & 3) * 4) + (rv >> 2))]); + } + __syncthreads(); + row_max_prev[0] = tl::AllReduce::run(row_max_prev[0], (&(((float*)buf_dyn_shmem)[12800]))); + row_scale[0] = exp2f(((row_max[0] - max(row_max[0], row_max_prev[0])) * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/)); + row_max[0] = max(row_max[0], row_max_prev[0]); + #pragma unroll + for (int i_6 = 0; i_6 < 16; ++i_6) { + scores[i_6] = exp2f(((scores[i_6] - row_max[0]) * 0x1.0527dbd5cafffp-3f/*1.275174e-01*/)); + } + row_max_prev[0] = 0x0p+0f/*0.000000e+00*/; + #pragma unroll + for (int rv_1 = 0; rv_1 < 16; ++rv_1) { + row_max_prev[0] = (row_max_prev[0] + scores[(((rv_1 & 3) * 4) + (rv_1 >> 2))]); + } + row_max_prev[0] = tl::AllReduce::run(row_max_prev[0], (&(((float*)buf_dyn_shmem)[12288]))); + row_denom[0] = ((row_denom[0] * row_scale[0]) + row_max_prev[0]); + #pragma unroll + for (int i_7 = 0; i_7 < 4; ++i_7) { + uint2 __1; + float4 v_ = *(float4*)(scores + (i_7 * 4)); + (reinterpret_cast<__maca_bfloat162*>(&__1))[0] = __float22bfloat162_rn(((float2*)(&v_))[0]); + (reinterpret_cast<__maca_bfloat162*>(&__1))[1] = __float22bfloat162_rn(((float2*)(&v_))[1]); + *(uint2*)(probs + (i_7 * 4)) = __1; + } + #pragma unroll + for (int i_8 = 0; i_8 < 32; ++i_8) { + output_accum[i_8] = (output_accum[i_8] * row_scale[0]); + } + __syncthreads(); + if (((kv_tile * 64) + 64) <= copy_kv_len) { + #pragma unroll + for (int i_9 = 0; i_9 < 2; ++i_9) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_9 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(v + (((((kv_tile * 32768) + (i_9 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } + } else { + #pragma unroll + for (int i_10 = 0; i_10 < 2; ++i_10) { + if ((((kv_tile * 64) + (i_10 * 32)) + (((int)threadIdx.x) >> 4)) < copy_kv_len) { + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_10 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = *(uint4*)(v + (((((kv_tile * 32768) + (i_10 * 16384)) + ((((int)threadIdx.x) >> 4) * 512)) + (((int)blockIdx.y) * 128)) + ((((int)threadIdx.x) & 15) * 8))); + } else { + bfloat16_t broadcast_var_3 = bfloat16_t(0x0p+0f/*0.000000e+00*/); + *(uint4*)(((bfloat16_t*)buf_dyn_shmem) + (((((((((((int)threadIdx.x) & 15) >> 3) * 4096) + (i_10 * 2048)) + ((((int)threadIdx.x) >> 4) * 64)) + (((((((int)threadIdx.x) & 127) >> 6) + ((((int)threadIdx.x) & 7) >> 2)) & 1) * 32)) + (((((((int)threadIdx.x) & 63) >> 5) + ((((int)threadIdx.x) & 3) >> 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 31) >> 4) + (((int)threadIdx.x) & 1)) & 1) * 8)) + 16384)) = make_uint4(__pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3), __pack_maca_bfloat162(broadcast_var_3, broadcast_var_3)); + } + } + } + bfloat16_t B_local_1[32]; + __syncthreads(); + for (int ki_1 = 0; ki_1 < 4; ++ki_1) { + for (int j_2 = 0; j_2 < 8; ++j_2) { + for (int local_id = 0; local_id < 4; ++local_id) { + B_local_1[((j_2 * 4) + local_id)] = ((bfloat16_t*)buf_dyn_shmem)[((((((((((j_2 >> 2) * 4096) + (ki_1 * 1024)) + (((((int)threadIdx.x) & 63) >> 4) * 256)) + (local_id * 64)) + (((((((int)threadIdx.x) & 31) >> 4) + ((j_2 & 3) >> 1)) & 1) * 32)) + ((((local_id >> 1) + (j_2 & 1)) & 1) * 16)) + (((((((int)threadIdx.x) & 15) >> 3) + (local_id & 1)) & 1) * 8)) + (((int)threadIdx.x) & 7)) + 16384)]; + } + } + for (int j_3 = 0; j_3 < 8; ++j_3) { + { + *(((float32x4*)output_accum) + j_3) = __builtin_mxc_mma_16x16x16bf16(*(((bfloat16x4_vec*)B_local_1) + j_3), + *(((bfloat16x4_vec*)probs) + ki_1), + *(((float32x4*)output_accum) + j_3)); + }; + } + } + } + row_scale[0] = (0x1p+0f/*1.000000e+00*/ / row_denom[0]); + #pragma unroll + for (int i_11 = 0; i_11 < 8; ++i_11) { + uint2 __2; + float4 __3; + float4 v__1 = *(float4*)(output_accum + (i_11 * 4)); + float4 v__2 = make_float4(row_scale[0], row_scale[0], row_scale[0], row_scale[0]); + __3.x = (v__1.x*v__2.x); + __3.y = (v__1.y*v__2.y); + __3.z = (v__1.z*v__2.z); + __3.w = (v__1.w*v__2.w); + (reinterpret_cast<__maca_bfloat162*>(&__2))[0] = __float22bfloat162_rn(((float2*)(&__3))[0]); + (reinterpret_cast<__maca_bfloat162*>(&__2))[1] = __float22bfloat162_rn(((float2*)(&__3))[1]); + *(uint2*)(output_local_cast + 0) = __2; + *(uint2*)(output + (((((((((((int)threadIdx.x) >> 6) * 8192) + (((((int)threadIdx.x) & 15) >> 3) * 4096)) + (((int)blockIdx.y) * 1024)) + ((((int)threadIdx.x) & 7) * 128)) + (i_11 * 16)) + (((((int)threadIdx.x) & 63) >> 4) * 4)) + 67043328) - (((int)blockIdx.x) * 65536))) = *(uint2*)(output_local_cast + 0); + } +} + + +#define ERROR_BUF_SIZE 1024 +static char error_buf[ERROR_BUF_SIZE]; + +extern "C" const char* get_last_error() { + return error_buf; +} + +extern "C" int init() { + error_buf[0] = '\0'; + + if (53248 > 65536) { + snprintf(error_buf, ERROR_BUF_SIZE, "Failed to set the allowed dynamic shared memory size for packed_kernel_factor_softmax_scale_v18_kernel to %d", 53248); + return -1; + } + return 0; + + return 0; +} + +extern "C" int call(bfloat16_t* __restrict__ q, bfloat16_t* __restrict__ k, bfloat16_t* __restrict__ v, bfloat16_t* __restrict__ output, int* __restrict__ qo_indptr, int* __restrict__ kv_indptr, mcStream_t stream=mcStreamDefault) { + packed_kernel_factor_softmax_scale_v18_kernel<<>>(k, kv_indptr, output, q, v); + TILELANG_CHECK_LAST_ERROR("packed_kernel_factor_softmax_scale_v18_kernel"); + + return 0; +} diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tests/benchmark_tilelang_64g_opt012.py b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tests/benchmark_tilelang_64g_opt012.py new file mode 100644 index 0000000..b1b918c --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tests/benchmark_tilelang_64g_opt012.py @@ -0,0 +1,178 @@ +import csv +import importlib.util +import statistics +import time + +import torch + + +KERNEL_PATH = "/data/operator_task_package/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_012_dense_softmax_cleanup.py" +OUTPUT_PATH = "/data/operator_task_package/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/results/tilelang_64g/opt_012_benchmark.csv" +SAMPLE_COUNT = 15 +TARGET_SAMPLE_MS = 100.0 +MAX_REPEATS = 2000 +WARMUP_REPEATS = 10 + +CASES = ( + (1, "ragged_b33_total16294", [987] + [478] * 31 + [489], [987] + [478] * 31 + [489]), + (2, "equal_b1_s1024", [1024], [1024]), + (3, "equal_b1_s4096", [4096], [4096]), + (4, "equal_b1_s16384", [16384], [16384]), + (5, "equal_b4_s1024", [1024] * 4, [1024] * 4), + (6, "equal_b4_s4096", [4096] * 4, [4096] * 4), + (7, "equal_b16_s1024", [1024] * 16, [1024] * 16), + (8, "equal_b16_s2048", [2048] * 16, [2048] * 16), + (9, "varlen_uniform_q512_k1024_b4", [512] * 4, [1024] * 4), + (10, "varlen_mixed_b4", [640, 384, 256, 256], [1280, 1024, 768, 512]), + (11, "varlen_q_lt_kv_b2", [512, 512], [2048, 1024]), + (12, "ragged_b27_total12251", [873] + [438] * 25 + [428], [873] + [438] * 25 + [428]), + (13, "short_ragged_b15_total969", [123] + [60] * 13 + [66], [123] + [60] * 13 + [66]), + (14, "single_token", [1], [1]), + (15, "tail_non_power2", [65, 33], [65, 33]), +) + + +def load_kernel(): + spec = importlib.util.spec_from_file_location("ragged_tilelang_opt012", KERNEL_PATH) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def make_indptr(lengths): + values = [0] + for length in lengths: + values.append(values[-1] + length) + return torch.tensor(values, device="cuda", dtype=torch.int32) + + +def event_average_ms(function, repeats): + start = torch.cuda.Event(enable_timing=True) + end = torch.cuda.Event(enable_timing=True) + start.record() + for _ in range(repeats): + function() + end.record() + end.synchronize() + return start.elapsed_time(end) / repeats + + +def percentile(values, fraction): + ordered = sorted(values) + position = fraction * (len(ordered) - 1) + lower = int(position) + upper = min(lower + 1, len(ordered) - 1) + weight = position - lower + return ordered[lower] * (1.0 - weight) + ordered[upper] * weight + + +def benchmark_case(module, case_id, name, q_lengths, kv_lengths): + torch.manual_seed(20260715 + case_id) + batch_size = len(q_lengths) + total_q = sum(q_lengths) + total_kv = sum(kv_lengths) + max_q = max(q_lengths) + max_kv = max(kv_lengths) + seq_len = max(max_q, max_kv) + + q = torch.randn(total_q, 32, 128, device="cuda", dtype=torch.bfloat16) + k = torch.randn(total_kv, 4, 128, device="cuda", dtype=torch.bfloat16) + v = torch.randn_like(k) + output = torch.empty_like(q) + qo_indptr = make_indptr(q_lengths) + kv_indptr = make_indptr(kv_lengths) + + def launch(): + module.run_kernel( + q, + k, + v, + output, + qo_indptr, + kv_indptr, + batch_size, + seq_len, + 32, + 4, + 128, + 128, + 1, + ) + + torch.cuda.synchronize() + compile_start = time.perf_counter() + launch() + torch.cuda.synchronize() + compile_seconds = time.perf_counter() - compile_start + + for _ in range(WARMUP_REPEATS): + launch() + torch.cuda.synchronize() + + pilot_ms = event_average_ms(launch, 3) + repeats = max(1, min(MAX_REPEATS, int(TARGET_SAMPLE_MS / max(pilot_ms, 1.0e-4)))) + samples = [event_average_ms(launch, repeats) for _ in range(SAMPLE_COUNT)] + + median_ms = statistics.median(samples) + p10_ms = percentile(samples, 0.10) + p90_ms = percentile(samples, 0.90) + spread_pct = (p90_ms - p10_ms) / median_ms * 100.0 + + row = { + "case_id": case_id, + "config": name, + "batch": batch_size, + "total_q": total_q, + "total_kv": total_kv, + "max_q": max_q, + "max_kv": max_kv, + "seq_len": seq_len, + "compile_first_launch_s": f"{compile_seconds:.6f}", + "pilot_ms": f"{pilot_ms:.6f}", + "repeats_per_sample": repeats, + "sample_count": SAMPLE_COUNT, + "median_ms": f"{median_ms:.6f}", + "p10_ms": f"{p10_ms:.6f}", + "p90_ms": f"{p90_ms:.6f}", + "min_ms": f"{min(samples):.6f}", + "max_ms": f"{max(samples):.6f}", + "spread_pct": f"{spread_pct:.3f}", + } + + print( + f"case={case_id:02d} {name}: median={median_ms:.6f} ms, " + f"p10={p10_ms:.6f}, p90={p90_ms:.6f}, spread={spread_pct:.2f}%, " + f"repeats={repeats}, compile_first={compile_seconds:.3f} s", + flush=True, + ) + + del q, k, v, output, qo_indptr, kv_indptr + torch.cuda.empty_cache() + return row + + +def main(): + module = load_kernel() + rows = [] + fieldnames = None + + for case in CASES: + row = benchmark_case(module, *case) + rows.append(row) + if fieldnames is None: + fieldnames = list(row.keys()) + with open(OUTPUT_PATH, "w", newline="", encoding="ascii") as output_file: + writer = csv.DictWriter(output_file, fieldnames=fieldnames) + writer.writeheader() + writer.writerows(rows) + + total_median_ms = sum(float(row["median_ms"]) for row in rows) + print( + f"TILELANG_OPT012_BENCHMARK_PASS cases={len(rows)} " + f"sum_of_medians_ms={total_median_ms:.6f} output={OUTPUT_PATH}", + flush=True, + ) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tests/test_opt_012_formal.py b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tests/test_opt_012_formal.py new file mode 100644 index 0000000..887244e --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tests/test_opt_012_formal.py @@ -0,0 +1,108 @@ +import importlib.util +import math +import torch + +ATOL = 1.6e-2 +RTOL = 1.6e-2 + +CASES = ( + (1, [987] + [478] * 31 + [489], [987] + [478] * 31 + [489]), + (2, [1024], [1024]), + (3, [4096], [4096]), + (4, [16384], [16384]), + (5, [1024] * 4, [1024] * 4), + (6, [4096] * 4, [4096] * 4), + (7, [1024] * 16, [1024] * 16), + (8, [2048] * 16, [2048] * 16), + (9, [512] * 4, [1024] * 4), + (10, [640, 384, 256, 256], [1280, 1024, 768, 512]), + (11, [512, 512], [2048, 1024]), + (12, [873] + [438] * 25 + [428], [873] + [438] * 25 + [428]), + (13, [123] + [60] * 13 + [66], [123] + [60] * 13 + [66]), + (14, [1], [1]), + (15, [65, 33], [65, 33]), +) + + +def load_kernel(kernel_path): + spec = importlib.util.spec_from_file_location("ragged_kernel", kernel_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def indptr(lengths): + values = [0] + for length in lengths: + values.append(values[-1] + length) + return torch.tensor(values, dtype=torch.int32, device="cuda") + + +def main(): + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--kernel-path", required=True) + args = parser.parse_args() + + torch.manual_seed(20260714) + module = load_kernel(args.kernel_path) + + print("case,batch,total_q,total_kv,max_len,match,max_abs,worst_ratio,nan,inf,pass") + for case_id, q_lens, kv_lens in CASES: + batch_size = len(q_lens) + total_q = sum(q_lens) + total_kv = sum(kv_lens) + max_len = max(max(q_lens), max(kv_lens)) + qo = indptr(q_lens) + kv = indptr(kv_lens) + q = torch.randn(total_q, 32, 128, dtype=torch.bfloat16, device="cuda") + k = torch.randn(total_kv, 4, 128, dtype=torch.bfloat16, device="cuda") + v = torch.randn(total_kv, 4, 128, dtype=torch.bfloat16, device="cuda") + output = torch.empty_like(q) + + module.run_kernel( + q, k, v, output, qo, kv, batch_size, max_len, 32, 4, 128, 128, 1 + ) + torch.cuda.synchronize() + + reference = torch.empty_like(output) + import flashinfer + workspace = torch.empty(128 * 1024 * 1024, dtype=torch.uint8, device="cuda") + wrapper = flashinfer.BatchPrefillWithRaggedKVCacheWrapper( + workspace, kv_layout="NHD", backend="auto" + ) + wrapper.plan( + qo, kv, 32, 4, 128, 128, causal=True, + q_data_type=torch.bfloat16, kv_data_type=torch.bfloat16, + ) + wrapper.run(q, k, v, out=reference) + torch.cuda.synchronize() + + ref_float = reference.float() + diff = (output.float() - ref_float).abs() + tolerance = ATOL + RTOL * ref_float.abs() + match = (diff <= tolerance).float().mean().item() + max_abs = diff.max().item() + worst_ratio = (diff / tolerance).max().item() + required_match = 1.0 if case_id in (14, 15) else 0.99 + has_nan = torch.isnan(output).any().item() + has_inf = torch.isinf(output).any().item() + passed = ( + not has_nan and not has_inf + and match >= required_match + and worst_ratio <= 8.0 + ) + + print( + f"{case_id},{batch_size},{total_q},{total_kv},{max_len}," + f"{match:.8f},{max_abs:.8f},{worst_ratio:.8f}," + f"{has_nan},{has_inf},{passed}", + flush=True, + ) + + if not passed: + print(f" FAILED case {case_id}: required_match={required_match}, got {match}") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_012_dense_softmax_cleanup.cpython-312.pyc b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_012_dense_softmax_cleanup.cpython-312.pyc index 4a34427e419ba07100fe55a3e579c40242f5f2a7..cc1b577dda09963f2764bdd3ab809ffd7b96cc43 100644 GIT binary patch delta 21 bcmX@q$9SlZk?S-sFBbz4ta`GM%fcN1OSlGP delta 21 bcmX@q$9SlZk?S-sFBbz4Tv@r1%fcN1ON|Co diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_013_dispatch_improved.cpython-312.pyc b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_013_dispatch_improved.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7af1e4b12d055677a9d1b10373adc5012555c106 GIT binary patch literal 18600 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 literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_015_v_prefetch_after_qk.cpython-312.pyc b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_015_v_prefetch_after_qk.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5938c515df09186356abe18d1dd7bc4104b3e7c GIT binary patch literal 18216 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 literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_018_factor_softmax_scale.cpython-312.pyc b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/opt_018_factor_softmax_scale.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0350eb5bcf5ce15c7e7ec8e6d65915df735384c GIT binary patch literal 18208 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 literal 0 HcmV?d00001 diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/run_kernel.cpython-312.pyc b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/__pycache__/run_kernel.cpython-312.pyc index c1b421015a4d2f2b1fa38150c8aa2803b85b86f3..364337c8dc26bb7bcd1efd7fd4ad68cd76ad5bb0 100644 GIT binary patch delta 7204 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 q_len) + or (kv_pos >= kv_len) + or (causal and kv_pos >= q_pos + 1 + causal_offset), + -1.0e9, + 0.0, + ) + + # 计算 Q @ K^T。默认 clear_accum=False,会保留上面写入 scores + # 的初始 mask 并将矩阵乘结果累加进去。 + T.gemm( + q_shared, + k_shared, + scores, + transpose_B=True, + policy=T.GemmWarpPolicy.FullRow, + ) + + # 第一步:求当前 KV tile 每一行的最大值,暂存在 row_max_prev。 + # row_max 仍然保存此前所有 KV tile 的 running max。 + T.reduce_max(scores, row_max_prev, dim=1) + for i in T.Parallel(BLOCK_M): + # 若当前 tile 提高了最大值,历史分母和历史输出分子都必须乘: + # exp(old_max-new_max)。这里已换算为 exp2 域。 + row_scale[i] = T.exp2( + row_max[i] * softmax_scale + - T.max(row_max[i], row_max_prev[i]) + * softmax_scale + ) + # 将 running max 更新为包含当前 tile 的新最大值。 + row_max[i] = T.max(row_max[i], row_max_prev[i]) + + # 第二步:计算当前 tile 相对于新 running max 的未归一化指数值。 + # 此处不立即除以分母,避免每个 KV tile 都执行完整归一化。 + for i, j in T.Parallel(BLOCK_M, block_n): + scores[i, j] = T.exp2( + scores[i, j] * softmax_scale + - row_max[i] * softmax_scale + ) + # row_max_prev 的 tile-max 已完成使命,现在复用同一个 fragment + # 保存当前 tile 每一行的指数和,从而避免单独分配 row_sum。 + T.reduce_sum(scores, row_max_prev, dim=1) + for i in T.Parallel(BLOCK_M): + # 更新在线 Softmax 分母:先把历史分母调整到新最大值尺度, + # 再加上当前 tile 的指数和。 + row_denom[i] = ( + row_denom[i] * row_scale[i] + row_max_prev[i] + ) + # PV GEMM 使用 BF16 输入,因此把 FP32 指数权重转换到 probs。 + T.copy(scores, probs) + + # 输出分子和分母必须处于相同的最大值尺度。先缩放历史输出分子, + # 再通过下面的 PV GEMM 加入当前 tile 的贡献。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + # 当前 K 已经不再使用,加载对应的 V tile。 + T.copy( + v[ + kv_start + kv_tile * block_n : kv_start + (kv_tile + 1) * block_n, + kv_head, + :, + ], + v_shared, + ) + # output_accum += probs @ V,保持 FP32 累加精度。 + T.gemm( + probs, + v_shared, + output_accum, + policy=T.GemmWarpPolicy.FullRow, + ) + + if valid_q_tile: + # KV 循环结束后才做最终归一化。每行只计算一次 1/denom,避免 + # head_dim_vo 个输出元素分别执行相同的除法。 + for i in T.Parallel(BLOCK_M): + q_pos = q_tile * BLOCK_M + i + row_scale[i] = T.if_then_else( + (q_pos < q_len) + and ( + (not causal) + or q_pos + causal_offset >= 0 + ), + 1.0 / row_denom[i], + 0.0, + ) + + # 用乘法完成整行归一化。完全被 mask 的行乘 0。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + # 只写回请求实际存在的 query 行,抑制最后一个 Q tile 的尾部。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + if q_tile * BLOCK_M + i < q_len: + output[ + q_start + q_tile * BLOCK_M + i, + qo_head, + d, + ] = output_accum[i, d] + + return kernel + + +@jit( + execution_backend="cython", + pass_configs={ + tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True, + tilelang.PassConfigKey.TL_DISABLE_DATA_RACE_CHECK: True, + }, + compile_flags=["-O3", "-DENABLE_BF16"], +) +def build_packed_kernel_pv_fullcol_v14( + total_q, + total_kv, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """构建主 GQA kernel,并在长路径按输出列划分 PV waves。""" + + # equal-length 且 seq_len<=1024 时使用 M64/N32/256 threads。较小的资源 + # 占用可提高 CTA 驻留数;长序列和非对称形状保持 M128/N64/512 threads, + # 以减少 Q tile 数量、KV 循环次数和在线 Softmax 更新次数。 + use_resident2 = total_q == total_kv and seq_len <= 1024 + packed_block_m = 64 if use_resident2 else 128 + packed_block_n = 32 if use_resident2 else 64 + packed_threads = 256 if use_resident2 else 512 + # opt_012 的 case-4 生成代码中,FullRow PV 会把 V 从 shared memory + # 逐个 BF16 标量搬到 B fragment;profiler 同时显示 shared efficiency + # 只有 74.04%,VLS pipeline stall 占比升至 10.72%。长路径改用 FullCol, + # 让 waves 沿 128 维输出列划分,目标是生成更连续的 V shared 读取。 + # resident2 短路径保留已验证的 FullRow 映射,避免扩大实验影响面。 + pv_policy = ( + T.GemmWarpPolicy.FullRow + if use_resident2 + else T.GemmWarpPolicy.FullCol + ) + # 本题 group_size=8。一个 KV head 对应连续的 8 个 Q head。 + group_size = num_qo_heads // num_kv_heads + # packed M 维中的每一行不是单纯的 query position,而是: + # packed_row = q_pos * group_size + group_head。 + # 因此同一个 CTA 可以处理一个 KV head 对应的多个 Q head,并让这些 Q + # head 在 CTA 内共享 K/V 的 global->shared 加载。 + packed_tile_count = T.ceildiv(seq_len * group_size, packed_block_m) + # dense_equal 是编译期常量。由于每个 segment 长度都不超过 seq_len,而 + # 总长度恰好为 batch_size*seq_len,可以严格推出每个 segment 都等长。 + dense_equal = ( + total_q == batch_size * seq_len + and total_kv == batch_size * seq_len + ) + # 对 dense 长序列启用反向逻辑 tile 映射。因果 attention 中越靠后的 Q + # tile 能看到越多 KV,计算量越大;优先提交重 tile 可以缩短最后少数 CTA + # 造成的调度长尾。resident2 和 ragged 路径仍保持正向映射。 + reverse_dense_tiles = dense_equal and not use_resident2 + # attention scale 转为 exp2 所需的 base-2 缩放系数。 + softmax_scale = (1.0 / head_dim_qk) ** 0.5 * LOG2_E + + @T.prim_func + def packed_kernel_pv_fullcol_v14( + q: T.Tensor((total_q, num_qo_heads, head_dim_qk), T.bfloat16), + k: T.Tensor((total_kv, num_kv_heads, head_dim_qk), T.bfloat16), + v: T.Tensor((total_kv, num_kv_heads, head_dim_vo), T.bfloat16), + output: T.Tensor((total_q, num_qo_heads, head_dim_vo), T.bfloat16), + qo_indptr: T.Tensor((batch_size + 1,), T.int32), + kv_indptr: T.Tensor((batch_size + 1,), T.int32), + ): + # 网格维度: + # x = packed Q tile; + # y = KV head; + # z = batch/request。 + # 一个 CTA 因而处理一个请求、一个 KV head 和一段 packed Q rows。 + with T.Kernel( + packed_tile_count, + num_kv_heads, + batch_size, + threads=packed_threads, + ) as (packed_tile, kv_head, batch_idx): + # Q tile 在整个 KV 循环中常驻 shared memory。长路径 M=128 时, + # q_shared 大小为 128*128*2 = 32 KiB。 + q_shared = T.alloc_shared( + (packed_block_m, head_dim_qk), T.bfloat16 + ) + # 同一个 kv_shared 分时保存 K 和 V:QK GEMM 完成后当前 K 生命周期 + # 已结束,随后 V 覆盖这块空间。这样长路径只需 16 KiB KV shared, + # 而不是分别为 K、V 分配两份内存。 + kv_shared = T.alloc_shared( + (packed_block_n, head_dim_qk), T.bfloat16 + ) + + # scores:FP32 QK 累加器和当前 tile 的指数权重。 + scores = T.alloc_fragment( + (packed_block_m, packed_block_n), T.float32 + ) + # probs:scores 转成 BF16 后供 PV 矩阵乘使用。 + probs = T.alloc_fragment( + (packed_block_m, packed_block_n), T.bfloat16 + ) + # output_accum:跨全部 KV tile 保存 FP32 输出分子。 + output_accum = T.alloc_fragment( + (packed_block_m, head_dim_vo), T.float32 + ) + # 每个 packed row 的在线 Softmax 状态。row_max_prev 是 scratch, + # row_scale 在循环中保存历史尺度修正,循环结束后复用为 1/denom。 + row_max = T.alloc_fragment((packed_block_m,), T.float32) + row_max_prev = T.alloc_fragment((packed_block_m,), T.float32) + row_scale = T.alloc_fragment((packed_block_m,), T.float32) + row_denom = T.alloc_fragment((packed_block_m,), T.float32) + + # dense equal-length 特化:直接用 batch_idx*seq_len 定位请求,并将 + # q_len/kv_len 变成编译期常量;ragged 路径仍从 indptr 读取真实边界。 + # 这可删除 dense 热路径上的 indptr load 和部分动态边界判断。 + q_start = ( + batch_idx * seq_len + if dense_equal + else qo_indptr[batch_idx] + ) + kv_start = ( + batch_idx * seq_len + if dense_equal + else kv_indptr[batch_idx] + ) + q_len = ( + seq_len + if dense_equal + else qo_indptr[batch_idx + 1] - q_start + ) + kv_len = ( + seq_len + if dense_equal + else kv_indptr[batch_idx + 1] - kv_start + ) + # MetaX PipelinePlanning 在 dense 长度完全常量化后,会把同一 + # kv_shared 中先写 K、后写 V 的合法生命周期复用误判成 stage + # 重叠写。dense 路径仅为 copy 边界保留一次运行时 indptr 读取, + # 数学边界、网格和有效 tile 判断仍然使用常量 kv_len。 + copy_kv_len = ( + kv_indptr[batch_idx + 1] - kv_start + if dense_equal + else kv_len + ) + # packed_q_len 是当前请求包含的逻辑 packed rows 数量。 + packed_q_len = q_len * group_size + # physical packed_tile 来自 blockIdx.x;logical_packed_tile 决定实际 + # 处理哪段 Q。反转只改变 CTA 提交顺序,不改变数学结果或输出位置。 + logical_packed_tile = ( + packed_tile_count - 1 - packed_tile + if reverse_dense_tiles + else packed_tile + ) + packed_tile_start = logical_packed_tile * packed_block_m + # dense 路径的网格恰好覆盖全部 packed rows,因此所有 CTA 有效; + # ragged 请求可能短于 seq_len 上界,需要在运行时过滤无效 CTA。 + valid_q_tile = ( + True + if dense_equal + else packed_tile_start < packed_q_len + ) + # bottom-right causal mask 使用 kv_len-q_len 修正 Q/KV 长度差。 + causal_offset = kv_len - q_len + + if valid_q_tile: + # 将 packed row 反解为 query position 和 GQA 组内 Q head: + # q_pos = packed_row // group_size + # group_head= packed_row % group_size + # 再与当前 kv_head 组合出原始 qo_head。最后一个 tile 的补齐行写0。 + for i, d in T.Parallel(packed_block_m, head_dim_qk): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + group_head = packed_row % group_size + if packed_row < packed_q_len: + q_shared[i, d] = q[ + q_start + q_pos, + kv_head * group_size + group_head, + d, + ] + else: + q_shared[i, d] = T.cast(0, T.bfloat16) + + # 初始化在线 Softmax:输出分子=0、分母=0、running max=-inf。 + T.clear(output_accum) + T.clear(row_denom) + T.fill(row_max, -T.infinity(T.float32)) + + # 当前 packed tile 末尾对应的 query position 上界。一个 packed tile + # 覆盖 packed_block_m/group_size 个不同 query position。 + q_upper_bound = T.min( + q_len, + T.ceildiv( + (logical_packed_tile + 1) * packed_block_m, + group_size, + ), + ) + # 使用 tile 内最后一个 query 的因果边界求最大可见 KV 长度,以便 + # 整块跳过其右侧不可能被任何行看到的 KV tiles。 + max_visible = T.min( + T.max(0, causal_offset + q_upper_bound), + kv_len, + ) + visible_tile_count = ( + T.ceildiv(max_visible, packed_block_n) + if causal + else T.ceildiv(kv_len, packed_block_n) + ) + # 无效 ragged Q tile 的 loop_range=0,可跳过全部主要计算。 + loop_range = T.if_then_else( + valid_q_tile, visible_tile_count, 0 + ) + # 当前 packed tile 第一行对应的 query position。 + first_q_pos = packed_tile_start // group_size + # 如果某个 KV tile 连当前 packed tile 的第一行都完全可见,那么它 + # 对后续所有行也完全可见。这部分 tile 无需逐元素生成 causal mask, + # 直接把 scores 清零作为 GEMM 初始累加器即可。 + fully_visible_tiles = T.min( + loop_range, + T.max( + 0, + (first_q_pos + causal_offset + 1) // packed_block_n, + ), + ) + + # 顺序扫描当前 packed Q tile 可见的 KV tiles。在线 Softmax 的 + # running max/denom/output_accum 在相邻迭代间存在严格依赖。 + for kv_tile in T.Pipelined(loop_range, num_stages=NUM_STAGES): + # 当前 KV tile 在请求内部的半开区间 [tile_start, tile_end)。 + tile_start = kv_tile * packed_block_n + tile_end = tile_start + packed_block_n + + if tile_end <= copy_kv_len: + # 完整 K tile 走向量化 copy。disable_tma=True 使用当前 + # MetaX 后端已验证可工作的普通 shared-memory copy 路径。 + T.copy( + k[ + kv_start + tile_start : kv_start + tile_end, + kv_head, + :, + ], + kv_shared, + disable_tma=True, + ) + else: + # 最后一个 ragged K tile 可能越过请求边界,必须逐元素判断; + # 越界位置填0,不能读到扁平张量中下一个请求的数据。 + for j, d in T.Parallel(packed_block_n, head_dim_qk): + kv_pos = tile_start + j + if kv_pos < copy_kv_len: + kv_shared[j, d] = k[ + kv_start + kv_pos, kv_head, d + ] + else: + kv_shared[j, d] = T.cast(0, T.bfloat16) + + if causal and kv_tile < fully_visible_tiles: + # 整块对所有 query 行可见,只需将 QK 累加器初始化为0。 + T.clear(scores) + else: + # causal frontier 或 ragged tail 需要逐元素初始化 mask。 + # 合法条件同时检查 packed Q tail、KV tail 和 bottom-right + # causal 边界;非法元素设为 -inf,使其 softmax 权重为0。 + for i, j in T.Parallel( + packed_block_m, packed_block_n + ): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + kv_pos = tile_start + j + scores[i, j] = T.if_then_else( + (packed_row < packed_q_len) + and (kv_pos < kv_len) + and ( + (not causal) + or kv_pos < q_pos + 1 + causal_offset + ), + 0.0, + -T.infinity(T.float32), + ) + + # scores = mask + Q @ K^T。clear_accum 默认为 False,因此前面 + # 写入的 0/-inf mask 会作为矩阵乘累加器被保留下来。 + T.gemm( + q_shared, + kv_shared, + scores, + transpose_B=True, + policy=T.GemmWarpPolicy.FullRow, + ) + + # 求当前 tile 的逐行最大值。row_max_prev 是 scratch,row_max + # 始终保存此前全部 KV tiles 的 running max。 + T.reduce_max(scores, row_max_prev, dim=1) + for i in T.Parallel(packed_block_m): + # 最大值改变时,用 exp(old_max-new_max) 把历史分母和历史 + # 输出分子转换到新的数值尺度,保证在线 Softmax 数值稳定。 + row_scale[i] = T.exp2( + row_max[i] * softmax_scale + - T.max(row_max[i], row_max_prev[i]) + * softmax_scale + ) + # 合并历史最大值与当前 tile 最大值。 + row_max[i] = T.max(row_max[i], row_max_prev[i]) + + # 将 logits 转成相对于新 running max 的指数值。采用 + # FlashAttention 风格在线 Softmax,不保存完整 attention 矩阵。 + for i, j in T.Parallel(packed_block_m, packed_block_n): + scores[i, j] = T.exp2( + scores[i, j] * softmax_scale + - row_max[i] * softmax_scale + ) + # tile max 已无后续用途,复用 row_max_prev 保存当前指数和。 + T.reduce_sum(scores, row_max_prev, dim=1) + for i in T.Parallel(packed_block_m): + # 分母更新:历史分母先乘 row_scale,再加当前 tile 指数和。 + row_denom[i] = ( + row_denom[i] * row_scale[i] + row_max_prev[i] + ) + # PV GEMM 输入为 BF16,将 FP32 指数权重转换到 probs fragment。 + T.copy(scores, probs) + + # 历史输出分子与分母使用相同的 row_scale 重新定标。 + for i, d in T.Parallel(packed_block_m, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + if tile_end <= copy_kv_len: + # QK 已结束,当前 K 不再存活;把对应 V tile 覆盖写入同一个 + # kv_shared,以减少每 CTA 的动态 shared memory 占用。 + T.copy( + v[ + kv_start + tile_start : kv_start + tile_end, + kv_head, + :, + ], + kv_shared, + disable_tma=True, + ) + else: + # ragged V tail 与 K tail 一样执行显式边界判断和补0。 + for j, d in T.Parallel(packed_block_n, head_dim_vo): + kv_pos = tile_start + j + if kv_pos < copy_kv_len: + kv_shared[j, d] = v[ + kv_start + kv_pos, kv_head, d + ] + else: + kv_shared[j, d] = T.cast(0, T.bfloat16) + + # 累积当前 tile 的输出贡献:output_accum += probs @ V。 + T.gemm( + probs, + kv_shared, + output_accum, + policy=pv_policy, + ) + + if valid_q_tile: + # 所有 KV tiles 处理完后再归一化。row_scale 已结束循环内使命, + # 现在复用为每行的 1/softmax_denominator。每行只除一次,后续 + # 128 个输出维度都通过乘法归一化。补齐行和完全 mask 行设为0。 + for i in T.Parallel(packed_block_m): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + row_scale[i] = T.if_then_else( + (packed_row < packed_q_len) + and ( + (not causal) + or q_pos + causal_offset >= 0 + ), + 1.0 / row_denom[i], + 0.0, + ) + + # 将 packed row 重新映射到原始 output[q_pos, qo_head, d]。 + # packed tail 只参与内部补齐,不允许写回输出张量。 + for i, d in T.Parallel(packed_block_m, head_dim_vo): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + group_head = packed_row % group_size + if packed_row < packed_q_len: + output[ + q_start + q_pos, + kv_head * group_size + group_head, + d, + ] = output_accum[i, d] * row_scale[i] + + return packed_kernel_pv_fullcol_v14 + + +def run_kernel( + q, + k, + v, + output, + qo_indptr, + kv_indptr, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """OJ 调用入口:按完整规格选择、缓存并启动 TileLang kernel。""" + + # cache key 必须包含所有会改变生成代码、网格或张量 shape 的参数: + # q/k 的总长度决定静态张量形状;seq_len 决定网格上界、tile 配置和分支; + # head 数、head_dim、causal 则直接影响 GQA 映射和 attention 数学逻辑。 + key = ( + "packed-gqa-pv-fullcol-v14", + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + if key not in _kernel_cache: + # 首次遇到该参数组合时才执行 JIT: + # seq_len<=128:小序列回退路径,每 CTA 处理一个 Q head,启动和资源 + # 开销更小,保留单 token、非2次幂尾部的现有优势; + # seq_len>128 :主 packed GQA 路径,在一个 CTA 内处理同一 KV head + # 对应的多个 Q heads,提高 K/V 数据复用。 + if seq_len <= 128: + _kernel_cache[key] = build_kernel( + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + else: + _kernel_cache[key] = build_packed_kernel_pv_fullcol_v14( + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + # JIT 结果是可直接接收 Torch tensors 的 Cython backend callable。 + # output 由调用方提前分配,本函数只启动 kernel,不在计时路径创建临时张量。 + _kernel_cache[key](q, k, v, output, qo_indptr, kv_indptr) diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_015_v_prefetch_after_qk.py b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_015_v_prefetch_after_qk.py new file mode 100644 index 0000000..68cb1d1 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_015_v_prefetch_after_qk.py @@ -0,0 +1,719 @@ +import tilelang +import tilelang.language as T +from tilelang import jit + + +# --------------------------------------------------------------------------- +# 通用配置 +# --------------------------------------------------------------------------- +# 小序列回退 kernel 每个 CTA 处理 BLOCK_M 个 query position。 +BLOCK_M = 64 +# seq_len <= 128 时使用的 KV tile 宽度。 +BLOCK_N = 64 +# 较长回退形状使用更窄的 KV tile,降低 fragment 和 shared memory 压力。 +GENERAL_BLOCK_N = 32 +# 小序列回退 kernel 的线程数;主 packed kernel 会在构建时选择 256 或 512。 +NUM_THREADS = 128 +# 当前只使用单阶段循环。K 和 V 在同一块 shared memory 中分阶段复用, +# 不能在没有重新设计双缓冲的情况下直接把这里改成 2。 +NUM_STAGES = 1 +# softmax 数学形式使用 exp,但设备上的 exp2 指令通常更高效,因此将 +# exp(x) 转换为 exp2(x * log2(e))。 +LOG2_E = 1.44269504 +# TileLang 会针对完整参数组合生成专用 kernel。缓存用于避免同一进程中相同 +# shape 的重复调用再次触发 JIT 编译;编译时间不应进入 kernel 性能测量。 +_kernel_cache = {} + + +@jit( + execution_backend="cython", + pass_configs={tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True}, +) +def build_kernel( + total_q, + total_kv, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """构建小序列回退 kernel:每个 CTA 独立处理一个 Q head。""" + + # GQA 中多个 Q head 共享一个 KV head。本题 32 个 Q head、4 个 KV head, + # 因此 group_size=8,Q head h 对应的 KV head 为 h // 8。 + group_size = num_qo_heads // num_kv_heads + # 标准 attention scale 为 1/sqrt(head_dim_qk),再乘 log2(e) 供 exp2 使用。 + softmax_scale = (1.0 / head_dim_qk) ** 0.5 * LOG2_E + # 极短序列使用 N=64,减少 KV 循环次数;较长回退形状使用 N=32,减少 + # scores/probs fragment 和 shared memory 的瞬时占用。 + block_n = BLOCK_N if seq_len <= 128 else GENERAL_BLOCK_N + # seq_len 是每个 ragged 请求长度的上界。若 total_q=batch_size*seq_len, + # 所有请求都只能恰好等于 seq_len,此时网格中不存在无效 Q tile,可以让 + # JIT 在编译期删除 valid_q_tile 对循环范围的保护逻辑。 + guard_invalid_tiles = total_q != batch_size * seq_len + + @T.prim_func + def kernel( + q: T.Tensor((total_q, num_qo_heads, head_dim_qk), T.bfloat16), + k: T.Tensor((total_kv, num_kv_heads, head_dim_qk), T.bfloat16), + v: T.Tensor((total_kv, num_kv_heads, head_dim_vo), T.bfloat16), + output: T.Tensor((total_q, num_qo_heads, head_dim_vo), T.bfloat16), + qo_indptr: T.Tensor((batch_size + 1,), T.int32), + kv_indptr: T.Tensor((batch_size + 1,), T.int32), + ): + # 网格维度: + # x = 一个请求内的 Q tile 编号; + # y = Q head 编号; + # z = batch/request 编号。 + # 因此一个 CTA 负责 (batch_idx, qo_head, q_tile) 的完整 attention。 + with T.Kernel( + T.ceildiv(seq_len, BLOCK_M), + num_qo_heads, + batch_size, + threads=NUM_THREADS, + ) as (q_tile, qo_head, batch_idx): + # shared memory 保存本 CTA 重复使用的 Q/K/V tile。Q 在整个 KV + # 循环中保持不变,K 和 V 则随 kv_tile 更新。 + q_shared = T.alloc_shared((BLOCK_M, head_dim_qk), T.bfloat16) + k_shared = T.alloc_shared((block_n, head_dim_qk), T.bfloat16) + v_shared = T.alloc_shared((block_n, head_dim_vo), T.bfloat16) + + # fragment 通常映射到线程私有寄存器/矩阵累加器: + # scores : 当前 Q tile 与当前 K tile 的 FP32 logits; + # probs : 将 softmax 权重转成 BF16,作为 PV GEMM 的输入; + # output_accum : 跨所有 KV tile 累积的 FP32 输出分子。 + scores = T.alloc_fragment((BLOCK_M, block_n), T.float32) + probs = T.alloc_fragment((BLOCK_M, block_n), T.bfloat16) + output_accum = T.alloc_fragment((BLOCK_M, head_dim_vo), T.float32) + # 在线 Softmax 每一行只维护少量状态: + # row_max : 截止当前 KV tile 的全局最大 logit; + # row_max_prev : 临时 scratch,先存当前 tile 最大值,后存指数和; + # row_scale : 最大值变化后,历史累加结果需要乘的缩放因子; + # row_denom : 截止当前 KV tile 的 softmax 分母。 + row_max = T.alloc_fragment((BLOCK_M,), T.float32) + row_max_prev = T.alloc_fragment((BLOCK_M,), T.float32) + row_scale = T.alloc_fragment((BLOCK_M,), T.float32) + row_denom = T.alloc_fragment((BLOCK_M,), T.float32) + + # indptr 给出当前 ragged 请求在扁平 Q/K/V 张量中的区间。 + q_start = qo_indptr[batch_idx] + q_end = qo_indptr[batch_idx + 1] + kv_start = kv_indptr[batch_idx] + kv_end = kv_indptr[batch_idx + 1] + q_len = q_end - q_start + kv_len = kv_end - kv_start + # 根据 GQA 分组找到该 Q head 共享的 KV head。 + kv_head = qo_head // group_size + # bottom-right causal 对齐的偏移量。可见条件为: + # kv_pos < q_pos + 1 + (kv_len - q_len)。 + causal_offset = kv_len - q_len + # 网格按全局 seq_len 上界启动,ragged 请求可能没有对应的 q_tile。 + valid_q_tile = ( + q_tile * BLOCK_M < q_len if guard_invalid_tiles else True + ) + + if valid_q_tile: + # Q tile 在整个 KV 循环中都会复用,所以只在循环前加载一次。 + T.copy( + q[ + q_start + q_tile * BLOCK_M : q_start + (q_tile + 1) * BLOCK_M, + qo_head, + :, + ], + q_shared, + ) + # 在线 Softmax 初始状态:输出分子和分母为 0,最大值为 -inf。 + T.fill(output_accum, 0) + T.fill(row_denom, 0) + T.fill(row_max, -T.infinity(T.float32)) + + # q_tile 中最后一行 query 最多能看到的 KV 长度。提前缩短 KV 循环, + # 避免对因果边界右侧完全不可见的 KV tile 执行 GEMM。 + max_visible = T.min( + T.max(0, causal_offset + (q_tile + 1) * BLOCK_M), + kv_len, + ) + visible_tile_count = ( + T.ceildiv(max_visible, block_n) + if causal + else T.ceildiv(kv_len, block_n) + ) + # 对无效 q_tile 将循环次数设为 0,从而跳过 K/V copy、两个 GEMM 和 + # Softmax,而不仅仅是在最后禁止写回。 + loop_range = ( + T.if_then_else(valid_q_tile, visible_tile_count, 0) + if guard_invalid_tiles + else visible_tile_count + ) + + # 逐块扫描当前 Q tile 可见的 KV 区域。NUM_STAGES=1 表示这里没有 + # 跨 kv_tile 的 K/V 双缓冲,所有在线 Softmax 状态都存在循环依赖。 + for kv_tile in T.Pipelined(loop_range, num_stages=NUM_STAGES): + # 加载当前 K tile。回退路径主要处理短序列,边界安全由 TileLang + # 对 copy 的合法范围处理以及后续显式 mask 共同保证。 + T.copy( + k[ + kv_start + kv_tile * block_n : kv_start + (kv_tile + 1) * block_n, + kv_head, + :, + ], + k_shared, + ) + + # 先把 scores 初始化为 mask:合法元素为 0,非法元素为大负数。 + # 后续 QK GEMM 默认累加到 scores,因此最终得到 QK 或被 mask 的 + # 大负数,而不是让 GEMM 覆盖掉这里的因果/尾部 mask。 + for i, j in T.Parallel(BLOCK_M, block_n): + q_pos = q_tile * BLOCK_M + i + kv_pos = kv_tile * block_n + j + scores[i, j] = T.if_then_else( + (q_pos >= q_len) + or (kv_pos >= kv_len) + or (causal and kv_pos >= q_pos + 1 + causal_offset), + -1.0e9, + 0.0, + ) + + # 计算 Q @ K^T。默认 clear_accum=False,会保留上面写入 scores + # 的初始 mask 并将矩阵乘结果累加进去。 + T.gemm( + q_shared, + k_shared, + scores, + transpose_B=True, + policy=T.GemmWarpPolicy.FullRow, + ) + + # 第一步:求当前 KV tile 每一行的最大值,暂存在 row_max_prev。 + # row_max 仍然保存此前所有 KV tile 的 running max。 + T.reduce_max(scores, row_max_prev, dim=1) + for i in T.Parallel(BLOCK_M): + # 若当前 tile 提高了最大值,历史分母和历史输出分子都必须乘: + # exp(old_max-new_max)。这里已换算为 exp2 域。 + row_scale[i] = T.exp2( + row_max[i] * softmax_scale + - T.max(row_max[i], row_max_prev[i]) + * softmax_scale + ) + # 将 running max 更新为包含当前 tile 的新最大值。 + row_max[i] = T.max(row_max[i], row_max_prev[i]) + + # 第二步:计算当前 tile 相对于新 running max 的未归一化指数值。 + # 此处不立即除以分母,避免每个 KV tile 都执行完整归一化。 + for i, j in T.Parallel(BLOCK_M, block_n): + scores[i, j] = T.exp2( + scores[i, j] * softmax_scale + - row_max[i] * softmax_scale + ) + # row_max_prev 的 tile-max 已完成使命,现在复用同一个 fragment + # 保存当前 tile 每一行的指数和,从而避免单独分配 row_sum。 + T.reduce_sum(scores, row_max_prev, dim=1) + for i in T.Parallel(BLOCK_M): + # 更新在线 Softmax 分母:先把历史分母调整到新最大值尺度, + # 再加上当前 tile 的指数和。 + row_denom[i] = ( + row_denom[i] * row_scale[i] + row_max_prev[i] + ) + # PV GEMM 使用 BF16 输入,因此把 FP32 指数权重转换到 probs。 + T.copy(scores, probs) + + # 输出分子和分母必须处于相同的最大值尺度。先缩放历史输出分子, + # 再通过下面的 PV GEMM 加入当前 tile 的贡献。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + # 当前 K 已经不再使用,加载对应的 V tile。 + T.copy( + v[ + kv_start + kv_tile * block_n : kv_start + (kv_tile + 1) * block_n, + kv_head, + :, + ], + v_shared, + ) + # output_accum += probs @ V,保持 FP32 累加精度。 + T.gemm( + probs, + v_shared, + output_accum, + policy=T.GemmWarpPolicy.FullRow, + ) + + if valid_q_tile: + # KV 循环结束后才做最终归一化。每行只计算一次 1/denom,避免 + # head_dim_vo 个输出元素分别执行相同的除法。 + for i in T.Parallel(BLOCK_M): + q_pos = q_tile * BLOCK_M + i + row_scale[i] = T.if_then_else( + (q_pos < q_len) + and ( + (not causal) + or q_pos + causal_offset >= 0 + ), + 1.0 / row_denom[i], + 0.0, + ) + + # 用乘法完成整行归一化。完全被 mask 的行乘 0。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + # 只写回请求实际存在的 query 行,抑制最后一个 Q tile 的尾部。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + if q_tile * BLOCK_M + i < q_len: + output[ + q_start + q_tile * BLOCK_M + i, + qo_head, + d, + ] = output_accum[i, d] + + return kernel + + +@jit( + execution_backend="cython", + pass_configs={ + tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True, + tilelang.PassConfigKey.TL_DISABLE_DATA_RACE_CHECK: True, + }, + compile_flags=["-O3", "-DENABLE_BF16"], +) +def build_packed_kernel_v_prefetch_after_qk_v15( + total_q, + total_kv, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """构建主 GQA kernel,并在 QK reduction 后提前加载 V。""" + + # equal-length 且 seq_len<=1024 时使用 M64/N32/256 threads。较小的资源 + # 占用可提高 CTA 驻留数;长序列和非对称形状保持 M128/N64/512 threads, + # 以减少 Q tile 数量、KV 循环次数和在线 Softmax 更新次数。 + use_resident2 = total_q == total_kv and seq_len <= 1024 + packed_block_m = 64 if use_resident2 else 128 + packed_block_n = 32 if use_resident2 else 64 + packed_threads = 256 if use_resident2 else 512 + # 本题 group_size=8。一个 KV head 对应连续的 8 个 Q head。 + group_size = num_qo_heads // num_kv_heads + # packed M 维中的每一行不是单纯的 query position,而是: + # packed_row = q_pos * group_size + group_head。 + # 因此同一个 CTA 可以处理一个 KV head 对应的多个 Q head,并让这些 Q + # head 在 CTA 内共享 K/V 的 global->shared 加载。 + packed_tile_count = T.ceildiv(seq_len * group_size, packed_block_m) + # dense_equal 是编译期常量。由于每个 segment 长度都不超过 seq_len,而 + # 总长度恰好为 batch_size*seq_len,可以严格推出每个 segment 都等长。 + dense_equal = ( + total_q == batch_size * seq_len + and total_kv == batch_size * seq_len + ) + # 对 dense 长序列启用反向逻辑 tile 映射。因果 attention 中越靠后的 Q + # tile 能看到越多 KV,计算量越大;优先提交重 tile 可以缩短最后少数 CTA + # 造成的调度长尾。resident2 和 ragged 路径仍保持正向映射。 + reverse_dense_tiles = dense_equal and not use_resident2 + # attention scale 转为 exp2 所需的 base-2 缩放系数。 + softmax_scale = (1.0 / head_dim_qk) ** 0.5 * LOG2_E + + @T.prim_func + def packed_kernel_v_prefetch_after_qk_v15( + q: T.Tensor((total_q, num_qo_heads, head_dim_qk), T.bfloat16), + k: T.Tensor((total_kv, num_kv_heads, head_dim_qk), T.bfloat16), + v: T.Tensor((total_kv, num_kv_heads, head_dim_vo), T.bfloat16), + output: T.Tensor((total_q, num_qo_heads, head_dim_vo), T.bfloat16), + qo_indptr: T.Tensor((batch_size + 1,), T.int32), + kv_indptr: T.Tensor((batch_size + 1,), T.int32), + ): + # 网格维度: + # x = packed Q tile; + # y = KV head; + # z = batch/request。 + # 一个 CTA 因而处理一个请求、一个 KV head 和一段 packed Q rows。 + with T.Kernel( + packed_tile_count, + num_kv_heads, + batch_size, + threads=packed_threads, + ) as (packed_tile, kv_head, batch_idx): + # Q tile 在整个 KV 循环中常驻 shared memory。长路径 M=128 时, + # q_shared 大小为 128*128*2 = 32 KiB。 + q_shared = T.alloc_shared( + (packed_block_m, head_dim_qk), T.bfloat16 + ) + # 同一个 kv_shared 分时保存 K 和 V:QK GEMM 完成后当前 K 生命周期 + # 已结束,随后 V 覆盖这块空间。这样长路径只需 16 KiB KV shared, + # 而不是分别为 K、V 分配两份内存。 + kv_shared = T.alloc_shared( + (packed_block_n, head_dim_qk), T.bfloat16 + ) + + # scores:FP32 QK 累加器和当前 tile 的指数权重。 + scores = T.alloc_fragment( + (packed_block_m, packed_block_n), T.float32 + ) + # probs:scores 转成 BF16 后供 PV 矩阵乘使用。 + probs = T.alloc_fragment( + (packed_block_m, packed_block_n), T.bfloat16 + ) + # output_accum:跨全部 KV tile 保存 FP32 输出分子。 + output_accum = T.alloc_fragment( + (packed_block_m, head_dim_vo), T.float32 + ) + # 每个 packed row 的在线 Softmax 状态。row_max_prev 是 scratch, + # row_scale 在循环中保存历史尺度修正,循环结束后复用为 1/denom。 + row_max = T.alloc_fragment((packed_block_m,), T.float32) + row_max_prev = T.alloc_fragment((packed_block_m,), T.float32) + row_scale = T.alloc_fragment((packed_block_m,), T.float32) + row_denom = T.alloc_fragment((packed_block_m,), T.float32) + + # dense equal-length 特化:直接用 batch_idx*seq_len 定位请求,并将 + # q_len/kv_len 变成编译期常量;ragged 路径仍从 indptr 读取真实边界。 + # 这可删除 dense 热路径上的 indptr load 和部分动态边界判断。 + q_start = ( + batch_idx * seq_len + if dense_equal + else qo_indptr[batch_idx] + ) + kv_start = ( + batch_idx * seq_len + if dense_equal + else kv_indptr[batch_idx] + ) + q_len = ( + seq_len + if dense_equal + else qo_indptr[batch_idx + 1] - q_start + ) + kv_len = ( + seq_len + if dense_equal + else kv_indptr[batch_idx + 1] - kv_start + ) + # MetaX PipelinePlanning 在 dense 长度完全常量化后,会把同一 + # kv_shared 中先写 K、后写 V 的合法生命周期复用误判成 stage + # 重叠写。dense 路径仅为 copy 边界保留一次运行时 indptr 读取, + # 数学边界、网格和有效 tile 判断仍然使用常量 kv_len。 + copy_kv_len = ( + kv_indptr[batch_idx + 1] - kv_start + if dense_equal + else kv_len + ) + # packed_q_len 是当前请求包含的逻辑 packed rows 数量。 + packed_q_len = q_len * group_size + # physical packed_tile 来自 blockIdx.x;logical_packed_tile 决定实际 + # 处理哪段 Q。反转只改变 CTA 提交顺序,不改变数学结果或输出位置。 + logical_packed_tile = ( + packed_tile_count - 1 - packed_tile + if reverse_dense_tiles + else packed_tile + ) + packed_tile_start = logical_packed_tile * packed_block_m + # dense 路径的网格恰好覆盖全部 packed rows,因此所有 CTA 有效; + # ragged 请求可能短于 seq_len 上界,需要在运行时过滤无效 CTA。 + valid_q_tile = ( + True + if dense_equal + else packed_tile_start < packed_q_len + ) + # bottom-right causal mask 使用 kv_len-q_len 修正 Q/KV 长度差。 + causal_offset = kv_len - q_len + + if valid_q_tile: + # 将 packed row 反解为 query position 和 GQA 组内 Q head: + # q_pos = packed_row // group_size + # group_head= packed_row % group_size + # 再与当前 kv_head 组合出原始 qo_head。最后一个 tile 的补齐行写0。 + for i, d in T.Parallel(packed_block_m, head_dim_qk): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + group_head = packed_row % group_size + if packed_row < packed_q_len: + q_shared[i, d] = q[ + q_start + q_pos, + kv_head * group_size + group_head, + d, + ] + else: + q_shared[i, d] = T.cast(0, T.bfloat16) + + # 初始化在线 Softmax:输出分子=0、分母=0、running max=-inf。 + T.clear(output_accum) + T.clear(row_denom) + T.fill(row_max, -T.infinity(T.float32)) + + # 当前 packed tile 末尾对应的 query position 上界。一个 packed tile + # 覆盖 packed_block_m/group_size 个不同 query position。 + q_upper_bound = T.min( + q_len, + T.ceildiv( + (logical_packed_tile + 1) * packed_block_m, + group_size, + ), + ) + # 使用 tile 内最后一个 query 的因果边界求最大可见 KV 长度,以便 + # 整块跳过其右侧不可能被任何行看到的 KV tiles。 + max_visible = T.min( + T.max(0, causal_offset + q_upper_bound), + kv_len, + ) + visible_tile_count = ( + T.ceildiv(max_visible, packed_block_n) + if causal + else T.ceildiv(kv_len, packed_block_n) + ) + # 无效 ragged Q tile 的 loop_range=0,可跳过全部主要计算。 + loop_range = T.if_then_else( + valid_q_tile, visible_tile_count, 0 + ) + # 当前 packed tile 第一行对应的 query position。 + first_q_pos = packed_tile_start // group_size + # 如果某个 KV tile 连当前 packed tile 的第一行都完全可见,那么它 + # 对后续所有行也完全可见。这部分 tile 无需逐元素生成 causal mask, + # 直接把 scores 清零作为 GEMM 初始累加器即可。 + fully_visible_tiles = T.min( + loop_range, + T.max( + 0, + (first_q_pos + causal_offset + 1) // packed_block_n, + ), + ) + + # 顺序扫描当前 packed Q tile 可见的 KV tiles。在线 Softmax 的 + # running max/denom/output_accum 在相邻迭代间存在严格依赖。 + for kv_tile in T.Pipelined(loop_range, num_stages=NUM_STAGES): + # 当前 KV tile 在请求内部的半开区间 [tile_start, tile_end)。 + tile_start = kv_tile * packed_block_n + tile_end = tile_start + packed_block_n + + if tile_end <= copy_kv_len: + # 完整 K tile 走向量化 copy。disable_tma=True 使用当前 + # MetaX 后端已验证可工作的普通 shared-memory copy 路径。 + T.copy( + k[ + kv_start + tile_start : kv_start + tile_end, + kv_head, + :, + ], + kv_shared, + disable_tma=True, + ) + else: + # 最后一个 ragged K tile 可能越过请求边界,必须逐元素判断; + # 越界位置填0,不能读到扁平张量中下一个请求的数据。 + for j, d in T.Parallel(packed_block_n, head_dim_qk): + kv_pos = tile_start + j + if kv_pos < copy_kv_len: + kv_shared[j, d] = k[ + kv_start + kv_pos, kv_head, d + ] + else: + kv_shared[j, d] = T.cast(0, T.bfloat16) + + if causal and kv_tile < fully_visible_tiles: + # 整块对所有 query 行可见,只需将 QK 累加器初始化为0。 + T.clear(scores) + else: + # causal frontier 或 ragged tail 需要逐元素初始化 mask。 + # 合法条件同时检查 packed Q tail、KV tail 和 bottom-right + # causal 边界;非法元素设为 -inf,使其 softmax 权重为0。 + for i, j in T.Parallel( + packed_block_m, packed_block_n + ): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + kv_pos = tile_start + j + scores[i, j] = T.if_then_else( + (packed_row < packed_q_len) + and (kv_pos < kv_len) + and ( + (not causal) + or kv_pos < q_pos + 1 + causal_offset + ), + 0.0, + -T.infinity(T.float32), + ) + + # scores = mask + Q @ K^T。clear_accum 默认为 False,因此前面 + # 写入的 0/-inf mask 会作为矩阵乘累加器被保留下来。 + T.gemm( + q_shared, + kv_shared, + scores, + transpose_B=True, + policy=T.GemmWarpPolicy.FullRow, + ) + + # 求当前 tile 的逐行最大值。row_max_prev 是 scratch,row_max + # 始终保存此前全部 KV tiles 的 running max。 + T.reduce_max(scores, row_max_prev, dim=1) + + # QK 和 max reduction 已完成,K 不再被任何线程读取。此时立即 + # 用 V 覆盖 kv_shared,再执行只依赖寄存器 fragment 的 softmax。 + # opt_012 把 V copy 放在 softmax 之后,生成代码会在 reduction + # barrier 和 V copy 之间再插入一次 __syncthreads()。提前 copy + # 让 K/V 生命周期切换贴近已有 reduction 同步,并让 V 在 PV + # GEMM 前更早就绪;数学依赖和 shared footprint 都保持不变。 + if tile_end <= copy_kv_len: + T.copy( + v[ + kv_start + tile_start : kv_start + tile_end, + kv_head, + :, + ], + kv_shared, + disable_tma=True, + ) + else: + for j, d in T.Parallel(packed_block_n, head_dim_vo): + kv_pos = tile_start + j + if kv_pos < copy_kv_len: + kv_shared[j, d] = v[ + kv_start + kv_pos, kv_head, d + ] + else: + kv_shared[j, d] = T.cast(0, T.bfloat16) + + for i in T.Parallel(packed_block_m): + # 最大值改变时,用 exp(old_max-new_max) 把历史分母和历史 + # 输出分子转换到新的数值尺度,保证在线 Softmax 数值稳定。 + row_scale[i] = T.exp2( + row_max[i] * softmax_scale + - T.max(row_max[i], row_max_prev[i]) + * softmax_scale + ) + # 合并历史最大值与当前 tile 最大值。 + row_max[i] = T.max(row_max[i], row_max_prev[i]) + + # 将 logits 转成相对于新 running max 的指数值。采用 + # FlashAttention 风格在线 Softmax,不保存完整 attention 矩阵。 + for i, j in T.Parallel(packed_block_m, packed_block_n): + scores[i, j] = T.exp2( + scores[i, j] * softmax_scale + - row_max[i] * softmax_scale + ) + # tile max 已无后续用途,复用 row_max_prev 保存当前指数和。 + T.reduce_sum(scores, row_max_prev, dim=1) + for i in T.Parallel(packed_block_m): + # 分母更新:历史分母先乘 row_scale,再加当前 tile 指数和。 + row_denom[i] = ( + row_denom[i] * row_scale[i] + row_max_prev[i] + ) + # PV GEMM 输入为 BF16,将 FP32 指数权重转换到 probs fragment。 + T.copy(scores, probs) + + # 历史输出分子与分母使用相同的 row_scale 重新定标。 + for i, d in T.Parallel(packed_block_m, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + # 累积当前 tile 的输出贡献:output_accum += probs @ V。 + T.gemm( + probs, + kv_shared, + output_accum, + policy=T.GemmWarpPolicy.FullRow, + ) + + if valid_q_tile: + # 所有 KV tiles 处理完后再归一化。row_scale 已结束循环内使命, + # 现在复用为每行的 1/softmax_denominator。每行只除一次,后续 + # 128 个输出维度都通过乘法归一化。补齐行和完全 mask 行设为0。 + for i in T.Parallel(packed_block_m): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + row_scale[i] = T.if_then_else( + (packed_row < packed_q_len) + and ( + (not causal) + or q_pos + causal_offset >= 0 + ), + 1.0 / row_denom[i], + 0.0, + ) + + # 将 packed row 重新映射到原始 output[q_pos, qo_head, d]。 + # packed tail 只参与内部补齐,不允许写回输出张量。 + for i, d in T.Parallel(packed_block_m, head_dim_vo): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + group_head = packed_row % group_size + if packed_row < packed_q_len: + output[ + q_start + q_pos, + kv_head * group_size + group_head, + d, + ] = output_accum[i, d] * row_scale[i] + + return packed_kernel_v_prefetch_after_qk_v15 + + +def run_kernel( + q, + k, + v, + output, + qo_indptr, + kv_indptr, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """OJ 调用入口:按完整规格选择、缓存并启动 TileLang kernel。""" + + # cache key 必须包含所有会改变生成代码、网格或张量 shape 的参数: + # q/k 的总长度决定静态张量形状;seq_len 决定网格上界、tile 配置和分支; + # head 数、head_dim、causal 则直接影响 GQA 映射和 attention 数学逻辑。 + key = ( + "packed-gqa-v-prefetch-after-qk-v15", + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + if key not in _kernel_cache: + # 首次遇到该参数组合时才执行 JIT: + # seq_len<=128:小序列回退路径,每 CTA 处理一个 Q head,启动和资源 + # 开销更小,保留单 token、非2次幂尾部的现有优势; + # seq_len>128 :主 packed GQA 路径,在一个 CTA 内处理同一 KV head + # 对应的多个 Q heads,提高 K/V 数据复用。 + if seq_len <= 128: + _kernel_cache[key] = build_kernel( + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + else: + _kernel_cache[key] = build_packed_kernel_v_prefetch_after_qk_v15( + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + # JIT 结果是可直接接收 Torch tensors 的 Cython backend callable。 + # output 由调用方提前分配,本函数只启动 kernel,不在计时路径创建临时张量。 + _kernel_cache[key](q, k, v, output, qo_indptr, kv_indptr) diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_016_square_warp_partition.py b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_016_square_warp_partition.py new file mode 100644 index 0000000..3b4fb18 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_016_square_warp_partition.py @@ -0,0 +1,724 @@ +import tilelang +import tilelang.language as T +from tilelang import jit + + +# --------------------------------------------------------------------------- +# 通用配置 +# --------------------------------------------------------------------------- +# 小序列回退 kernel 每个 CTA 处理 BLOCK_M 个 query position。 +BLOCK_M = 64 +# seq_len <= 128 时使用的 KV tile 宽度。 +BLOCK_N = 64 +# 较长回退形状使用更窄的 KV tile,降低 fragment 和 shared memory 压力。 +GENERAL_BLOCK_N = 32 +# 小序列回退 kernel 的线程数;主 packed kernel 会在构建时选择 256 或 512。 +NUM_THREADS = 128 +# 当前只使用单阶段循环。K 和 V 在同一块 shared memory 中分阶段复用, +# 不能在没有重新设计双缓冲的情况下直接把这里改成 2。 +NUM_STAGES = 1 +# softmax 数学形式使用 exp,但设备上的 exp2 指令通常更高效,因此将 +# exp(x) 转换为 exp2(x * log2(e))。 +LOG2_E = 1.44269504 +# TileLang 会针对完整参数组合生成专用 kernel。缓存用于避免同一进程中相同 +# shape 的重复调用再次触发 JIT 编译;编译时间不应进入 kernel 性能测量。 +_kernel_cache = {} + + +@jit( + execution_backend="cython", + pass_configs={tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True}, +) +def build_kernel( + total_q, + total_kv, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """构建小序列回退 kernel:每个 CTA 独立处理一个 Q head。""" + + # GQA 中多个 Q head 共享一个 KV head。本题 32 个 Q head、4 个 KV head, + # 因此 group_size=8,Q head h 对应的 KV head 为 h // 8。 + group_size = num_qo_heads // num_kv_heads + # 标准 attention scale 为 1/sqrt(head_dim_qk),再乘 log2(e) 供 exp2 使用。 + softmax_scale = (1.0 / head_dim_qk) ** 0.5 * LOG2_E + # 极短序列使用 N=64,减少 KV 循环次数;较长回退形状使用 N=32,减少 + # scores/probs fragment 和 shared memory 的瞬时占用。 + block_n = BLOCK_N if seq_len <= 128 else GENERAL_BLOCK_N + # seq_len 是每个 ragged 请求长度的上界。若 total_q=batch_size*seq_len, + # 所有请求都只能恰好等于 seq_len,此时网格中不存在无效 Q tile,可以让 + # JIT 在编译期删除 valid_q_tile 对循环范围的保护逻辑。 + guard_invalid_tiles = total_q != batch_size * seq_len + + @T.prim_func + def kernel( + q: T.Tensor((total_q, num_qo_heads, head_dim_qk), T.bfloat16), + k: T.Tensor((total_kv, num_kv_heads, head_dim_qk), T.bfloat16), + v: T.Tensor((total_kv, num_kv_heads, head_dim_vo), T.bfloat16), + output: T.Tensor((total_q, num_qo_heads, head_dim_vo), T.bfloat16), + qo_indptr: T.Tensor((batch_size + 1,), T.int32), + kv_indptr: T.Tensor((batch_size + 1,), T.int32), + ): + # 网格维度: + # x = 一个请求内的 Q tile 编号; + # y = Q head 编号; + # z = batch/request 编号。 + # 因此一个 CTA 负责 (batch_idx, qo_head, q_tile) 的完整 attention。 + with T.Kernel( + T.ceildiv(seq_len, BLOCK_M), + num_qo_heads, + batch_size, + threads=NUM_THREADS, + ) as (q_tile, qo_head, batch_idx): + # shared memory 保存本 CTA 重复使用的 Q/K/V tile。Q 在整个 KV + # 循环中保持不变,K 和 V 则随 kv_tile 更新。 + q_shared = T.alloc_shared((BLOCK_M, head_dim_qk), T.bfloat16) + k_shared = T.alloc_shared((block_n, head_dim_qk), T.bfloat16) + v_shared = T.alloc_shared((block_n, head_dim_vo), T.bfloat16) + + # fragment 通常映射到线程私有寄存器/矩阵累加器: + # scores : 当前 Q tile 与当前 K tile 的 FP32 logits; + # probs : 将 softmax 权重转成 BF16,作为 PV GEMM 的输入; + # output_accum : 跨所有 KV tile 累积的 FP32 输出分子。 + scores = T.alloc_fragment((BLOCK_M, block_n), T.float32) + probs = T.alloc_fragment((BLOCK_M, block_n), T.bfloat16) + output_accum = T.alloc_fragment((BLOCK_M, head_dim_vo), T.float32) + # 在线 Softmax 每一行只维护少量状态: + # row_max : 截止当前 KV tile 的全局最大 logit; + # row_max_prev : 临时 scratch,先存当前 tile 最大值,后存指数和; + # row_scale : 最大值变化后,历史累加结果需要乘的缩放因子; + # row_denom : 截止当前 KV tile 的 softmax 分母。 + row_max = T.alloc_fragment((BLOCK_M,), T.float32) + row_max_prev = T.alloc_fragment((BLOCK_M,), T.float32) + row_scale = T.alloc_fragment((BLOCK_M,), T.float32) + row_denom = T.alloc_fragment((BLOCK_M,), T.float32) + + # indptr 给出当前 ragged 请求在扁平 Q/K/V 张量中的区间。 + q_start = qo_indptr[batch_idx] + q_end = qo_indptr[batch_idx + 1] + kv_start = kv_indptr[batch_idx] + kv_end = kv_indptr[batch_idx + 1] + q_len = q_end - q_start + kv_len = kv_end - kv_start + # 根据 GQA 分组找到该 Q head 共享的 KV head。 + kv_head = qo_head // group_size + # bottom-right causal 对齐的偏移量。可见条件为: + # kv_pos < q_pos + 1 + (kv_len - q_len)。 + causal_offset = kv_len - q_len + # 网格按全局 seq_len 上界启动,ragged 请求可能没有对应的 q_tile。 + valid_q_tile = ( + q_tile * BLOCK_M < q_len if guard_invalid_tiles else True + ) + + if valid_q_tile: + # Q tile 在整个 KV 循环中都会复用,所以只在循环前加载一次。 + T.copy( + q[ + q_start + q_tile * BLOCK_M : q_start + (q_tile + 1) * BLOCK_M, + qo_head, + :, + ], + q_shared, + ) + # 在线 Softmax 初始状态:输出分子和分母为 0,最大值为 -inf。 + T.fill(output_accum, 0) + T.fill(row_denom, 0) + T.fill(row_max, -T.infinity(T.float32)) + + # q_tile 中最后一行 query 最多能看到的 KV 长度。提前缩短 KV 循环, + # 避免对因果边界右侧完全不可见的 KV tile 执行 GEMM。 + max_visible = T.min( + T.max(0, causal_offset + (q_tile + 1) * BLOCK_M), + kv_len, + ) + visible_tile_count = ( + T.ceildiv(max_visible, block_n) + if causal + else T.ceildiv(kv_len, block_n) + ) + # 对无效 q_tile 将循环次数设为 0,从而跳过 K/V copy、两个 GEMM 和 + # Softmax,而不仅仅是在最后禁止写回。 + loop_range = ( + T.if_then_else(valid_q_tile, visible_tile_count, 0) + if guard_invalid_tiles + else visible_tile_count + ) + + # 逐块扫描当前 Q tile 可见的 KV 区域。NUM_STAGES=1 表示这里没有 + # 跨 kv_tile 的 K/V 双缓冲,所有在线 Softmax 状态都存在循环依赖。 + for kv_tile in T.Pipelined(loop_range, num_stages=NUM_STAGES): + # 加载当前 K tile。回退路径主要处理短序列,边界安全由 TileLang + # 对 copy 的合法范围处理以及后续显式 mask 共同保证。 + T.copy( + k[ + kv_start + kv_tile * block_n : kv_start + (kv_tile + 1) * block_n, + kv_head, + :, + ], + k_shared, + ) + + # 先把 scores 初始化为 mask:合法元素为 0,非法元素为大负数。 + # 后续 QK GEMM 默认累加到 scores,因此最终得到 QK 或被 mask 的 + # 大负数,而不是让 GEMM 覆盖掉这里的因果/尾部 mask。 + for i, j in T.Parallel(BLOCK_M, block_n): + q_pos = q_tile * BLOCK_M + i + kv_pos = kv_tile * block_n + j + scores[i, j] = T.if_then_else( + (q_pos >= q_len) + or (kv_pos >= kv_len) + or (causal and kv_pos >= q_pos + 1 + causal_offset), + -1.0e9, + 0.0, + ) + + # 计算 Q @ K^T。默认 clear_accum=False,会保留上面写入 scores + # 的初始 mask 并将矩阵乘结果累加进去。 + T.gemm( + q_shared, + k_shared, + scores, + transpose_B=True, + policy=T.GemmWarpPolicy.FullRow, + ) + + # 第一步:求当前 KV tile 每一行的最大值,暂存在 row_max_prev。 + # row_max 仍然保存此前所有 KV tile 的 running max。 + T.reduce_max(scores, row_max_prev, dim=1) + for i in T.Parallel(BLOCK_M): + # 若当前 tile 提高了最大值,历史分母和历史输出分子都必须乘: + # exp(old_max-new_max)。这里已换算为 exp2 域。 + row_scale[i] = T.exp2( + row_max[i] * softmax_scale + - T.max(row_max[i], row_max_prev[i]) + * softmax_scale + ) + # 将 running max 更新为包含当前 tile 的新最大值。 + row_max[i] = T.max(row_max[i], row_max_prev[i]) + + # 第二步:计算当前 tile 相对于新 running max 的未归一化指数值。 + # 此处不立即除以分母,避免每个 KV tile 都执行完整归一化。 + for i, j in T.Parallel(BLOCK_M, block_n): + scores[i, j] = T.exp2( + scores[i, j] * softmax_scale + - row_max[i] * softmax_scale + ) + # row_max_prev 的 tile-max 已完成使命,现在复用同一个 fragment + # 保存当前 tile 每一行的指数和,从而避免单独分配 row_sum。 + T.reduce_sum(scores, row_max_prev, dim=1) + for i in T.Parallel(BLOCK_M): + # 更新在线 Softmax 分母:先把历史分母调整到新最大值尺度, + # 再加上当前 tile 的指数和。 + row_denom[i] = ( + row_denom[i] * row_scale[i] + row_max_prev[i] + ) + # PV GEMM 使用 BF16 输入,因此把 FP32 指数权重转换到 probs。 + T.copy(scores, probs) + + # 输出分子和分母必须处于相同的最大值尺度。先缩放历史输出分子, + # 再通过下面的 PV GEMM 加入当前 tile 的贡献。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + # 当前 K 已经不再使用,加载对应的 V tile。 + T.copy( + v[ + kv_start + kv_tile * block_n : kv_start + (kv_tile + 1) * block_n, + kv_head, + :, + ], + v_shared, + ) + # output_accum += probs @ V,保持 FP32 累加精度。 + T.gemm( + probs, + v_shared, + output_accum, + policy=T.GemmWarpPolicy.FullRow, + ) + + if valid_q_tile: + # KV 循环结束后才做最终归一化。每行只计算一次 1/denom,避免 + # head_dim_vo 个输出元素分别执行相同的除法。 + for i in T.Parallel(BLOCK_M): + q_pos = q_tile * BLOCK_M + i + row_scale[i] = T.if_then_else( + (q_pos < q_len) + and ( + (not causal) + or q_pos + causal_offset >= 0 + ), + 1.0 / row_denom[i], + 0.0, + ) + + # 用乘法完成整行归一化。完全被 mask 的行乘 0。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + # 只写回请求实际存在的 query 行,抑制最后一个 Q tile 的尾部。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + if q_tile * BLOCK_M + i < q_len: + output[ + q_start + q_tile * BLOCK_M + i, + qo_head, + d, + ] = output_accum[i, d] + + return kernel + + +@jit( + execution_backend="cython", + pass_configs={ + tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True, + tilelang.PassConfigKey.TL_DISABLE_DATA_RACE_CHECK: True, + }, + compile_flags=["-O3", "-DENABLE_BF16"], +) +def build_packed_kernel_square_warp_partition_v16( + total_q, + total_kv, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """构建主 GQA kernel,并在长路径平衡 M/N 方向的 wave 分区。""" + + # equal-length 且 seq_len<=1024 时使用 M64/N32/256 threads。较小的资源 + # 占用可提高 CTA 驻留数;长序列和非对称形状保持 M128/N64/512 threads, + # 以减少 Q tile 数量、KV 循环次数和在线 Softmax 更新次数。 + use_resident2 = total_q == total_kv and seq_len <= 1024 + packed_block_m = 64 if use_resident2 else 128 + packed_block_n = 32 if use_resident2 else 64 + packed_threads = 256 if use_resident2 else 512 + # FullRow 将长路径的 8 个 waves 全部分配到 M 维。case-4 生成代码因此 + # 在 PV 阶段从 V shared buffer 执行标量 BF16 读取。QK 与 PV 必须使用 + # 相同 policy 才能让 scores/probs fragment 布局一致;长路径同时改成 + # Square,测试更均衡的 M/N wave 分区。短 resident2 路径保留 FullRow。 + gemm_policy = ( + T.GemmWarpPolicy.FullRow + if use_resident2 + else T.GemmWarpPolicy.Square + ) + # 本题 group_size=8。一个 KV head 对应连续的 8 个 Q head。 + group_size = num_qo_heads // num_kv_heads + # packed M 维中的每一行不是单纯的 query position,而是: + # packed_row = q_pos * group_size + group_head。 + # 因此同一个 CTA 可以处理一个 KV head 对应的多个 Q head,并让这些 Q + # head 在 CTA 内共享 K/V 的 global->shared 加载。 + packed_tile_count = T.ceildiv(seq_len * group_size, packed_block_m) + # dense_equal 是编译期常量。由于每个 segment 长度都不超过 seq_len,而 + # 总长度恰好为 batch_size*seq_len,可以严格推出每个 segment 都等长。 + dense_equal = ( + total_q == batch_size * seq_len + and total_kv == batch_size * seq_len + ) + # 对 dense 长序列启用反向逻辑 tile 映射。因果 attention 中越靠后的 Q + # tile 能看到越多 KV,计算量越大;优先提交重 tile 可以缩短最后少数 CTA + # 造成的调度长尾。resident2 和 ragged 路径仍保持正向映射。 + reverse_dense_tiles = dense_equal and not use_resident2 + # attention scale 转为 exp2 所需的 base-2 缩放系数。 + softmax_scale = (1.0 / head_dim_qk) ** 0.5 * LOG2_E + + @T.prim_func + def packed_kernel_square_warp_partition_v16( + q: T.Tensor((total_q, num_qo_heads, head_dim_qk), T.bfloat16), + k: T.Tensor((total_kv, num_kv_heads, head_dim_qk), T.bfloat16), + v: T.Tensor((total_kv, num_kv_heads, head_dim_vo), T.bfloat16), + output: T.Tensor((total_q, num_qo_heads, head_dim_vo), T.bfloat16), + qo_indptr: T.Tensor((batch_size + 1,), T.int32), + kv_indptr: T.Tensor((batch_size + 1,), T.int32), + ): + # 网格维度: + # x = packed Q tile; + # y = KV head; + # z = batch/request。 + # 一个 CTA 因而处理一个请求、一个 KV head 和一段 packed Q rows。 + with T.Kernel( + packed_tile_count, + num_kv_heads, + batch_size, + threads=packed_threads, + ) as (packed_tile, kv_head, batch_idx): + # Q tile 在整个 KV 循环中常驻 shared memory。长路径 M=128 时, + # q_shared 大小为 128*128*2 = 32 KiB。 + q_shared = T.alloc_shared( + (packed_block_m, head_dim_qk), T.bfloat16 + ) + # 同一个 kv_shared 分时保存 K 和 V:QK GEMM 完成后当前 K 生命周期 + # 已结束,随后 V 覆盖这块空间。这样长路径只需 16 KiB KV shared, + # 而不是分别为 K、V 分配两份内存。 + kv_shared = T.alloc_shared( + (packed_block_n, head_dim_qk), T.bfloat16 + ) + + # scores:FP32 QK 累加器和当前 tile 的指数权重。 + scores = T.alloc_fragment( + (packed_block_m, packed_block_n), T.float32 + ) + # probs:scores 转成 BF16 后供 PV 矩阵乘使用。 + probs = T.alloc_fragment( + (packed_block_m, packed_block_n), T.bfloat16 + ) + # output_accum:跨全部 KV tile 保存 FP32 输出分子。 + output_accum = T.alloc_fragment( + (packed_block_m, head_dim_vo), T.float32 + ) + # 每个 packed row 的在线 Softmax 状态。row_max_prev 是 scratch, + # row_scale 在循环中保存历史尺度修正,循环结束后复用为 1/denom。 + row_max = T.alloc_fragment((packed_block_m,), T.float32) + row_max_prev = T.alloc_fragment((packed_block_m,), T.float32) + row_scale = T.alloc_fragment((packed_block_m,), T.float32) + row_denom = T.alloc_fragment((packed_block_m,), T.float32) + + # dense equal-length 特化:直接用 batch_idx*seq_len 定位请求,并将 + # q_len/kv_len 变成编译期常量;ragged 路径仍从 indptr 读取真实边界。 + # 这可删除 dense 热路径上的 indptr load 和部分动态边界判断。 + q_start = ( + batch_idx * seq_len + if dense_equal + else qo_indptr[batch_idx] + ) + kv_start = ( + batch_idx * seq_len + if dense_equal + else kv_indptr[batch_idx] + ) + q_len = ( + seq_len + if dense_equal + else qo_indptr[batch_idx + 1] - q_start + ) + kv_len = ( + seq_len + if dense_equal + else kv_indptr[batch_idx + 1] - kv_start + ) + # MetaX PipelinePlanning 在 dense 长度完全常量化后,会把同一 + # kv_shared 中先写 K、后写 V 的合法生命周期复用误判成 stage + # 重叠写。dense 路径仅为 copy 边界保留一次运行时 indptr 读取, + # 数学边界、网格和有效 tile 判断仍然使用常量 kv_len。 + copy_kv_len = ( + kv_indptr[batch_idx + 1] - kv_start + if dense_equal + else kv_len + ) + # packed_q_len 是当前请求包含的逻辑 packed rows 数量。 + packed_q_len = q_len * group_size + # physical packed_tile 来自 blockIdx.x;logical_packed_tile 决定实际 + # 处理哪段 Q。反转只改变 CTA 提交顺序,不改变数学结果或输出位置。 + logical_packed_tile = ( + packed_tile_count - 1 - packed_tile + if reverse_dense_tiles + else packed_tile + ) + packed_tile_start = logical_packed_tile * packed_block_m + # dense 路径的网格恰好覆盖全部 packed rows,因此所有 CTA 有效; + # ragged 请求可能短于 seq_len 上界,需要在运行时过滤无效 CTA。 + valid_q_tile = ( + True + if dense_equal + else packed_tile_start < packed_q_len + ) + # bottom-right causal mask 使用 kv_len-q_len 修正 Q/KV 长度差。 + causal_offset = kv_len - q_len + + if valid_q_tile: + # 将 packed row 反解为 query position 和 GQA 组内 Q head: + # q_pos = packed_row // group_size + # group_head= packed_row % group_size + # 再与当前 kv_head 组合出原始 qo_head。最后一个 tile 的补齐行写0。 + for i, d in T.Parallel(packed_block_m, head_dim_qk): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + group_head = packed_row % group_size + if packed_row < packed_q_len: + q_shared[i, d] = q[ + q_start + q_pos, + kv_head * group_size + group_head, + d, + ] + else: + q_shared[i, d] = T.cast(0, T.bfloat16) + + # 初始化在线 Softmax:输出分子=0、分母=0、running max=-inf。 + T.clear(output_accum) + T.clear(row_denom) + T.fill(row_max, -T.infinity(T.float32)) + + # 当前 packed tile 末尾对应的 query position 上界。一个 packed tile + # 覆盖 packed_block_m/group_size 个不同 query position。 + q_upper_bound = T.min( + q_len, + T.ceildiv( + (logical_packed_tile + 1) * packed_block_m, + group_size, + ), + ) + # 使用 tile 内最后一个 query 的因果边界求最大可见 KV 长度,以便 + # 整块跳过其右侧不可能被任何行看到的 KV tiles。 + max_visible = T.min( + T.max(0, causal_offset + q_upper_bound), + kv_len, + ) + visible_tile_count = ( + T.ceildiv(max_visible, packed_block_n) + if causal + else T.ceildiv(kv_len, packed_block_n) + ) + # 无效 ragged Q tile 的 loop_range=0,可跳过全部主要计算。 + loop_range = T.if_then_else( + valid_q_tile, visible_tile_count, 0 + ) + # 当前 packed tile 第一行对应的 query position。 + first_q_pos = packed_tile_start // group_size + # 如果某个 KV tile 连当前 packed tile 的第一行都完全可见,那么它 + # 对后续所有行也完全可见。这部分 tile 无需逐元素生成 causal mask, + # 直接把 scores 清零作为 GEMM 初始累加器即可。 + fully_visible_tiles = T.min( + loop_range, + T.max( + 0, + (first_q_pos + causal_offset + 1) // packed_block_n, + ), + ) + + # 顺序扫描当前 packed Q tile 可见的 KV tiles。在线 Softmax 的 + # running max/denom/output_accum 在相邻迭代间存在严格依赖。 + for kv_tile in T.Pipelined(loop_range, num_stages=NUM_STAGES): + # 当前 KV tile 在请求内部的半开区间 [tile_start, tile_end)。 + tile_start = kv_tile * packed_block_n + tile_end = tile_start + packed_block_n + + if tile_end <= copy_kv_len: + # 完整 K tile 走向量化 copy。disable_tma=True 使用当前 + # MetaX 后端已验证可工作的普通 shared-memory copy 路径。 + T.copy( + k[ + kv_start + tile_start : kv_start + tile_end, + kv_head, + :, + ], + kv_shared, + disable_tma=True, + ) + else: + # 最后一个 ragged K tile 可能越过请求边界,必须逐元素判断; + # 越界位置填0,不能读到扁平张量中下一个请求的数据。 + for j, d in T.Parallel(packed_block_n, head_dim_qk): + kv_pos = tile_start + j + if kv_pos < copy_kv_len: + kv_shared[j, d] = k[ + kv_start + kv_pos, kv_head, d + ] + else: + kv_shared[j, d] = T.cast(0, T.bfloat16) + + if causal and kv_tile < fully_visible_tiles: + # 整块对所有 query 行可见,只需将 QK 累加器初始化为0。 + T.clear(scores) + else: + # causal frontier 或 ragged tail 需要逐元素初始化 mask。 + # 合法条件同时检查 packed Q tail、KV tail 和 bottom-right + # causal 边界;非法元素设为 -inf,使其 softmax 权重为0。 + for i, j in T.Parallel( + packed_block_m, packed_block_n + ): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + kv_pos = tile_start + j + scores[i, j] = T.if_then_else( + (packed_row < packed_q_len) + and (kv_pos < kv_len) + and ( + (not causal) + or kv_pos < q_pos + 1 + causal_offset + ), + 0.0, + -T.infinity(T.float32), + ) + + # scores = mask + Q @ K^T。clear_accum 默认为 False,因此前面 + # 写入的 0/-inf mask 会作为矩阵乘累加器被保留下来。 + T.gemm( + q_shared, + kv_shared, + scores, + transpose_B=True, + policy=gemm_policy, + ) + + # 求当前 tile 的逐行最大值。row_max_prev 是 scratch,row_max + # 始终保存此前全部 KV tiles 的 running max。 + T.reduce_max(scores, row_max_prev, dim=1) + for i in T.Parallel(packed_block_m): + # 最大值改变时,用 exp(old_max-new_max) 把历史分母和历史 + # 输出分子转换到新的数值尺度,保证在线 Softmax 数值稳定。 + row_scale[i] = T.exp2( + row_max[i] * softmax_scale + - T.max(row_max[i], row_max_prev[i]) + * softmax_scale + ) + # 合并历史最大值与当前 tile 最大值。 + row_max[i] = T.max(row_max[i], row_max_prev[i]) + + # 将 logits 转成相对于新 running max 的指数值。采用 + # FlashAttention 风格在线 Softmax,不保存完整 attention 矩阵。 + for i, j in T.Parallel(packed_block_m, packed_block_n): + scores[i, j] = T.exp2( + scores[i, j] * softmax_scale + - row_max[i] * softmax_scale + ) + # tile max 已无后续用途,复用 row_max_prev 保存当前指数和。 + T.reduce_sum(scores, row_max_prev, dim=1) + for i in T.Parallel(packed_block_m): + # 分母更新:历史分母先乘 row_scale,再加当前 tile 指数和。 + row_denom[i] = ( + row_denom[i] * row_scale[i] + row_max_prev[i] + ) + # PV GEMM 输入为 BF16,将 FP32 指数权重转换到 probs fragment。 + T.copy(scores, probs) + + # 历史输出分子与分母使用相同的 row_scale 重新定标。 + for i, d in T.Parallel(packed_block_m, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + if tile_end <= copy_kv_len: + # QK 已结束,当前 K 不再存活;把对应 V tile 覆盖写入同一个 + # kv_shared,以减少每 CTA 的动态 shared memory 占用。 + T.copy( + v[ + kv_start + tile_start : kv_start + tile_end, + kv_head, + :, + ], + kv_shared, + disable_tma=True, + ) + else: + # ragged V tail 与 K tail 一样执行显式边界判断和补0。 + for j, d in T.Parallel(packed_block_n, head_dim_vo): + kv_pos = tile_start + j + if kv_pos < copy_kv_len: + kv_shared[j, d] = v[ + kv_start + kv_pos, kv_head, d + ] + else: + kv_shared[j, d] = T.cast(0, T.bfloat16) + + # 累积当前 tile 的输出贡献:output_accum += probs @ V。 + T.gemm( + probs, + kv_shared, + output_accum, + policy=gemm_policy, + ) + + if valid_q_tile: + # 所有 KV tiles 处理完后再归一化。row_scale 已结束循环内使命, + # 现在复用为每行的 1/softmax_denominator。每行只除一次,后续 + # 128 个输出维度都通过乘法归一化。补齐行和完全 mask 行设为0。 + for i in T.Parallel(packed_block_m): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + row_scale[i] = T.if_then_else( + (packed_row < packed_q_len) + and ( + (not causal) + or q_pos + causal_offset >= 0 + ), + 1.0 / row_denom[i], + 0.0, + ) + + # 将 packed row 重新映射到原始 output[q_pos, qo_head, d]。 + # packed tail 只参与内部补齐,不允许写回输出张量。 + for i, d in T.Parallel(packed_block_m, head_dim_vo): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + group_head = packed_row % group_size + if packed_row < packed_q_len: + output[ + q_start + q_pos, + kv_head * group_size + group_head, + d, + ] = output_accum[i, d] * row_scale[i] + + return packed_kernel_square_warp_partition_v16 + + +def run_kernel( + q, + k, + v, + output, + qo_indptr, + kv_indptr, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """OJ 调用入口:按完整规格选择、缓存并启动 TileLang kernel。""" + + # cache key 必须包含所有会改变生成代码、网格或张量 shape 的参数: + # q/k 的总长度决定静态张量形状;seq_len 决定网格上界、tile 配置和分支; + # head 数、head_dim、causal 则直接影响 GQA 映射和 attention 数学逻辑。 + key = ( + "packed-gqa-square-warp-partition-v16", + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + if key not in _kernel_cache: + # 首次遇到该参数组合时才执行 JIT: + # seq_len<=128:小序列回退路径,每 CTA 处理一个 Q head,启动和资源 + # 开销更小,保留单 token、非2次幂尾部的现有优势; + # seq_len>128 :主 packed GQA 路径,在一个 CTA 内处理同一 KV head + # 对应的多个 Q heads,提高 K/V 数据复用。 + if seq_len <= 128: + _kernel_cache[key] = build_kernel( + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + else: + _kernel_cache[key] = build_packed_kernel_square_warp_partition_v16( + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + # JIT 结果是可直接接收 Torch tensors 的 Cython backend callable。 + # output 由调用方提前分配,本函数只启动 kernel,不在计时路径创建临时张量。 + _kernel_cache[key](q, k, v, output, qo_indptr, kv_indptr) diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_017_skip_identity_rescale.py b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_017_skip_identity_rescale.py new file mode 100644 index 0000000..d182d49 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_017_skip_identity_rescale.py @@ -0,0 +1,719 @@ +import tilelang +import tilelang.language as T +from tilelang import jit + + +# --------------------------------------------------------------------------- +# 通用配置 +# --------------------------------------------------------------------------- +# 小序列回退 kernel 每个 CTA 处理 BLOCK_M 个 query position。 +BLOCK_M = 64 +# seq_len <= 128 时使用的 KV tile 宽度。 +BLOCK_N = 64 +# 较长回退形状使用更窄的 KV tile,降低 fragment 和 shared memory 压力。 +GENERAL_BLOCK_N = 32 +# 小序列回退 kernel 的线程数;主 packed kernel 会在构建时选择 256 或 512。 +NUM_THREADS = 128 +# 当前只使用单阶段循环。K 和 V 在同一块 shared memory 中分阶段复用, +# 不能在没有重新设计双缓冲的情况下直接把这里改成 2。 +NUM_STAGES = 1 +# softmax 数学形式使用 exp,但设备上的 exp2 指令通常更高效,因此将 +# exp(x) 转换为 exp2(x * log2(e))。 +LOG2_E = 1.44269504 +# TileLang 会针对完整参数组合生成专用 kernel。缓存用于避免同一进程中相同 +# shape 的重复调用再次触发 JIT 编译;编译时间不应进入 kernel 性能测量。 +_kernel_cache = {} + + +@jit( + execution_backend="cython", + pass_configs={tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True}, +) +def build_kernel( + total_q, + total_kv, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """构建小序列回退 kernel:每个 CTA 独立处理一个 Q head。""" + + # GQA 中多个 Q head 共享一个 KV head。本题 32 个 Q head、4 个 KV head, + # 因此 group_size=8,Q head h 对应的 KV head 为 h // 8。 + group_size = num_qo_heads // num_kv_heads + # 标准 attention scale 为 1/sqrt(head_dim_qk),再乘 log2(e) 供 exp2 使用。 + softmax_scale = (1.0 / head_dim_qk) ** 0.5 * LOG2_E + # 极短序列使用 N=64,减少 KV 循环次数;较长回退形状使用 N=32,减少 + # scores/probs fragment 和 shared memory 的瞬时占用。 + block_n = BLOCK_N if seq_len <= 128 else GENERAL_BLOCK_N + # seq_len 是每个 ragged 请求长度的上界。若 total_q=batch_size*seq_len, + # 所有请求都只能恰好等于 seq_len,此时网格中不存在无效 Q tile,可以让 + # JIT 在编译期删除 valid_q_tile 对循环范围的保护逻辑。 + guard_invalid_tiles = total_q != batch_size * seq_len + + @T.prim_func + def kernel( + q: T.Tensor((total_q, num_qo_heads, head_dim_qk), T.bfloat16), + k: T.Tensor((total_kv, num_kv_heads, head_dim_qk), T.bfloat16), + v: T.Tensor((total_kv, num_kv_heads, head_dim_vo), T.bfloat16), + output: T.Tensor((total_q, num_qo_heads, head_dim_vo), T.bfloat16), + qo_indptr: T.Tensor((batch_size + 1,), T.int32), + kv_indptr: T.Tensor((batch_size + 1,), T.int32), + ): + # 网格维度: + # x = 一个请求内的 Q tile 编号; + # y = Q head 编号; + # z = batch/request 编号。 + # 因此一个 CTA 负责 (batch_idx, qo_head, q_tile) 的完整 attention。 + with T.Kernel( + T.ceildiv(seq_len, BLOCK_M), + num_qo_heads, + batch_size, + threads=NUM_THREADS, + ) as (q_tile, qo_head, batch_idx): + # shared memory 保存本 CTA 重复使用的 Q/K/V tile。Q 在整个 KV + # 循环中保持不变,K 和 V 则随 kv_tile 更新。 + q_shared = T.alloc_shared((BLOCK_M, head_dim_qk), T.bfloat16) + k_shared = T.alloc_shared((block_n, head_dim_qk), T.bfloat16) + v_shared = T.alloc_shared((block_n, head_dim_vo), T.bfloat16) + + # fragment 通常映射到线程私有寄存器/矩阵累加器: + # scores : 当前 Q tile 与当前 K tile 的 FP32 logits; + # probs : 将 softmax 权重转成 BF16,作为 PV GEMM 的输入; + # output_accum : 跨所有 KV tile 累积的 FP32 输出分子。 + scores = T.alloc_fragment((BLOCK_M, block_n), T.float32) + probs = T.alloc_fragment((BLOCK_M, block_n), T.bfloat16) + output_accum = T.alloc_fragment((BLOCK_M, head_dim_vo), T.float32) + # 在线 Softmax 每一行只维护少量状态: + # row_max : 截止当前 KV tile 的全局最大 logit; + # row_max_prev : 临时 scratch,先存当前 tile 最大值,后存指数和; + # row_scale : 最大值变化后,历史累加结果需要乘的缩放因子; + # row_denom : 截止当前 KV tile 的 softmax 分母。 + row_max = T.alloc_fragment((BLOCK_M,), T.float32) + row_max_prev = T.alloc_fragment((BLOCK_M,), T.float32) + row_scale = T.alloc_fragment((BLOCK_M,), T.float32) + row_denom = T.alloc_fragment((BLOCK_M,), T.float32) + + # indptr 给出当前 ragged 请求在扁平 Q/K/V 张量中的区间。 + q_start = qo_indptr[batch_idx] + q_end = qo_indptr[batch_idx + 1] + kv_start = kv_indptr[batch_idx] + kv_end = kv_indptr[batch_idx + 1] + q_len = q_end - q_start + kv_len = kv_end - kv_start + # 根据 GQA 分组找到该 Q head 共享的 KV head。 + kv_head = qo_head // group_size + # bottom-right causal 对齐的偏移量。可见条件为: + # kv_pos < q_pos + 1 + (kv_len - q_len)。 + causal_offset = kv_len - q_len + # 网格按全局 seq_len 上界启动,ragged 请求可能没有对应的 q_tile。 + valid_q_tile = ( + q_tile * BLOCK_M < q_len if guard_invalid_tiles else True + ) + + if valid_q_tile: + # Q tile 在整个 KV 循环中都会复用,所以只在循环前加载一次。 + T.copy( + q[ + q_start + q_tile * BLOCK_M : q_start + (q_tile + 1) * BLOCK_M, + qo_head, + :, + ], + q_shared, + ) + # 在线 Softmax 初始状态:输出分子和分母为 0,最大值为 -inf。 + T.fill(output_accum, 0) + T.fill(row_denom, 0) + T.fill(row_max, -T.infinity(T.float32)) + + # q_tile 中最后一行 query 最多能看到的 KV 长度。提前缩短 KV 循环, + # 避免对因果边界右侧完全不可见的 KV tile 执行 GEMM。 + max_visible = T.min( + T.max(0, causal_offset + (q_tile + 1) * BLOCK_M), + kv_len, + ) + visible_tile_count = ( + T.ceildiv(max_visible, block_n) + if causal + else T.ceildiv(kv_len, block_n) + ) + # 对无效 q_tile 将循环次数设为 0,从而跳过 K/V copy、两个 GEMM 和 + # Softmax,而不仅仅是在最后禁止写回。 + loop_range = ( + T.if_then_else(valid_q_tile, visible_tile_count, 0) + if guard_invalid_tiles + else visible_tile_count + ) + + # 逐块扫描当前 Q tile 可见的 KV 区域。NUM_STAGES=1 表示这里没有 + # 跨 kv_tile 的 K/V 双缓冲,所有在线 Softmax 状态都存在循环依赖。 + for kv_tile in T.Pipelined(loop_range, num_stages=NUM_STAGES): + # 加载当前 K tile。回退路径主要处理短序列,边界安全由 TileLang + # 对 copy 的合法范围处理以及后续显式 mask 共同保证。 + T.copy( + k[ + kv_start + kv_tile * block_n : kv_start + (kv_tile + 1) * block_n, + kv_head, + :, + ], + k_shared, + ) + + # 先把 scores 初始化为 mask:合法元素为 0,非法元素为大负数。 + # 后续 QK GEMM 默认累加到 scores,因此最终得到 QK 或被 mask 的 + # 大负数,而不是让 GEMM 覆盖掉这里的因果/尾部 mask。 + for i, j in T.Parallel(BLOCK_M, block_n): + q_pos = q_tile * BLOCK_M + i + kv_pos = kv_tile * block_n + j + scores[i, j] = T.if_then_else( + (q_pos >= q_len) + or (kv_pos >= kv_len) + or (causal and kv_pos >= q_pos + 1 + causal_offset), + -1.0e9, + 0.0, + ) + + # 计算 Q @ K^T。默认 clear_accum=False,会保留上面写入 scores + # 的初始 mask 并将矩阵乘结果累加进去。 + T.gemm( + q_shared, + k_shared, + scores, + transpose_B=True, + policy=T.GemmWarpPolicy.FullRow, + ) + + # 第一步:求当前 KV tile 每一行的最大值,暂存在 row_max_prev。 + # row_max 仍然保存此前所有 KV tile 的 running max。 + T.reduce_max(scores, row_max_prev, dim=1) + for i in T.Parallel(BLOCK_M): + # 若当前 tile 提高了最大值,历史分母和历史输出分子都必须乘: + # exp(old_max-new_max)。这里已换算为 exp2 域。 + row_scale[i] = T.exp2( + row_max[i] * softmax_scale + - T.max(row_max[i], row_max_prev[i]) + * softmax_scale + ) + # 将 running max 更新为包含当前 tile 的新最大值。 + row_max[i] = T.max(row_max[i], row_max_prev[i]) + + # 第二步:计算当前 tile 相对于新 running max 的未归一化指数值。 + # 此处不立即除以分母,避免每个 KV tile 都执行完整归一化。 + for i, j in T.Parallel(BLOCK_M, block_n): + scores[i, j] = T.exp2( + scores[i, j] * softmax_scale + - row_max[i] * softmax_scale + ) + # row_max_prev 的 tile-max 已完成使命,现在复用同一个 fragment + # 保存当前 tile 每一行的指数和,从而避免单独分配 row_sum。 + T.reduce_sum(scores, row_max_prev, dim=1) + for i in T.Parallel(BLOCK_M): + # 更新在线 Softmax 分母:先把历史分母调整到新最大值尺度, + # 再加上当前 tile 的指数和。 + row_denom[i] = ( + row_denom[i] * row_scale[i] + row_max_prev[i] + ) + # PV GEMM 使用 BF16 输入,因此把 FP32 指数权重转换到 probs。 + T.copy(scores, probs) + + # 输出分子和分母必须处于相同的最大值尺度。先缩放历史输出分子, + # 再通过下面的 PV GEMM 加入当前 tile 的贡献。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + # 当前 K 已经不再使用,加载对应的 V tile。 + T.copy( + v[ + kv_start + kv_tile * block_n : kv_start + (kv_tile + 1) * block_n, + kv_head, + :, + ], + v_shared, + ) + # output_accum += probs @ V,保持 FP32 累加精度。 + T.gemm( + probs, + v_shared, + output_accum, + policy=T.GemmWarpPolicy.FullRow, + ) + + if valid_q_tile: + # KV 循环结束后才做最终归一化。每行只计算一次 1/denom,避免 + # head_dim_vo 个输出元素分别执行相同的除法。 + for i in T.Parallel(BLOCK_M): + q_pos = q_tile * BLOCK_M + i + row_scale[i] = T.if_then_else( + (q_pos < q_len) + and ( + (not causal) + or q_pos + causal_offset >= 0 + ), + 1.0 / row_denom[i], + 0.0, + ) + + # 用乘法完成整行归一化。完全被 mask 的行乘 0。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + # 只写回请求实际存在的 query 行,抑制最后一个 Q tile 的尾部。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + if q_tile * BLOCK_M + i < q_len: + output[ + q_start + q_tile * BLOCK_M + i, + qo_head, + d, + ] = output_accum[i, d] + + return kernel + + +@jit( + execution_backend="cython", + pass_configs={ + tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True, + tilelang.PassConfigKey.TL_DISABLE_DATA_RACE_CHECK: True, + }, + compile_flags=["-O3", "-DENABLE_BF16"], +) +def build_packed_kernel_skip_identity_rescale_v17( + total_q, + total_kv, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """构建主 GQA kernel,并跳过值为 1 的历史输出重缩放。""" + + # equal-length 且 seq_len<=1024 时使用 M64/N32/256 threads。较小的资源 + # 占用可提高 CTA 驻留数;长序列和非对称形状保持 M128/N64/512 threads, + # 以减少 Q tile 数量、KV 循环次数和在线 Softmax 更新次数。 + use_resident2 = total_q == total_kv and seq_len <= 1024 + packed_block_m = 64 if use_resident2 else 128 + packed_block_n = 32 if use_resident2 else 64 + packed_threads = 256 if use_resident2 else 512 + # 本题 group_size=8。一个 KV head 对应连续的 8 个 Q head。 + group_size = num_qo_heads // num_kv_heads + # packed M 维中的每一行不是单纯的 query position,而是: + # packed_row = q_pos * group_size + group_head。 + # 因此同一个 CTA 可以处理一个 KV head 对应的多个 Q head,并让这些 Q + # head 在 CTA 内共享 K/V 的 global->shared 加载。 + packed_tile_count = T.ceildiv(seq_len * group_size, packed_block_m) + # dense_equal 是编译期常量。由于每个 segment 长度都不超过 seq_len,而 + # 总长度恰好为 batch_size*seq_len,可以严格推出每个 segment 都等长。 + dense_equal = ( + total_q == batch_size * seq_len + and total_kv == batch_size * seq_len + ) + # 对 dense 长序列启用反向逻辑 tile 映射。因果 attention 中越靠后的 Q + # tile 能看到越多 KV,计算量越大;优先提交重 tile 可以缩短最后少数 CTA + # 造成的调度长尾。resident2 和 ragged 路径仍保持正向映射。 + reverse_dense_tiles = dense_equal and not use_resident2 + # attention scale 转为 exp2 所需的 base-2 缩放系数。 + softmax_scale = (1.0 / head_dim_qk) ** 0.5 * LOG2_E + + @T.prim_func + def packed_kernel_skip_identity_rescale_v17( + q: T.Tensor((total_q, num_qo_heads, head_dim_qk), T.bfloat16), + k: T.Tensor((total_kv, num_kv_heads, head_dim_qk), T.bfloat16), + v: T.Tensor((total_kv, num_kv_heads, head_dim_vo), T.bfloat16), + output: T.Tensor((total_q, num_qo_heads, head_dim_vo), T.bfloat16), + qo_indptr: T.Tensor((batch_size + 1,), T.int32), + kv_indptr: T.Tensor((batch_size + 1,), T.int32), + ): + # 网格维度: + # x = packed Q tile; + # y = KV head; + # z = batch/request。 + # 一个 CTA 因而处理一个请求、一个 KV head 和一段 packed Q rows。 + with T.Kernel( + packed_tile_count, + num_kv_heads, + batch_size, + threads=packed_threads, + ) as (packed_tile, kv_head, batch_idx): + # Q tile 在整个 KV 循环中常驻 shared memory。长路径 M=128 时, + # q_shared 大小为 128*128*2 = 32 KiB。 + q_shared = T.alloc_shared( + (packed_block_m, head_dim_qk), T.bfloat16 + ) + # 同一个 kv_shared 分时保存 K 和 V:QK GEMM 完成后当前 K 生命周期 + # 已结束,随后 V 覆盖这块空间。这样长路径只需 16 KiB KV shared, + # 而不是分别为 K、V 分配两份内存。 + kv_shared = T.alloc_shared( + (packed_block_n, head_dim_qk), T.bfloat16 + ) + + # scores:FP32 QK 累加器和当前 tile 的指数权重。 + scores = T.alloc_fragment( + (packed_block_m, packed_block_n), T.float32 + ) + # probs:scores 转成 BF16 后供 PV 矩阵乘使用。 + probs = T.alloc_fragment( + (packed_block_m, packed_block_n), T.bfloat16 + ) + # output_accum:跨全部 KV tile 保存 FP32 输出分子。 + output_accum = T.alloc_fragment( + (packed_block_m, head_dim_vo), T.float32 + ) + # 每个 packed row 的在线 Softmax 状态。row_max_prev 是 scratch, + # row_scale 在循环中保存历史尺度修正,循环结束后复用为 1/denom。 + row_max = T.alloc_fragment((packed_block_m,), T.float32) + row_max_prev = T.alloc_fragment((packed_block_m,), T.float32) + row_scale = T.alloc_fragment((packed_block_m,), T.float32) + row_denom = T.alloc_fragment((packed_block_m,), T.float32) + + # dense equal-length 特化:直接用 batch_idx*seq_len 定位请求,并将 + # q_len/kv_len 变成编译期常量;ragged 路径仍从 indptr 读取真实边界。 + # 这可删除 dense 热路径上的 indptr load 和部分动态边界判断。 + q_start = ( + batch_idx * seq_len + if dense_equal + else qo_indptr[batch_idx] + ) + kv_start = ( + batch_idx * seq_len + if dense_equal + else kv_indptr[batch_idx] + ) + q_len = ( + seq_len + if dense_equal + else qo_indptr[batch_idx + 1] - q_start + ) + kv_len = ( + seq_len + if dense_equal + else kv_indptr[batch_idx + 1] - kv_start + ) + # MetaX PipelinePlanning 在 dense 长度完全常量化后,会把同一 + # kv_shared 中先写 K、后写 V 的合法生命周期复用误判成 stage + # 重叠写。dense 路径仅为 copy 边界保留一次运行时 indptr 读取, + # 数学边界、网格和有效 tile 判断仍然使用常量 kv_len。 + copy_kv_len = ( + kv_indptr[batch_idx + 1] - kv_start + if dense_equal + else kv_len + ) + # packed_q_len 是当前请求包含的逻辑 packed rows 数量。 + packed_q_len = q_len * group_size + # physical packed_tile 来自 blockIdx.x;logical_packed_tile 决定实际 + # 处理哪段 Q。反转只改变 CTA 提交顺序,不改变数学结果或输出位置。 + logical_packed_tile = ( + packed_tile_count - 1 - packed_tile + if reverse_dense_tiles + else packed_tile + ) + packed_tile_start = logical_packed_tile * packed_block_m + # dense 路径的网格恰好覆盖全部 packed rows,因此所有 CTA 有效; + # ragged 请求可能短于 seq_len 上界,需要在运行时过滤无效 CTA。 + valid_q_tile = ( + True + if dense_equal + else packed_tile_start < packed_q_len + ) + # bottom-right causal mask 使用 kv_len-q_len 修正 Q/KV 长度差。 + causal_offset = kv_len - q_len + + if valid_q_tile: + # 将 packed row 反解为 query position 和 GQA 组内 Q head: + # q_pos = packed_row // group_size + # group_head= packed_row % group_size + # 再与当前 kv_head 组合出原始 qo_head。最后一个 tile 的补齐行写0。 + for i, d in T.Parallel(packed_block_m, head_dim_qk): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + group_head = packed_row % group_size + if packed_row < packed_q_len: + q_shared[i, d] = q[ + q_start + q_pos, + kv_head * group_size + group_head, + d, + ] + else: + q_shared[i, d] = T.cast(0, T.bfloat16) + + # 初始化在线 Softmax:输出分子=0、分母=0、running max=-inf。 + T.clear(output_accum) + T.clear(row_denom) + T.fill(row_max, -T.infinity(T.float32)) + + # 当前 packed tile 末尾对应的 query position 上界。一个 packed tile + # 覆盖 packed_block_m/group_size 个不同 query position。 + q_upper_bound = T.min( + q_len, + T.ceildiv( + (logical_packed_tile + 1) * packed_block_m, + group_size, + ), + ) + # 使用 tile 内最后一个 query 的因果边界求最大可见 KV 长度,以便 + # 整块跳过其右侧不可能被任何行看到的 KV tiles。 + max_visible = T.min( + T.max(0, causal_offset + q_upper_bound), + kv_len, + ) + visible_tile_count = ( + T.ceildiv(max_visible, packed_block_n) + if causal + else T.ceildiv(kv_len, packed_block_n) + ) + # 无效 ragged Q tile 的 loop_range=0,可跳过全部主要计算。 + loop_range = T.if_then_else( + valid_q_tile, visible_tile_count, 0 + ) + # 当前 packed tile 第一行对应的 query position。 + first_q_pos = packed_tile_start // group_size + # 如果某个 KV tile 连当前 packed tile 的第一行都完全可见,那么它 + # 对后续所有行也完全可见。这部分 tile 无需逐元素生成 causal mask, + # 直接把 scores 清零作为 GEMM 初始累加器即可。 + fully_visible_tiles = T.min( + loop_range, + T.max( + 0, + (first_q_pos + causal_offset + 1) // packed_block_n, + ), + ) + + # 顺序扫描当前 packed Q tile 可见的 KV tiles。在线 Softmax 的 + # running max/denom/output_accum 在相邻迭代间存在严格依赖。 + for kv_tile in T.Pipelined(loop_range, num_stages=NUM_STAGES): + # 当前 KV tile 在请求内部的半开区间 [tile_start, tile_end)。 + tile_start = kv_tile * packed_block_n + tile_end = tile_start + packed_block_n + + if tile_end <= copy_kv_len: + # 完整 K tile 走向量化 copy。disable_tma=True 使用当前 + # MetaX 后端已验证可工作的普通 shared-memory copy 路径。 + T.copy( + k[ + kv_start + tile_start : kv_start + tile_end, + kv_head, + :, + ], + kv_shared, + disable_tma=True, + ) + else: + # 最后一个 ragged K tile 可能越过请求边界,必须逐元素判断; + # 越界位置填0,不能读到扁平张量中下一个请求的数据。 + for j, d in T.Parallel(packed_block_n, head_dim_qk): + kv_pos = tile_start + j + if kv_pos < copy_kv_len: + kv_shared[j, d] = k[ + kv_start + kv_pos, kv_head, d + ] + else: + kv_shared[j, d] = T.cast(0, T.bfloat16) + + if causal and kv_tile < fully_visible_tiles: + # 整块对所有 query 行可见,只需将 QK 累加器初始化为0。 + T.clear(scores) + else: + # causal frontier 或 ragged tail 需要逐元素初始化 mask。 + # 合法条件同时检查 packed Q tail、KV tail 和 bottom-right + # causal 边界;非法元素设为 -inf,使其 softmax 权重为0。 + for i, j in T.Parallel( + packed_block_m, packed_block_n + ): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + kv_pos = tile_start + j + scores[i, j] = T.if_then_else( + (packed_row < packed_q_len) + and (kv_pos < kv_len) + and ( + (not causal) + or kv_pos < q_pos + 1 + causal_offset + ), + 0.0, + -T.infinity(T.float32), + ) + + # scores = mask + Q @ K^T。clear_accum 默认为 False,因此前面 + # 写入的 0/-inf mask 会作为矩阵乘累加器被保留下来。 + T.gemm( + q_shared, + kv_shared, + scores, + transpose_B=True, + policy=T.GemmWarpPolicy.FullRow, + ) + + # 求当前 tile 的逐行最大值。row_max_prev 是 scratch,row_max + # 始终保存此前全部 KV tiles 的 running max。 + T.reduce_max(scores, row_max_prev, dim=1) + for i in T.Parallel(packed_block_m): + # 最大值改变时,用 exp(old_max-new_max) 把历史分母和历史 + # 输出分子转换到新的数值尺度,保证在线 Softmax 数值稳定。 + row_scale[i] = T.exp2( + row_max[i] * softmax_scale + - T.max(row_max[i], row_max_prev[i]) + * softmax_scale + ) + # 合并历史最大值与当前 tile 最大值。 + row_max[i] = T.max(row_max[i], row_max_prev[i]) + + # 将 logits 转成相对于新 running max 的指数值。采用 + # FlashAttention 风格在线 Softmax,不保存完整 attention 矩阵。 + for i, j in T.Parallel(packed_block_m, packed_block_n): + scores[i, j] = T.exp2( + scores[i, j] * softmax_scale + - row_max[i] * softmax_scale + ) + # tile max 已无后续用途,复用 row_max_prev 保存当前指数和。 + T.reduce_sum(scores, row_max_prev, dim=1) + for i in T.Parallel(packed_block_m): + # 分母更新:历史分母先乘 row_scale,再加当前 tile 指数和。 + row_denom[i] = ( + row_denom[i] * row_scale[i] + row_max_prev[i] + ) + # PV GEMM 输入为 BF16,将 FP32 指数权重转换到 probs fragment。 + T.copy(scores, probs) + + # 历史输出分子与分母使用相同的 row_scale 重新定标。 + for i, d in T.Parallel(packed_block_m, head_dim_vo): + # 当当前 tile 没有提高 running max 时,exp2(0) 精确为1。 + # 长序列扫描到后段后这是常见路径;跳过整行 128 个恒等 + # 乘法,保留只有最大值改变时才需要的实际重缩放。 + if row_scale[i] != 1.0: + output_accum[i, d] *= row_scale[i] + + if tile_end <= copy_kv_len: + # QK 已结束,当前 K 不再存活;把对应 V tile 覆盖写入同一个 + # kv_shared,以减少每 CTA 的动态 shared memory 占用。 + T.copy( + v[ + kv_start + tile_start : kv_start + tile_end, + kv_head, + :, + ], + kv_shared, + disable_tma=True, + ) + else: + # ragged V tail 与 K tail 一样执行显式边界判断和补0。 + for j, d in T.Parallel(packed_block_n, head_dim_vo): + kv_pos = tile_start + j + if kv_pos < copy_kv_len: + kv_shared[j, d] = v[ + kv_start + kv_pos, kv_head, d + ] + else: + kv_shared[j, d] = T.cast(0, T.bfloat16) + + # 累积当前 tile 的输出贡献:output_accum += probs @ V。 + T.gemm( + probs, + kv_shared, + output_accum, + policy=T.GemmWarpPolicy.FullRow, + ) + + if valid_q_tile: + # 所有 KV tiles 处理完后再归一化。row_scale 已结束循环内使命, + # 现在复用为每行的 1/softmax_denominator。每行只除一次,后续 + # 128 个输出维度都通过乘法归一化。补齐行和完全 mask 行设为0。 + for i in T.Parallel(packed_block_m): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + row_scale[i] = T.if_then_else( + (packed_row < packed_q_len) + and ( + (not causal) + or q_pos + causal_offset >= 0 + ), + 1.0 / row_denom[i], + 0.0, + ) + + # 将 packed row 重新映射到原始 output[q_pos, qo_head, d]。 + # packed tail 只参与内部补齐,不允许写回输出张量。 + for i, d in T.Parallel(packed_block_m, head_dim_vo): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + group_head = packed_row % group_size + if packed_row < packed_q_len: + output[ + q_start + q_pos, + kv_head * group_size + group_head, + d, + ] = output_accum[i, d] * row_scale[i] + + return packed_kernel_skip_identity_rescale_v17 + + +def run_kernel( + q, + k, + v, + output, + qo_indptr, + kv_indptr, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """OJ 调用入口:按完整规格选择、缓存并启动 TileLang kernel。""" + + # cache key 必须包含所有会改变生成代码、网格或张量 shape 的参数: + # q/k 的总长度决定静态张量形状;seq_len 决定网格上界、tile 配置和分支; + # head 数、head_dim、causal 则直接影响 GQA 映射和 attention 数学逻辑。 + key = ( + "packed-gqa-skip-identity-rescale-v17", + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + if key not in _kernel_cache: + # 首次遇到该参数组合时才执行 JIT: + # seq_len<=128:小序列回退路径,每 CTA 处理一个 Q head,启动和资源 + # 开销更小,保留单 token、非2次幂尾部的现有优势; + # seq_len>128 :主 packed GQA 路径,在一个 CTA 内处理同一 KV head + # 对应的多个 Q heads,提高 K/V 数据复用。 + if seq_len <= 128: + _kernel_cache[key] = build_kernel( + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + else: + _kernel_cache[key] = build_packed_kernel_skip_identity_rescale_v17( + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + # JIT 结果是可直接接收 Torch tensors 的 Cython backend callable。 + # output 由调用方提前分配,本函数只启动 kernel,不在计时路径创建临时张量。 + _kernel_cache[key](q, k, v, output, qo_indptr, kv_indptr) diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_018_factor_softmax_scale.py b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_018_factor_softmax_scale.py new file mode 100644 index 0000000..4f70444 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang/opt_018_factor_softmax_scale.py @@ -0,0 +1,716 @@ +import tilelang +import tilelang.language as T +from tilelang import jit + + +# --------------------------------------------------------------------------- +# 通用配置 +# --------------------------------------------------------------------------- +# 小序列回退 kernel 每个 CTA 处理 BLOCK_M 个 query position。 +BLOCK_M = 64 +# seq_len <= 128 时使用的 KV tile 宽度。 +BLOCK_N = 64 +# 较长回退形状使用更窄的 KV tile,降低 fragment 和 shared memory 压力。 +GENERAL_BLOCK_N = 32 +# 小序列回退 kernel 的线程数;主 packed kernel 会在构建时选择 256 或 512。 +NUM_THREADS = 128 +# 当前只使用单阶段循环。K 和 V 在同一块 shared memory 中分阶段复用, +# 不能在没有重新设计双缓冲的情况下直接把这里改成 2。 +NUM_STAGES = 1 +# softmax 数学形式使用 exp,但设备上的 exp2 指令通常更高效,因此将 +# exp(x) 转换为 exp2(x * log2(e))。 +LOG2_E = 1.44269504 +# TileLang 会针对完整参数组合生成专用 kernel。缓存用于避免同一进程中相同 +# shape 的重复调用再次触发 JIT 编译;编译时间不应进入 kernel 性能测量。 +_kernel_cache = {} + + +@jit( + execution_backend="cython", + pass_configs={tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True}, +) +def build_kernel( + total_q, + total_kv, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """构建小序列回退 kernel:每个 CTA 独立处理一个 Q head。""" + + # GQA 中多个 Q head 共享一个 KV head。本题 32 个 Q head、4 个 KV head, + # 因此 group_size=8,Q head h 对应的 KV head 为 h // 8。 + group_size = num_qo_heads // num_kv_heads + # 标准 attention scale 为 1/sqrt(head_dim_qk),再乘 log2(e) 供 exp2 使用。 + softmax_scale = (1.0 / head_dim_qk) ** 0.5 * LOG2_E + # 极短序列使用 N=64,减少 KV 循环次数;较长回退形状使用 N=32,减少 + # scores/probs fragment 和 shared memory 的瞬时占用。 + block_n = BLOCK_N if seq_len <= 128 else GENERAL_BLOCK_N + # seq_len 是每个 ragged 请求长度的上界。若 total_q=batch_size*seq_len, + # 所有请求都只能恰好等于 seq_len,此时网格中不存在无效 Q tile,可以让 + # JIT 在编译期删除 valid_q_tile 对循环范围的保护逻辑。 + guard_invalid_tiles = total_q != batch_size * seq_len + + @T.prim_func + def kernel( + q: T.Tensor((total_q, num_qo_heads, head_dim_qk), T.bfloat16), + k: T.Tensor((total_kv, num_kv_heads, head_dim_qk), T.bfloat16), + v: T.Tensor((total_kv, num_kv_heads, head_dim_vo), T.bfloat16), + output: T.Tensor((total_q, num_qo_heads, head_dim_vo), T.bfloat16), + qo_indptr: T.Tensor((batch_size + 1,), T.int32), + kv_indptr: T.Tensor((batch_size + 1,), T.int32), + ): + # 网格维度: + # x = 一个请求内的 Q tile 编号; + # y = Q head 编号; + # z = batch/request 编号。 + # 因此一个 CTA 负责 (batch_idx, qo_head, q_tile) 的完整 attention。 + with T.Kernel( + T.ceildiv(seq_len, BLOCK_M), + num_qo_heads, + batch_size, + threads=NUM_THREADS, + ) as (q_tile, qo_head, batch_idx): + # shared memory 保存本 CTA 重复使用的 Q/K/V tile。Q 在整个 KV + # 循环中保持不变,K 和 V 则随 kv_tile 更新。 + q_shared = T.alloc_shared((BLOCK_M, head_dim_qk), T.bfloat16) + k_shared = T.alloc_shared((block_n, head_dim_qk), T.bfloat16) + v_shared = T.alloc_shared((block_n, head_dim_vo), T.bfloat16) + + # fragment 通常映射到线程私有寄存器/矩阵累加器: + # scores : 当前 Q tile 与当前 K tile 的 FP32 logits; + # probs : 将 softmax 权重转成 BF16,作为 PV GEMM 的输入; + # output_accum : 跨所有 KV tile 累积的 FP32 输出分子。 + scores = T.alloc_fragment((BLOCK_M, block_n), T.float32) + probs = T.alloc_fragment((BLOCK_M, block_n), T.bfloat16) + output_accum = T.alloc_fragment((BLOCK_M, head_dim_vo), T.float32) + # 在线 Softmax 每一行只维护少量状态: + # row_max : 截止当前 KV tile 的全局最大 logit; + # row_max_prev : 临时 scratch,先存当前 tile 最大值,后存指数和; + # row_scale : 最大值变化后,历史累加结果需要乘的缩放因子; + # row_denom : 截止当前 KV tile 的 softmax 分母。 + row_max = T.alloc_fragment((BLOCK_M,), T.float32) + row_max_prev = T.alloc_fragment((BLOCK_M,), T.float32) + row_scale = T.alloc_fragment((BLOCK_M,), T.float32) + row_denom = T.alloc_fragment((BLOCK_M,), T.float32) + + # indptr 给出当前 ragged 请求在扁平 Q/K/V 张量中的区间。 + q_start = qo_indptr[batch_idx] + q_end = qo_indptr[batch_idx + 1] + kv_start = kv_indptr[batch_idx] + kv_end = kv_indptr[batch_idx + 1] + q_len = q_end - q_start + kv_len = kv_end - kv_start + # 根据 GQA 分组找到该 Q head 共享的 KV head。 + kv_head = qo_head // group_size + # bottom-right causal 对齐的偏移量。可见条件为: + # kv_pos < q_pos + 1 + (kv_len - q_len)。 + causal_offset = kv_len - q_len + # 网格按全局 seq_len 上界启动,ragged 请求可能没有对应的 q_tile。 + valid_q_tile = ( + q_tile * BLOCK_M < q_len if guard_invalid_tiles else True + ) + + if valid_q_tile: + # Q tile 在整个 KV 循环中都会复用,所以只在循环前加载一次。 + T.copy( + q[ + q_start + q_tile * BLOCK_M : q_start + (q_tile + 1) * BLOCK_M, + qo_head, + :, + ], + q_shared, + ) + # 在线 Softmax 初始状态:输出分子和分母为 0,最大值为 -inf。 + T.fill(output_accum, 0) + T.fill(row_denom, 0) + T.fill(row_max, -T.infinity(T.float32)) + + # q_tile 中最后一行 query 最多能看到的 KV 长度。提前缩短 KV 循环, + # 避免对因果边界右侧完全不可见的 KV tile 执行 GEMM。 + max_visible = T.min( + T.max(0, causal_offset + (q_tile + 1) * BLOCK_M), + kv_len, + ) + visible_tile_count = ( + T.ceildiv(max_visible, block_n) + if causal + else T.ceildiv(kv_len, block_n) + ) + # 对无效 q_tile 将循环次数设为 0,从而跳过 K/V copy、两个 GEMM 和 + # Softmax,而不仅仅是在最后禁止写回。 + loop_range = ( + T.if_then_else(valid_q_tile, visible_tile_count, 0) + if guard_invalid_tiles + else visible_tile_count + ) + + # 逐块扫描当前 Q tile 可见的 KV 区域。NUM_STAGES=1 表示这里没有 + # 跨 kv_tile 的 K/V 双缓冲,所有在线 Softmax 状态都存在循环依赖。 + for kv_tile in T.Pipelined(loop_range, num_stages=NUM_STAGES): + # 加载当前 K tile。回退路径主要处理短序列,边界安全由 TileLang + # 对 copy 的合法范围处理以及后续显式 mask 共同保证。 + T.copy( + k[ + kv_start + kv_tile * block_n : kv_start + (kv_tile + 1) * block_n, + kv_head, + :, + ], + k_shared, + ) + + # 先把 scores 初始化为 mask:合法元素为 0,非法元素为大负数。 + # 后续 QK GEMM 默认累加到 scores,因此最终得到 QK 或被 mask 的 + # 大负数,而不是让 GEMM 覆盖掉这里的因果/尾部 mask。 + for i, j in T.Parallel(BLOCK_M, block_n): + q_pos = q_tile * BLOCK_M + i + kv_pos = kv_tile * block_n + j + scores[i, j] = T.if_then_else( + (q_pos >= q_len) + or (kv_pos >= kv_len) + or (causal and kv_pos >= q_pos + 1 + causal_offset), + -1.0e9, + 0.0, + ) + + # 计算 Q @ K^T。默认 clear_accum=False,会保留上面写入 scores + # 的初始 mask 并将矩阵乘结果累加进去。 + T.gemm( + q_shared, + k_shared, + scores, + transpose_B=True, + policy=T.GemmWarpPolicy.FullRow, + ) + + # 第一步:求当前 KV tile 每一行的最大值,暂存在 row_max_prev。 + # row_max 仍然保存此前所有 KV tile 的 running max。 + T.reduce_max(scores, row_max_prev, dim=1) + for i in T.Parallel(BLOCK_M): + # 若当前 tile 提高了最大值,历史分母和历史输出分子都必须乘: + # exp(old_max-new_max)。这里已换算为 exp2 域。 + row_scale[i] = T.exp2( + row_max[i] * softmax_scale + - T.max(row_max[i], row_max_prev[i]) + * softmax_scale + ) + # 将 running max 更新为包含当前 tile 的新最大值。 + row_max[i] = T.max(row_max[i], row_max_prev[i]) + + # 第二步:计算当前 tile 相对于新 running max 的未归一化指数值。 + # 此处不立即除以分母,避免每个 KV tile 都执行完整归一化。 + for i, j in T.Parallel(BLOCK_M, block_n): + scores[i, j] = T.exp2( + scores[i, j] * softmax_scale + - row_max[i] * softmax_scale + ) + # row_max_prev 的 tile-max 已完成使命,现在复用同一个 fragment + # 保存当前 tile 每一行的指数和,从而避免单独分配 row_sum。 + T.reduce_sum(scores, row_max_prev, dim=1) + for i in T.Parallel(BLOCK_M): + # 更新在线 Softmax 分母:先把历史分母调整到新最大值尺度, + # 再加上当前 tile 的指数和。 + row_denom[i] = ( + row_denom[i] * row_scale[i] + row_max_prev[i] + ) + # PV GEMM 使用 BF16 输入,因此把 FP32 指数权重转换到 probs。 + T.copy(scores, probs) + + # 输出分子和分母必须处于相同的最大值尺度。先缩放历史输出分子, + # 再通过下面的 PV GEMM 加入当前 tile 的贡献。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + # 当前 K 已经不再使用,加载对应的 V tile。 + T.copy( + v[ + kv_start + kv_tile * block_n : kv_start + (kv_tile + 1) * block_n, + kv_head, + :, + ], + v_shared, + ) + # output_accum += probs @ V,保持 FP32 累加精度。 + T.gemm( + probs, + v_shared, + output_accum, + policy=T.GemmWarpPolicy.FullRow, + ) + + if valid_q_tile: + # KV 循环结束后才做最终归一化。每行只计算一次 1/denom,避免 + # head_dim_vo 个输出元素分别执行相同的除法。 + for i in T.Parallel(BLOCK_M): + q_pos = q_tile * BLOCK_M + i + row_scale[i] = T.if_then_else( + (q_pos < q_len) + and ( + (not causal) + or q_pos + causal_offset >= 0 + ), + 1.0 / row_denom[i], + 0.0, + ) + + # 用乘法完成整行归一化。完全被 mask 的行乘 0。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + # 只写回请求实际存在的 query 行,抑制最后一个 Q tile 的尾部。 + for i, d in T.Parallel(BLOCK_M, head_dim_vo): + if q_tile * BLOCK_M + i < q_len: + output[ + q_start + q_tile * BLOCK_M + i, + qo_head, + d, + ] = output_accum[i, d] + + return kernel + + +@jit( + execution_backend="cython", + pass_configs={ + tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True, + tilelang.PassConfigKey.TL_DISABLE_DATA_RACE_CHECK: True, + }, + compile_flags=["-O3", "-DENABLE_BF16"], +) +def build_packed_kernel_factor_softmax_scale_v18( + total_q, + total_kv, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """构建主 GQA kernel,并因式分解 softmax 的公共缩放系数。""" + + # equal-length 且 seq_len<=1024 时使用 M64/N32/256 threads。较小的资源 + # 占用可提高 CTA 驻留数;长序列和非对称形状保持 M128/N64/512 threads, + # 以减少 Q tile 数量、KV 循环次数和在线 Softmax 更新次数。 + use_resident2 = total_q == total_kv and seq_len <= 1024 + packed_block_m = 64 if use_resident2 else 128 + packed_block_n = 32 if use_resident2 else 64 + packed_threads = 256 if use_resident2 else 512 + # 本题 group_size=8。一个 KV head 对应连续的 8 个 Q head。 + group_size = num_qo_heads // num_kv_heads + # packed M 维中的每一行不是单纯的 query position,而是: + # packed_row = q_pos * group_size + group_head。 + # 因此同一个 CTA 可以处理一个 KV head 对应的多个 Q head,并让这些 Q + # head 在 CTA 内共享 K/V 的 global->shared 加载。 + packed_tile_count = T.ceildiv(seq_len * group_size, packed_block_m) + # dense_equal 是编译期常量。由于每个 segment 长度都不超过 seq_len,而 + # 总长度恰好为 batch_size*seq_len,可以严格推出每个 segment 都等长。 + dense_equal = ( + total_q == batch_size * seq_len + and total_kv == batch_size * seq_len + ) + # 对 dense 长序列启用反向逻辑 tile 映射。因果 attention 中越靠后的 Q + # tile 能看到越多 KV,计算量越大;优先提交重 tile 可以缩短最后少数 CTA + # 造成的调度长尾。resident2 和 ragged 路径仍保持正向映射。 + reverse_dense_tiles = dense_equal and not use_resident2 + # attention scale 转为 exp2 所需的 base-2 缩放系数。 + softmax_scale = (1.0 / head_dim_qk) ** 0.5 * LOG2_E + + @T.prim_func + def packed_kernel_factor_softmax_scale_v18( + q: T.Tensor((total_q, num_qo_heads, head_dim_qk), T.bfloat16), + k: T.Tensor((total_kv, num_kv_heads, head_dim_qk), T.bfloat16), + v: T.Tensor((total_kv, num_kv_heads, head_dim_vo), T.bfloat16), + output: T.Tensor((total_q, num_qo_heads, head_dim_vo), T.bfloat16), + qo_indptr: T.Tensor((batch_size + 1,), T.int32), + kv_indptr: T.Tensor((batch_size + 1,), T.int32), + ): + # 网格维度: + # x = packed Q tile; + # y = KV head; + # z = batch/request。 + # 一个 CTA 因而处理一个请求、一个 KV head 和一段 packed Q rows。 + with T.Kernel( + packed_tile_count, + num_kv_heads, + batch_size, + threads=packed_threads, + ) as (packed_tile, kv_head, batch_idx): + # Q tile 在整个 KV 循环中常驻 shared memory。长路径 M=128 时, + # q_shared 大小为 128*128*2 = 32 KiB。 + q_shared = T.alloc_shared( + (packed_block_m, head_dim_qk), T.bfloat16 + ) + # 同一个 kv_shared 分时保存 K 和 V:QK GEMM 完成后当前 K 生命周期 + # 已结束,随后 V 覆盖这块空间。这样长路径只需 16 KiB KV shared, + # 而不是分别为 K、V 分配两份内存。 + kv_shared = T.alloc_shared( + (packed_block_n, head_dim_qk), T.bfloat16 + ) + + # scores:FP32 QK 累加器和当前 tile 的指数权重。 + scores = T.alloc_fragment( + (packed_block_m, packed_block_n), T.float32 + ) + # probs:scores 转成 BF16 后供 PV 矩阵乘使用。 + probs = T.alloc_fragment( + (packed_block_m, packed_block_n), T.bfloat16 + ) + # output_accum:跨全部 KV tile 保存 FP32 输出分子。 + output_accum = T.alloc_fragment( + (packed_block_m, head_dim_vo), T.float32 + ) + # 每个 packed row 的在线 Softmax 状态。row_max_prev 是 scratch, + # row_scale 在循环中保存历史尺度修正,循环结束后复用为 1/denom。 + row_max = T.alloc_fragment((packed_block_m,), T.float32) + row_max_prev = T.alloc_fragment((packed_block_m,), T.float32) + row_scale = T.alloc_fragment((packed_block_m,), T.float32) + row_denom = T.alloc_fragment((packed_block_m,), T.float32) + + # dense equal-length 特化:直接用 batch_idx*seq_len 定位请求,并将 + # q_len/kv_len 变成编译期常量;ragged 路径仍从 indptr 读取真实边界。 + # 这可删除 dense 热路径上的 indptr load 和部分动态边界判断。 + q_start = ( + batch_idx * seq_len + if dense_equal + else qo_indptr[batch_idx] + ) + kv_start = ( + batch_idx * seq_len + if dense_equal + else kv_indptr[batch_idx] + ) + q_len = ( + seq_len + if dense_equal + else qo_indptr[batch_idx + 1] - q_start + ) + kv_len = ( + seq_len + if dense_equal + else kv_indptr[batch_idx + 1] - kv_start + ) + # MetaX PipelinePlanning 在 dense 长度完全常量化后,会把同一 + # kv_shared 中先写 K、后写 V 的合法生命周期复用误判成 stage + # 重叠写。dense 路径仅为 copy 边界保留一次运行时 indptr 读取, + # 数学边界、网格和有效 tile 判断仍然使用常量 kv_len。 + copy_kv_len = ( + kv_indptr[batch_idx + 1] - kv_start + if dense_equal + else kv_len + ) + # packed_q_len 是当前请求包含的逻辑 packed rows 数量。 + packed_q_len = q_len * group_size + # physical packed_tile 来自 blockIdx.x;logical_packed_tile 决定实际 + # 处理哪段 Q。反转只改变 CTA 提交顺序,不改变数学结果或输出位置。 + logical_packed_tile = ( + packed_tile_count - 1 - packed_tile + if reverse_dense_tiles + else packed_tile + ) + packed_tile_start = logical_packed_tile * packed_block_m + # dense 路径的网格恰好覆盖全部 packed rows,因此所有 CTA 有效; + # ragged 请求可能短于 seq_len 上界,需要在运行时过滤无效 CTA。 + valid_q_tile = ( + True + if dense_equal + else packed_tile_start < packed_q_len + ) + # bottom-right causal mask 使用 kv_len-q_len 修正 Q/KV 长度差。 + causal_offset = kv_len - q_len + + if valid_q_tile: + # 将 packed row 反解为 query position 和 GQA 组内 Q head: + # q_pos = packed_row // group_size + # group_head= packed_row % group_size + # 再与当前 kv_head 组合出原始 qo_head。最后一个 tile 的补齐行写0。 + for i, d in T.Parallel(packed_block_m, head_dim_qk): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + group_head = packed_row % group_size + if packed_row < packed_q_len: + q_shared[i, d] = q[ + q_start + q_pos, + kv_head * group_size + group_head, + d, + ] + else: + q_shared[i, d] = T.cast(0, T.bfloat16) + + # 初始化在线 Softmax:输出分子=0、分母=0、running max=-inf。 + T.clear(output_accum) + T.clear(row_denom) + T.fill(row_max, -T.infinity(T.float32)) + + # 当前 packed tile 末尾对应的 query position 上界。一个 packed tile + # 覆盖 packed_block_m/group_size 个不同 query position。 + q_upper_bound = T.min( + q_len, + T.ceildiv( + (logical_packed_tile + 1) * packed_block_m, + group_size, + ), + ) + # 使用 tile 内最后一个 query 的因果边界求最大可见 KV 长度,以便 + # 整块跳过其右侧不可能被任何行看到的 KV tiles。 + max_visible = T.min( + T.max(0, causal_offset + q_upper_bound), + kv_len, + ) + visible_tile_count = ( + T.ceildiv(max_visible, packed_block_n) + if causal + else T.ceildiv(kv_len, packed_block_n) + ) + # 无效 ragged Q tile 的 loop_range=0,可跳过全部主要计算。 + loop_range = T.if_then_else( + valid_q_tile, visible_tile_count, 0 + ) + # 当前 packed tile 第一行对应的 query position。 + first_q_pos = packed_tile_start // group_size + # 如果某个 KV tile 连当前 packed tile 的第一行都完全可见,那么它 + # 对后续所有行也完全可见。这部分 tile 无需逐元素生成 causal mask, + # 直接把 scores 清零作为 GEMM 初始累加器即可。 + fully_visible_tiles = T.min( + loop_range, + T.max( + 0, + (first_q_pos + causal_offset + 1) // packed_block_n, + ), + ) + + # 顺序扫描当前 packed Q tile 可见的 KV tiles。在线 Softmax 的 + # running max/denom/output_accum 在相邻迭代间存在严格依赖。 + for kv_tile in T.Pipelined(loop_range, num_stages=NUM_STAGES): + # 当前 KV tile 在请求内部的半开区间 [tile_start, tile_end)。 + tile_start = kv_tile * packed_block_n + tile_end = tile_start + packed_block_n + + if tile_end <= copy_kv_len: + # 完整 K tile 走向量化 copy。disable_tma=True 使用当前 + # MetaX 后端已验证可工作的普通 shared-memory copy 路径。 + T.copy( + k[ + kv_start + tile_start : kv_start + tile_end, + kv_head, + :, + ], + kv_shared, + disable_tma=True, + ) + else: + # 最后一个 ragged K tile 可能越过请求边界,必须逐元素判断; + # 越界位置填0,不能读到扁平张量中下一个请求的数据。 + for j, d in T.Parallel(packed_block_n, head_dim_qk): + kv_pos = tile_start + j + if kv_pos < copy_kv_len: + kv_shared[j, d] = k[ + kv_start + kv_pos, kv_head, d + ] + else: + kv_shared[j, d] = T.cast(0, T.bfloat16) + + if causal and kv_tile < fully_visible_tiles: + # 整块对所有 query 行可见,只需将 QK 累加器初始化为0。 + T.clear(scores) + else: + # causal frontier 或 ragged tail 需要逐元素初始化 mask。 + # 合法条件同时检查 packed Q tail、KV tail 和 bottom-right + # causal 边界;非法元素设为 -inf,使其 softmax 权重为0。 + for i, j in T.Parallel( + packed_block_m, packed_block_n + ): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + kv_pos = tile_start + j + scores[i, j] = T.if_then_else( + (packed_row < packed_q_len) + and (kv_pos < kv_len) + and ( + (not causal) + or kv_pos < q_pos + 1 + causal_offset + ), + 0.0, + -T.infinity(T.float32), + ) + + # scores = mask + Q @ K^T。clear_accum 默认为 False,因此前面 + # 写入的 0/-inf mask 会作为矩阵乘累加器被保留下来。 + T.gemm( + q_shared, + kv_shared, + scores, + transpose_B=True, + policy=T.GemmWarpPolicy.FullRow, + ) + + # 求当前 tile 的逐行最大值。row_max_prev 是 scratch,row_max + # 始终保存此前全部 KV tiles 的 running max。 + T.reduce_max(scores, row_max_prev, dim=1) + for i in T.Parallel(packed_block_m): + # 最大值改变时,用 exp(old_max-new_max) 把历史分母和历史 + # 输出分子转换到新的数值尺度,保证在线 Softmax 数值稳定。 + row_scale[i] = T.exp2( + ( + row_max[i] + - T.max(row_max[i], row_max_prev[i]) + ) + * softmax_scale + ) + # 合并历史最大值与当前 tile 最大值。 + row_max[i] = T.max(row_max[i], row_max_prev[i]) + + # 将 logits 转成相对于新 running max 的指数值。采用 + # FlashAttention 风格在线 Softmax,不保存完整 attention 矩阵。 + for i, j in T.Parallel(packed_block_m, packed_block_n): + scores[i, j] = T.exp2( + (scores[i, j] - row_max[i]) * softmax_scale + ) + # tile max 已无后续用途,复用 row_max_prev 保存当前指数和。 + T.reduce_sum(scores, row_max_prev, dim=1) + for i in T.Parallel(packed_block_m): + # 分母更新:历史分母先乘 row_scale,再加当前 tile 指数和。 + row_denom[i] = ( + row_denom[i] * row_scale[i] + row_max_prev[i] + ) + # PV GEMM 输入为 BF16,将 FP32 指数权重转换到 probs fragment。 + T.copy(scores, probs) + + # 历史输出分子与分母使用相同的 row_scale 重新定标。 + for i, d in T.Parallel(packed_block_m, head_dim_vo): + output_accum[i, d] *= row_scale[i] + + if tile_end <= copy_kv_len: + # QK 已结束,当前 K 不再存活;把对应 V tile 覆盖写入同一个 + # kv_shared,以减少每 CTA 的动态 shared memory 占用。 + T.copy( + v[ + kv_start + tile_start : kv_start + tile_end, + kv_head, + :, + ], + kv_shared, + disable_tma=True, + ) + else: + # ragged V tail 与 K tail 一样执行显式边界判断和补0。 + for j, d in T.Parallel(packed_block_n, head_dim_vo): + kv_pos = tile_start + j + if kv_pos < copy_kv_len: + kv_shared[j, d] = v[ + kv_start + kv_pos, kv_head, d + ] + else: + kv_shared[j, d] = T.cast(0, T.bfloat16) + + # 累积当前 tile 的输出贡献:output_accum += probs @ V。 + T.gemm( + probs, + kv_shared, + output_accum, + policy=T.GemmWarpPolicy.FullRow, + ) + + if valid_q_tile: + # 所有 KV tiles 处理完后再归一化。row_scale 已结束循环内使命, + # 现在复用为每行的 1/softmax_denominator。每行只除一次,后续 + # 128 个输出维度都通过乘法归一化。补齐行和完全 mask 行设为0。 + for i in T.Parallel(packed_block_m): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + row_scale[i] = T.if_then_else( + (packed_row < packed_q_len) + and ( + (not causal) + or q_pos + causal_offset >= 0 + ), + 1.0 / row_denom[i], + 0.0, + ) + + # 将 packed row 重新映射到原始 output[q_pos, qo_head, d]。 + # packed tail 只参与内部补齐,不允许写回输出张量。 + for i, d in T.Parallel(packed_block_m, head_dim_vo): + packed_row = packed_tile_start + i + q_pos = packed_row // group_size + group_head = packed_row % group_size + if packed_row < packed_q_len: + output[ + q_start + q_pos, + kv_head * group_size + group_head, + d, + ] = output_accum[i, d] * row_scale[i] + + return packed_kernel_factor_softmax_scale_v18 + + +def run_kernel( + q, + k, + v, + output, + qo_indptr, + kv_indptr, + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, +): + """OJ 调用入口:按完整规格选择、缓存并启动 TileLang kernel。""" + + # cache key 必须包含所有会改变生成代码、网格或张量 shape 的参数: + # q/k 的总长度决定静态张量形状;seq_len 决定网格上界、tile 配置和分支; + # head 数、head_dim、causal 则直接影响 GQA 映射和 attention 数学逻辑。 + key = ( + "packed-gqa-factor-softmax-scale-v18", + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + if key not in _kernel_cache: + # 首次遇到该参数组合时才执行 JIT: + # seq_len<=128:小序列回退路径,每 CTA 处理一个 Q head,启动和资源 + # 开销更小,保留单 token、非2次幂尾部的现有优势; + # seq_len>128 :主 packed GQA 路径,在一个 CTA 内处理同一 KV head + # 对应的多个 Q heads,提高 K/V 数据复用。 + if seq_len <= 128: + _kernel_cache[key] = build_kernel( + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + else: + _kernel_cache[key] = build_packed_kernel_factor_softmax_scale_v18( + q.shape[0], + k.shape[0], + batch_size, + seq_len, + num_qo_heads, + num_kv_heads, + head_dim_qk, + head_dim_vo, + causal, + ) + # JIT 结果是可直接接收 Torch tensors 的 Cython backend callable。 + # output 由调用方提前分配,本函数只启动 kernel,不在计时路径创建临时张量。 + _kernel_cache[key](q, k, v, output, qo_indptr, kv_indptr) diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang_opt.md b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang_opt.md index babbe25..a1e8af7 100644 --- a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang_opt.md +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/tilelang_opt.md @@ -43,6 +43,37 @@ The JIT cache key is: Different indptr distributions with the same compile-time specification reuse the same compiled kernel. Per-request lengths and masks remain runtime values. +## Optimization version summary + +| Version | Optimization direction | Result and decision | +| --- | --- | --- | +| opt_000 | FlashAttention-style tiled structural baseline using the default TVM-FFI backend | Representative local correctness passed, but OJ failed during host-library export; retained only as the structural/failure baseline | +| opt_001 | Switch only the execution adapter to `execution_backend="cython"` | First OJ-compatible version; 15/15 passed, 690.101 ms; retained as the valid compatibility baseline | +| opt_002 | Runtime invalid-Q-tile guard and zero-trip KV loop | Large ragged/Q-shorter gains, but dense cases regressed 10%-12%; retained as evidence and superseded by compile-time specialization | +| opt_003 | Compile-time dense/ragged guard, long-path N=32, remove `O_shared`, enable fast math | 15/15 passed, 300.980 ms; major resource/occupancy improvement, retained | +| opt_004 | C500-style packed GQA ownership, M128/N64, 512 threads, full-visible causal fast path | Generated 69,632-byte dynamic shared allocation exceeded the 64 KiB limit; rejected before execution | +| opt_005 | Reduce packed KV tile N64->N32 to fit shared memory | OJ reused stale opt_004 code, so the intended kernel was not evaluated; inconclusive | +| opt_006 | Change builder, PrimFunc, cache key, and local tuning identity to force fresh 128x32 compilation | 15/15 passed, 100.631 ms; packed GQA/KV reuse produced a 2.99x gain over opt_003, retained | +| opt_007 | Restore N=64 by lifetime-sharing one shared allocation between K and V | 15/15 passed, 89.595 ms; reduced KV/softmax loop count and improved opt_006 by 10.97%, retained | +| opt_008 | Use M64/N32 and 256 threads globally to target two resident CTAs | Resources allowed two CTAs, but doubled KV/softmax iterations; local total regressed 5.57%, rejected | +| opt_009 | Shape dispatch: resident-two M64/N32 only for equal lengths up to 1024, otherwise opt_007 M128/N64 | 15/15 OJ passed, 89.365 ms; preserved long performance and improved selected short/equal shapes, retained | +| opt_010 | Explicit shared-memory swizzle annotations on the long path | Generated host/device kernels were identical to opt_009; measured as a no-op, rejected | +| opt_011 | Reverse dense causal packed-Q tile order so heavy late-Q CTAs are submitted first | All targeted dense cases improved; local total 88.646->87.310 ms (-1.51%), retained | +| opt_012 | Reuse softmax scratch, compute one reciprocal per row, multiply during store, and specialize dense equal-length bounds | 15/15 OJ passed; corrected CSV total 84.311 ms and mean score ratio 40.633%; current best | +| opt_013 | Abandoned experimental dispatch candidate | Explicitly discarded; its source/results must not be used as optimization evidence or as a parent version | +| opt_014 | Change only long-path PV GEMM from FullRow to FullCol to improve V shared reads | Rejected during case-3 compilation: QK scores/probs use a FullRow fragment layout incompatible with FullCol PV | +| opt_015 | Move V copy immediately after QK max reduction | 15/15 local correctness passed, but generated case-4 loop gained a sixth barrier and regressed 1.95%; rejected | +| opt_016 | Use Square warp partition for both long-path QK and PV | Rejected during case-4 compilation: QK N=64 and PV N=128 still infer incompatible scores/probs layouts | +| opt_017 | Skip output rescaling when row_scale is exactly 1 | Case-4 output was identical, but branch overhead regressed latency by 0.53%; rejected | +| opt_018 | Factor the common softmax scale as `(x-max)*scale` | Case-4 correctness passed, but latency regressed 1.18%; generated code shows no loop instruction-count reduction; rejected | + +The current submission entry `tilelang/run_kernel.py` is byte-identical to +`tilelang/opt_012_dense_softmax_cleanup.py`. Future versions start from opt_012. + +The reusable analysis dimensions and profiler decision tree for future rounds +are recorded in +`workflows/references/tilelang_kernel_optimization_directions.md`. + ## opt_000: structural baseline File: `tilelang/opt_000_structural_baseline.py` @@ -912,3 +943,181 @@ the logical Q tile, so the gain is isolated to causal load scheduling. Decision: retain opt_011 as the next OJ candidate. Detailed data is in `results/tilelang_16g/opt_011_results_16g.md`. + +## opt_012: dense softmax cleanup + +File: `tilelang/opt_012_dense_softmax_cleanup.py` + +Parent: `opt_011_reverse_dense_tiles.py` + +This version refines the online softmax computation in the dense path, +focusing on reducing numerical overhead and improving instruction efficiency. + +Single conceptual change: + +- Cleanup of dense softmax computation path with optimized exp2 usage +- Improved numerical stability and reduced computational overhead + +Local correctness: All 15 OJ test cases pass with 100% match rate locally. + +### opt_012 OJ results + +Submitted: 2026-07-16 + +All 15 testcases passed correctness. + +| Case | Config | User (ms) | Baseline (ms) | Speedup | Score % | +|------|--------|-----------|---------------|---------|---------| +| 1 | ragged_b33_16294 | 2.585 | 1.575 | 0.609x | 35.21% | +| 2 | equal_b1_s1024 | 0.291 | 0.260 | 0.893x | 46.77% | +| 3 | equal_b1_s4096 | 3.015 | 1.655 | 0.549x | 30.71% | +| 4 | equal_b1_s16384 | 45.911 | 22.426 | 0.488x | 26.52% | +| 5 | equal_b4_s1024 | 0.904 | 0.635 | 0.702x | 39.26% | +| 6 | equal_b4_s4096 | 11.688 | 6.064 | 0.519x | 28.65% | +| 7 | equal_b16_s1024 | 3.335 | 2.024 | 0.607x | 34.44% | +| 8 | equal_b16_s2048 | 12.394 | 6.638 | 0.536x | 30.08% | +| 9 | q512_k1024_b4 | 0.715 | 0.538 | 0.752x | 41.47% | +| 10 | mixed_b4 | 0.577 | 0.412 | 0.714x | 39.95% | +| 11 | q_lt_kv_b2 | 0.701 | 0.410 | 0.585x | 34.39% | +| 12 | ragged_b27_12251 | 1.816 | 1.169 | 0.644x | 36.93% | +| 13 | short_ragged_969 | 0.308 | 0.151 | 0.490x | 32.12% | +| 14 | single_token | 0.018 | 0.106 | 5.889x | 85.49% | +| 15 | tail_non_power2 | 0.053 | 0.109 | 2.057x | 67.50% | + +Aggregate performance: +- Sum of user times: 84.311 ms +- Sum of baseline times: 44.172 ms +- Mean score ratio: 40.633% +- Display scores: 35, 46, 30, 26, 39, 28, 34, 30, 41, 40, 34, 37, 32, 85, 67 +- Mean display score: 40.3 / 100 + +The three aggregate values above were recomputed directly from all 15 rows in +`results/tilelang/tilelang_oj_results_opt_012.csv`; the earlier manually entered +totals were incorrect. + +Observations: +- All correctness tests passed +- Cases 14 and 15 (edge cases) significantly outperform baseline +- Long dense sequences (cases 3, 4, 6, 8) are slowest relative to baseline +- Overall performance is below baseline on most compute-heavy cases + +Decision: retain as current best TileLang version. Further optimization should +focus on improving the long dense sequence path where the performance gap is +largest. The baseline FlashInfer implementation uses more sophisticated +techniques (partition-KV, async prefetch, architecture-specific MMA) that +TileLang does not yet fully replicate. + +## opt_014 to opt_018: profiler-driven case-4 experiments + +Parent for every candidate: `opt_012_dense_softmax_cleanup.py`. None of these +experiments replaced `tilelang/run_kernel.py`; opt_012 remains the submission +entry and current verified best. + +### Profiler evidence used + +The opt_012 case-4 profile reports 52,042.51 Kcycles, 99.29% AP busy duty, +20.14% MMA duty, 74.04% shared-memory efficiency, and 53,248 bytes dynamic +shared memory. Compared with opt_007, `wsm_stall` fell 8.20%, but +`vls_pipeline_stall` increased by 569.55%. Generated case-4 code shows five +`__syncthreads()` calls per KV-loop iteration. QK loads its shared operand with +`uint2`, while PV loads V into its B fragment with scalar BF16 accesses. + +Detailed profiler analysis is stored in +`results/tilelang_64g/opt_012_case4_mcprofiler_analysis_64g.md`. + +### opt_014: PV FullCol + +File: `tilelang/opt_014_pv_fullcol.py` + +Hypothesis: distributing PV waves along the 128 output columns could make V +shared-memory reads more contiguous. The short resident-two path retained +FullRow; only the long path used FullCol for PV. + +Cases 1 and 2 passed because they retained FullRow. Case 3 failed during +TileLang layout inference before device compilation. QK produces a FullRow +`scores/probs` fragment, while FullCol PV requires a different thread layout. +Direct fragment copy cannot perform that cross-thread redistribution. A shared +staging buffer could transform it, but would exceed the current 53-KiB resource +budget. Decision: reject. + +### opt_015: early V copy + +File: `tilelang/opt_015_v_prefetch_after_qk.py` + +Hypothesis: move V copy from after softmax to immediately after QK max reduction, +placing the K/V lifetime transition near an existing synchronization and making +V ready earlier. + +All 15 local correctness cases passed. Generated case-4 code disproved the +barrier-merging hypothesis: the compiler inserted synchronization before V copy +and another before the sum reduction, increasing the KV-loop barrier count from +five to six. A seven-sample local A/B measured: + +```text +opt_012 median: 45.976318 ms +opt_015 median: 46.874752 ms +regression: 1.95% +``` + +Decision: reject. Moving a shared overwrite between the two reductions worsens +the compiler's dependency schedule. + +### opt_016: Square QK/PV partition + +File: `tilelang/opt_016_square_warp_partition.py` + +Hypothesis: use Square for both QK and PV so their fragment policy remains +consistent while distributing waves across M and N. + +Case-4 compilation still failed layout inference. Policy equality is not enough: +QK has output shape M128/N64 while PV has M128/N128, so Square computes different +wave partitions and incompatible `scores/probs` layouts. Decision: reject. + +### opt_017: conditional output rescale + +File: `tilelang/opt_017_skip_identity_rescale.py` + +When a KV tile does not raise a row's running maximum, `row_scale=exp2(0)=1`. +The candidate branched around the 128 output-accumulator multiplications for +such rows. Case-4 output was byte-identical to opt_012, but local A/B measured: + +```text +opt_012 median: 45.963520 ms +opt_017 median: 46.207359 ms +regression: 0.53% +``` + +The per-row predicate/divergence costs more than the saved identity multiplies +on this mapping. Decision: reject. + +### opt_018: factor softmax scale + +File: `tilelang/opt_018_factor_softmax_scale.py` + +The packed path rewrites `x*scale-max*scale` as `(x-max)*scale`. Case-4 output +matches opt_012 at 100%, with maximum absolute difference 0.00390625 and worst +tolerance ratio 0.13355. Ten-sample local A/B measured: + +```text +opt_012 median: 46.044737 ms +opt_018 median: 46.588417 ms +regression: 1.18% +``` + +Both generated kernels keep the same `(1024,4,1)` grid, 512 threads, 53,248-byte +dynamic shared allocation, and five barriers. In opt_012 the compiler can reuse +`row_max*scale` outside the 16-score unrolled loop, so factorization does not +reduce the per-score instruction count. The new subtract-then-multiply order +instead lengthens the dependency chain feeding `exp2f`. Decision: reject. + +Generated artifacts: + +```text +results/tilelang_64g/opt_015_case4_device_kernel.cu +results/tilelang_64g/opt_015_case4_host_kernel.cu +results/tilelang_64g/opt_018_case4_device_kernel.cu +results/tilelang_64g/opt_018_case4_host_kernel.cu +``` + +Final decision for this round: retain opt_012 unchanged. No further optimization +candidate was created after opt_018. diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/workflows/references/README.md b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/workflows/references/README.md index 3cf6e71..4484d96 100644 --- a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/workflows/references/README.md +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/workflows/references/README.md @@ -14,6 +14,7 @@ and hypotheses that still require experiments. | `mxmaca_matrix_instructions.md` | Known and missing matrix-compute information | | `mxcc_compiler_and_profiler.md` | Architecture targets, resource reports, profiling/debug tools | | `mcflashinfer_kernel_notes.md` | MetaX open-source kernel sources to inspect | +| `tilelang_kernel_optimization_directions.md` | Roofline、访存生命周期、流水线、MMA、Softmax 和 profiler 指标到代码动作的完整分析框架 | Primary sources: diff --git a/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/workflows/references/tilelang_kernel_optimization_directions.md b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/workflows/references/tilelang_kernel_optimization_directions.md new file mode 100644 index 0000000..c586699 --- /dev/null +++ b/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill/workflows/references/tilelang_kernel_optimization_directions.md @@ -0,0 +1,264 @@ +# TileLang 算子优化方向与性能分析框架 + +## 1. 目的 + +本文用于指导 FlashInfer Ragged Prefill 在 MetaX C500 上的后续 TileLang +优化。先建立可量化的性能模型,再使用 mcTracer 和 mcProfiler 定位具体瓶颈, +避免仅根据源码直觉同时修改多个变量。 + +当前有效基线为 `tilelang/opt_012_dense_softmax_cleanup.py`,公开入口 +`tilelang/run_kernel.py` 与其完全一致。opt_013 已放弃,不得作为父版本或性能 +证据。 + +## 2. 固定正确性约束 + +- Q/K/V/output 为 BF16,主要累加为 FP32。 +- Ragged NHD layout,32 个 Q heads、4 个 KV heads,GQA group size 为 8。 +- QK 和 VO head dimension 均为 128。 +- Bottom-right causal mask。 +- 必须支持 Q/KV 不等长、非 2 次幂尾部和无效网格 tile。 +- `run_kernel` 计时路径中不得同步、分配临时张量或重复 JIT。 + +任何优化先满足完整正确性,再讨论性能。 + +## 3. 算法和任务划分 + +优先确认高层映射,而不是先做局部指令调整: + +- 保持 FlashAttention 风格在线 Softmax,禁止物化完整注意力矩阵。 +- 同一 CTA 内尽量让 8 个 Q heads 共享对应 KV head 的 K/V 数据。 +- 跳过完全不可见的 causal tiles 和无效 ragged Q tiles。 +- 根据 tiny、short equal、dense long、ragged、Q Shared -> MMA fragment | 是否每个 KV tile 重复从 shared 读取;部分 Q 能否常驻寄存器 | +| K | Global -> Shared -> MMA fragment | 是否在 Q heads、Q tiles 或 CTA 之间重复加载 | +| V | Global -> Shared -> MMA fragment | 是否与 K 安全复用 shared allocation;是否重复加载 | +| scores | FP32 fragment | 是否重复 clear/fill/copy,是否形成 private spill | +| probs | BF16 fragment | FP32->BF16 转换和 fragment layout 转换是否冗余 | +| output accumulator | FP32 fragment | 是否占用过多寄存器,是否被重复缩放或写回 | +| row max/sum/denom/scale | FP32 fragment | 是否可以复用 scratch,减少 copy/fill/reduce | +| indptr 和长度 | 标量/global | Dense shape 是否可在编译期常量化 | + +应为每个 KV-loop iteration 列出 Q/K/V、scores、softmax state 和 output state +的读写次数,并与生成代码及 profiler 实际流量交叉验证。 + +## 6. 存储层级与资源限制 + +TileLang 主要存储对象: + +```text +T.alloc_fragment -> 通常映射到寄存器或 MMA fragment +T.alloc_local -> 可能映射到寄存器,也可能形成 private memory +T.alloc_shared -> C500 WSM/shared memory +``` + +每个候选必须记录: + +- threads/CTA 和 64-thread waves/CTA。 +- registers/thread、MT-register occupancy。 +- static/dynamic shared memory。 +- private memory per thread 和总量。 +- 可驻留 CTA/AP 和 waves/AP。 +- pipeline stage、padding、swizzle 后的资源变化。 + +private memory 是每线程逻辑地址空间,通常由设备内存支持并经过缓存;它不等于 +每次都直接访问 HBM,但经常意味着寄存器溢出,仍应尽量避免。 + +当前 opt_012 长路径继承的关键资源基线约为: + +```text +512 threads/CTA +53,248 bytes dynamic shared +255 registers/thread(历史 opt_007 测量) +1 CTA/AP(shared memory 限制) +``` + +任何 tile 或流水线修改都必须先证明没有超过 64 KiB shared 限制,也没有产生 +不可接受的 private spill。 + +## 7. Shared memory 布局与同步 + +重点分析: + +- Q/K/V 的 MMA 读取是否发生 bank conflict。 +- reduction workspace 是否产生 WSM conflict。 +- K 写入、QK 读取、V 覆盖、PV 读取之间需要多少 barrier。 +- padding/swizzle 是否真正改变生成的物理地址。 +- shared allocation 生命周期能否进一步复用。 + +opt_010 已证明:显式添加 swizzle annotation 后生成 host/device kernel 与 +opt_009 完全相同。TileLang 源码出现 swizzle 不等于物理布局变化,必须比较生成 +代码或 profiler 指标。 + +## 8. 流水线排布 + +当前 KV tile 的主要顺序为: + +```text +load K +-> QK GEMM +-> max reduction +-> exp2 +-> sum reduction +-> rescale denominator/output +-> load V +-> PV GEMM +``` + +可能的优化方向: + +- 当前 tile 计算时预取下一 tile 的 K 或 V。 +- K/V 双缓冲,或仅对 K/仅对 V 做异步预取。 +- 将 global->shared copy 与 Softmax 标量计算重叠。 +- 减少每轮 `__syncthreads()`。 +- 缩小某个 shared tile,为第二 pipeline stage 腾出空间。 + +当前 K/V 分时复用同一 shared allocation,在线 Softmax 又存在循环依赖,不能 +直接把 `NUM_STAGES=1` 改成 2。必须先画出 buffer 生命周期并重新计算 shared +总量。 + +## 9. 连续访问、合并与向量化 + +检查 Global->Shared 和 Shared->Fragment: + +- 相邻线程是否访问连续地址。 +- 地址是否满足 BF16 向量加载对齐。 +- 完整 tile 是否走向量化 `T.copy`。 +- 只有最后一个 ragged tile 使用标量 tail 路径。 +- Q/K/V 是否生成 16B、32B 或更宽事务。 +- 输出写回是否合并。 +- packed-row 映射是否破坏 Q 的连续访问。 + +必须从生成代码确认 `uint2`、`uint4` 等实际宽加载;不能只根据 TileLang 源码 +推断已经向量化。 + +## 10. MMA 映射与线程组织 + +分析: + +- `BLOCK_M/BLOCK_N/K` 是否匹配 C500 MMA 形状。 +- `T.GemmWarpPolicy.FullRow` 是否是最佳 policy。 +- threads 是否为 64 的合理倍数。 +- 每个 CTA 的 wave 数和每 AP 的驻留 wave 数。 +- QK 和 PV 是否都高效使用 MMA。 +- fragment layout 转换是否产生额外指令。 +- MMA duty 低是因为操作数等待,还是 GEMM 映射本身低效。 + +AP busy 高只表示 AP 有工作,不代表矩阵单元得到充分利用。 + +## 11. Softmax 与 reduction + +每个 KV tile 通常包含 max reduction、exp2、sum reduction、running state 更新和 +output rescale。继续检查: + +- max/sum 是否通过 shared workspace,是否可用 wave reduction 减少 barrier。 +- fully-visible tile 是否完全移除逐元素 mask。 +- `row_scale`、max 和 denominator 是否重复计算或复制。 +- FP32/BF16 转换次数。 +- softmax 循环是否可融合。 +- 是否存在不必要的 `fill`、`copy`、`clear`。 + +opt_012 已完成 scratch 复用、每行一次倒数和乘法归一化,下一轮必须基于生成 +指令确认还剩哪些重复工作。 + +## 12. 循环展开与代码体积 + +- 固定且较小的 MMA K-loop、向量 copy loop 可评估展开。 +- 长 KV loop 禁止完全展开。 +- Softmax 元素循环过度展开可能增加寄存器、private memory 和指令缓存压力。 +- 每次展开实验必须重新检查资源报告和生成代码体积。 + +## 13. mcTracer 与 mcProfiler 的指标映射 + +先用 mcTracer: + +- 确认目标 kernel symbol、grid/block 和真实持续时间。 +- 获取 registers、dynamic shared、private memory 和 occupancy。 +- 排除 host launch、同步、额外 memcpy、重编译和其他 kernel 干扰。 + +再用 mcProfiler: + +- AP busy、MMA/MTE/STE/VLS/L2C duty。 +- ISU stall 分类。 +- shared-memory access efficiency 和 bank conflict。 +- VL1/L2 hit rate。 +- global read/write bytes。 +- achieved/dispatched waves。 + +根据结果选择方向: + +| 证据 | 优先代码方向 | +| --- | --- | +| `wsm_stall` 仍占绝对主导、shared efficiency 低 | Shared layout、reduction workspace、barrier、buffer 生命周期 | +| `wsm_stall` 下降但 MMA duty 仍低 | GEMM policy、tile/wave 映射、Softmax 标量指令占比 | +| MTE duty 或 memory latency 高 | K/V 向量加载、异步预取、双缓冲、L2 reuse | +| private memory 非零或 registers 过高 | 缩小 fragment、减少展开、复用 softmax scratch | +| 单 CTA 尾部明显、长 KV 工作不均衡 | CTA 顺序、persistent work planning、split-KV | +| host launch 占比高 | 仅针对 tiny path 优化入口和 kernel 数量 | + +## 14. opt_012 当前分析优先级 + +首先分析正式 case 4,然后用 case 3/6/8 验证同一结论是否可推广: + +1. `wsm_stall` 是否仍接近 opt_007 的约 98%。 +2. MMA duty 是否已高于 opt_007 的 15%-18%。 +3. shared efficiency 是否仍接近 79.62%。 +4. opt_012 的 softmax cleanup 降低了哪些指令和 stall。 +5. case 4 当前是 shared/barrier、MMA throughput,还是 load pipeline 受限。 + +候选优化按证据排序: + +1. Reduction/barrier 和 shared workspace 优化。 +2. K/V copy 与计算重叠。 +3. 保持正确资源预算的双缓冲或部分预取。 +4. MMA tile/policy 和 wave mapping。 +5. 超长序列 split-KV。 + +## 15. 实验规则 + +- 每轮只改变一个可解释的概念,保留父版本。 +- builder、PrimFunc 和 Python cache key 同时升级版本,避免陈旧缓存。 +- 先正确性,再资源报告,再局部 A/B,再完整 15 点。 +- 跨 OJ 版本比较原始 `tk_time_ms`,不使用波动的 baseline 归因。 +- 小于正常噪声的变化必须重复测量。 +- profiler 采集脚本不得在同一进程加载 FlashInfer 和 TileLang。 + diff --git a/race_tests/mla/README.md b/race_tests/mla/README.md new file mode 100644 index 0000000..66f3369 --- /dev/null +++ b/race_tests/mla/README.md @@ -0,0 +1,43 @@ +# DeepSeek MLA Decode TileLang 算子优化 + +本目录用于实现和优化 DeepSeek V3/R1 decode 阶段的 Multi-Head Latent +Attention(MLA)变体,目标硬件为 MetaX C500,提交实现限定使用 TileLang。 + +## 入口 + +- `problem_statement.md`:整理后的题目契约、数学定义、接口和测试范围。 +- `赛题一mla教程.md`:已有提交说明、当前约 49.5 分实现和完整示例代码。 +- `test_tilelang_mla.py`:已有 TileLang kernel、PyTorch reference 和本地测试入口。 +- `test_cases_mla_batch_ctx.json`:31 个 batch/kv_ctx 测试规格。 + +## 当前状态 + +已有实现采用: + +```text +BLOCK_H = 16 +BLOCK_N = 32 +num_split = 1 +FP16 input/output +FP32 QK、online softmax 和 output accumulation +FullCol GEMM policy +``` + +已有教程记录一次 Accepted、约 49.5 分结果。该结果作为后续优化的初始有效 +基线;开始修改前应重新确认提交源码、OJ 原始数据和当前容器中的生成代码一致。 + +## 工作规则 + +- `run_kernel` 的函数名、参数顺序和参数类型不得改变。 +- 提交 kernel 内不得使用 PyTorch 完成 GPU 计算。 +- 结果必须写入调用方提供的 `output`。 +- 当前最佳版本必须独立保留;每个候选使用新文件和唯一 JIT cache identity。 +- 正确性优先,容差为 `rtol=2e-3, atol=2e-3`。 +- 长上下文可能接近 4 GiB 评测内存限制,workspace 必须纳入预算。 + +通用优化方法参考: + +```text +/data/operator_task_package/ref/README.md +/data/operator_task_package/ref/08_templates/new_operator_checklist.md +``` diff --git a/race_tests/mla/__pycache__/test_tilelang_mla.cpython-312.pyc b/race_tests/mla/__pycache__/test_tilelang_mla.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74a8d9e55c6e77eb69c331ce41abda8451dd1316 GIT binary patch literal 20715 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 IXAY|WFBKZA<^TWy literal 0 HcmV?d00001 diff --git a/race_tests/mla/problem_statement.md b/race_tests/mla/problem_statement.md new file mode 100644 index 0000000..a02964a --- /dev/null +++ b/race_tests/mla/problem_statement.md @@ -0,0 +1,174 @@ +# TileLang 算子优化:DeepSeek MLA Decode + +## 1. 任务 + +实现 DeepSeek V3/R1 decode 阶段使用的 Multi-Head Latent Attention 变体。 +评测程序在 GPU 上构造输入,调用提交文件中的 `run_kernel`,实现必须使用 +TileLang 完成计算并将结果写入 `output`。 + +时间限制:10,000 ms。内存限制:4,096 MiB。 + +## 2. 固定参数 + +| 参数 | 值 | +|---|---:| +| query/key 非 RoPE 维度 `dim` | 512 | +| RoPE 维度 `pe_dim` | 64 | +| QK 总维度 | 576 | +| V/output 维度 | 512 | +| query heads | 16(当前评测范围) | +| KV heads | 1 | +| softmax scale | `1 / sqrt(576)` | +| 输入/输出 dtype | float16 | +| 主要数值累加 | 建议 float32 | + +所有 query heads 共享同一组 latent KV cache。 + +## 3. 数学定义 + +对 batch `b`、query head `h`、KV 位置 `s`: + +```text +score[b,h,s] = + sum(d=0..511) q[b,h,d] * kv[b,s,0,d] + + sum(p=0..63) q_pe[b,h,p] * k_pe[b,s,0,p] + +scaled_score[b,h,s] = score[b,h,s] / sqrt(576) + +attention[b,h,:] = softmax(scaled_score[b,h,:], dim=kv_ctx) + +output[b,h,d] = + sum(s=0..kv_ctx-1) attention[b,h,s] * kv[b,s,0,d] +``` + +等价矩阵形式: + +```text +Q_full = concat(q, q_pe) # (..., 576) +K_full = concat(kv, k_pe) # (..., kv_ctx, 576) +S = Q_full @ K_full^T / sqrt(576) +P = softmax(S, axis=-1) +O = P @ kv # (..., 512) +``` + +不得物化完整大规模 score/attention 到 PyTorch tensor;TileLang kernel 可使用 +tiled online softmax 或 split/merge 实现。 + +## 4. 接口契约 + +提交 Python 文件必须提供以下函数,名称和参数顺序完全一致: + +```python +def run_kernel( + q, # Tensor[float16], (batch, heads, dim) + q_pe, # Tensor[float16], (batch, heads, pe_dim) + kv, # Tensor[float16], (batch, kv_ctx, kv_heads, dim) + k_pe, # Tensor[float16], (batch, kv_ctx, kv_heads, pe_dim) + output, # Tensor[float16], (batch, heads, dim) + batch, # int64 + heads, # int64 + kv_heads, # int64 + kv_ctx, # int64 + dim, # int64, fixed 512 + pe_dim, # int64, fixed 64 +): + ... +``` + +张量均为连续 float16 CUDA tensor。`run_kernel` 自行选择 launch 配置、取得或 +编译 TileLang kernel,并写入已分配的 `output`。 + +## 5. 正确性 + +评测使用: + +```text +torch.allclose(candidate, reference, rtol=2e-3, atol=2e-3) +``` + +该容差比此前 Ragged Prefill 案例更严格。online softmax 的 running max、分母、 +输出分子以及 QK/PV accumulation 应优先使用 float32,并检查长上下文数值稳定性。 + +## 6. 测试范围 + +```text +batch: 1, 2, 4, 8, 16, 32 +heads: 16 +kv_heads: 1 +kv_ctx: 2,048 到 65,536 +dim: 512 +pe_dim: 64 +``` + +本目录的 `test_cases_mla_batch_ctx.json` 当前包含 31 个组合: + +| Batch | kv_ctx | +|---:|---| +| 1 | 2048, 4096, 8192, 16384, 32768, 65536 | +| 2 | 2048, 8192, 16384, 32768, 65536 | +| 4 | 2048, 8192, 16384, 32768, 65536 | +| 8 | 2048, 8192, 16384, 32768, 65536 | +| 16 | 2048, 8192, 16384, 32768, 65536 | +| 32 | 2048, 8192, 16384, 32768, 65536 | + +大上下文显存占用高,评测已减少 warmup 和 iteration 数量。不能仅依据小 case +选择 split 数、tile 或 workspace。 + +## 7. 计算与数据规模 + +忽略 softmax 标量操作,近似 FLOPs: + +```text +QK main = 2 * batch * heads * kv_ctx * 512 +QK PE = 2 * batch * heads * kv_ctx * 64 +PV = 2 * batch * heads * kv_ctx * 512 +Total = 2 * batch * heads * kv_ctx * 1088 +``` + +当 `heads=16`: + +```text +Total FLOPs = 34,816 * batch * kv_ctx +``` + +每个 batch 的共享 cache 最低输入字节近似: + +```text +KV + K_PE = kv_ctx * (512 + 64) * 2 + = kv_ctx * 1,152 bytes +``` + +由于 16 个 heads 共享 KV,CTA ownership 是否能让多 heads 复用 KV/K_PE 是核心 +性能变量。若每个 head 独立扫描,cache 数据会被重复读取;若一次处理多个 heads, +则会增加 Q/output fragment 和 shared/register 压力。 + +最大组合 `batch=32, kv_ctx=65536` 中,仅 `kv` 输入约为 2 GiB,`k_pe` 约为 +256 MiB;split partial output、LSE 和其他 workspace 必须控制在 4 GiB 总限制内。 + +## 8. 禁止事项与提交要求 + +- GPU 计算算子不得使用 PyTorch,只允许 TileLang 实现计算。 +- 不得改变 `run_kernel` 接口。 +- 不得在计时路径中做不必要同步、重复 JIT 或大规模临时分配。 +- 不得假设 `kv_ctx` 只取某一个长度。 +- 提交内容应是评测指南要求的 Python 源码,而不是测试脚本或 reference。 + +## 9. PyTorch reference 语义 + +题目 reference 的逻辑为: + +```python +group_num = heads // kv_heads +q_main = q.reshape(batch, kv_heads, group_num, dim).permute(0, 2, 1, 3).float() +q_pos = q_pe.reshape(batch, kv_heads, group_num, pe_dim).permute(0, 2, 1, 3).float() +kv_main = kv.permute(0, 2, 1, 3).float() +k_pos = k_pe.permute(0, 2, 1, 3).float() +query = torch.cat([q_main, q_pos], dim=-1) +key = torch.cat([kv_main, k_pos], dim=-1) +scores = torch.einsum("bghd,bhsd->bghs", query, key) +attention = torch.softmax(scores * ((dim + pe_dim) ** -0.5), dim=-1) +out = torch.einsum("bghs,bhsd->bghd", attention, kv_main) +output.copy_(out.permute(0, 2, 1, 3).reshape(batch, heads, dim).to(output.dtype)) +``` + +这段代码只用于理解语义和本地 reference,不可作为提交 kernel 的计算实现。 diff --git a/race_tests/mla/test_cases_mla_batch_ctx.json b/race_tests/mla/test_cases_mla_batch_ctx.json new file mode 100644 index 0000000..d2fbd90 --- /dev/null +++ b/race_tests/mla/test_cases_mla_batch_ctx.json @@ -0,0 +1,33 @@ +[ + {"case_id": 1, "batch": 1, "kv_ctx": 2048, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 2, "batch": 1, "kv_ctx": 4096, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 3, "batch": 1, "kv_ctx": 8192, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 4, "batch": 1, "kv_ctx": 16384, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 5, "batch": 1, "kv_ctx": 32768, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 6, "batch": 1, "kv_ctx": 65536, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 7, "batch": 2, "kv_ctx": 2048, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 8, "batch": 2, "kv_ctx": 8192, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 9, "batch": 2, "kv_ctx": 16384, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 10, "batch": 2, "kv_ctx": 32768, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 11, "batch": 2, "kv_ctx": 65536, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 12, "batch": 4, "kv_ctx": 2048, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 13, "batch": 4, "kv_ctx": 8192, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 14, "batch": 4, "kv_ctx": 16384, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 15, "batch": 4, "kv_ctx": 32768, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 16, "batch": 4, "kv_ctx": 65536, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 17, "batch": 8, "kv_ctx": 2048, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 18, "batch": 8, "kv_ctx": 8192, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 19, "batch": 8, "kv_ctx": 16384, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 20, "batch": 8, "kv_ctx": 32768, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 21, "batch": 8, "kv_ctx": 65536, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 22, "batch": 16, "kv_ctx": 2048, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 23, "batch": 16, "kv_ctx": 8192, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 24, "batch": 16, "kv_ctx": 16384, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 25, "batch": 16, "kv_ctx": 32768, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 26, "batch": 16, "kv_ctx": 65536, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 27, "batch": 32, "kv_ctx": 2048, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 28, "batch": 32, "kv_ctx": 8192, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 29, "batch": 32, "kv_ctx": 16384, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 30, "batch": 32, "kv_ctx": 32768, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64}, + {"case_id": 31, "batch": 32, "kv_ctx": 65536, "heads": 16, "kv_heads": 1, "dim": 512, "pe_dim": 64} +] diff --git a/race_tests/mla/test_tilelang_mla.py b/race_tests/mla/test_tilelang_mla.py new file mode 100644 index 0000000..bc98ff4 --- /dev/null +++ b/race_tests/mla/test_tilelang_mla.py @@ -0,0 +1,290 @@ +import torch +import torch.nn.functional as F +import tilelang +from tilelang.autotuner import * +import tilelang.language as T +from einops import rearrange, einsum +import argparse +import json +@tilelang.jit( + out_idx=[4], + pass_configs={tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True}, +) +def flashattn(batch, heads, kv_head_num, seqlen_kv, dim, pe_dim, block_N, block_H, num_split, softmax_scale): + scale = float(softmax_scale * 1.44269504) # log2(e) + dtype = T.float16 + accum_dtype = T.float32 + kv_group_num = heads // kv_head_num + VALID_BLOCK_H = min(block_H, kv_group_num) + assert kv_head_num == 1, "kv_head_num must be 1" + @T.prim_func + def main_split( + Q: T.Tensor([batch, heads, dim], dtype), + Q_pe: T.Tensor([batch, heads, pe_dim], dtype), + KV: T.Tensor([batch, seqlen_kv, kv_head_num, dim], dtype), + K_pe: T.Tensor([batch, seqlen_kv, kv_head_num, pe_dim], dtype), + Output: T.Tensor([batch, heads, dim], dtype), + ): + glse = T.alloc_global([batch, heads, num_split], dtype) + Output_partial = T.alloc_global([batch, heads, num_split, dim], dtype) + # flash_attn_split + with T.Kernel(batch, heads // min(block_H, kv_group_num), num_split, threads=256) as (bid, hid, bz): + Q_shared = T.alloc_shared([block_H, dim], dtype) + S_shared = T.alloc_shared([block_H, block_N], dtype) + Q_pe_shared = T.alloc_shared([block_H, pe_dim], dtype) + KV_shared = T.alloc_shared([block_N, dim], dtype) + K_pe_shared = T.alloc_shared([block_N, pe_dim], dtype) + O_shared = T.alloc_shared([block_H, dim], dtype) + acc_s = T.alloc_fragment([block_H, block_N], accum_dtype) + acc_s_cast = T.alloc_fragment([block_H, block_N], dtype) + acc_o = T.alloc_fragment([block_H, dim], accum_dtype) + scores_max = T.alloc_fragment([block_H], accum_dtype) + scores_max_prev = T.alloc_fragment([block_H], accum_dtype) + scores_scale = T.alloc_fragment([block_H], accum_dtype) + scores_sum = T.alloc_fragment([block_H], accum_dtype) + logsum = T.alloc_fragment([block_H], accum_dtype) + cur_kv_head = hid // (kv_group_num // block_H) + T.use_swizzle(10) + T.copy(Q[bid, hid * VALID_BLOCK_H : (hid + 1) * VALID_BLOCK_H, :], Q_shared) + T.copy(Q_pe[bid, hid * VALID_BLOCK_H : (hid + 1) * VALID_BLOCK_H, :], Q_pe_shared) + T.fill(acc_o, 0) + T.fill(logsum, 0) + T.fill(scores_max, -T.infinity(accum_dtype)) + loop_range = T.ceildiv((seqlen_kv // num_split), block_N) + for k in T.Pipelined(loop_range, num_stages=2): + kv_start = (seqlen_kv // num_split) * bz + k * block_N + kv_end = (seqlen_kv // num_split) * bz + (k + 1) * block_N + T.copy(KV[bid, kv_start:kv_end, cur_kv_head, :], KV_shared) + T.copy(K_pe[bid, kv_start:kv_end, cur_kv_head, :], K_pe_shared) + T.clear(acc_s) + T.gemm(Q_shared, KV_shared, acc_s, transpose_B=True, policy=T.GemmWarpPolicy.FullCol) + T.gemm(Q_pe_shared, K_pe_shared, acc_s, transpose_B=True, policy=T.GemmWarpPolicy.FullCol) + T.copy(scores_max, scores_max_prev) + T.fill(scores_max, -T.infinity(accum_dtype)) + T.reduce_max(acc_s, scores_max, dim=1, clear=False) + for i in T.Parallel(block_H): + scores_max[i] = T.max(scores_max[i], scores_max_prev[i]) + for i in T.Parallel(block_H): + scores_scale[i] = T.exp2(scores_max_prev[i] * scale - scores_max[i] * scale) + for i, j in T.Parallel(block_H, block_N): + acc_s[i, j] = T.exp2(acc_s[i, j] * scale - scores_max[i] * scale) + T.reduce_sum(acc_s, scores_sum, dim=1) + T.copy(acc_s, S_shared) + T.copy(S_shared, acc_s_cast) + for i in T.Parallel(block_H): + logsum[i] = logsum[i] * scores_scale[i] + scores_sum[i] + for i, j in T.Parallel(block_H, dim): + acc_o[i, j] *= scores_scale[i] + T.gemm(acc_s_cast, KV_shared, acc_o, policy=T.GemmWarpPolicy.FullCol) + for i, j in T.Parallel(block_H, dim): + acc_o[i, j] /= logsum[i] + for i in T.Parallel(block_H): + logsum[i] = T.log2(logsum[i]) + scores_max[i] * scale + T.copy(logsum, glse[bid, hid * VALID_BLOCK_H : (hid + 1) * VALID_BLOCK_H, bz]) + T.copy(acc_o, O_shared) + T.copy(O_shared, Output_partial[bid, hid * VALID_BLOCK_H : (hid + 1) * VALID_BLOCK_H, bz, :]) + # combine + with T.Kernel(heads, batch, threads=128) as (hid, bz): + po_local = T.alloc_fragment([dim], dtype) + o_accum_local = T.alloc_fragment([dim], accum_dtype) + lse_local_split = T.alloc_var(accum_dtype) + lse_logsum_local = T.alloc_var(accum_dtype) + lse_max_local = T.alloc_var(accum_dtype) + scale_local = T.alloc_var(accum_dtype) + T.clear(lse_logsum_local) + T.clear(o_accum_local) + lse_max_local = -T.infinity(accum_dtype) + for k in T.serial(num_split): + lse_max_local = T.max(lse_max_local, glse[bz, hid, k]) + for k in T.Pipelined(num_split, num_stages=1): + lse_local_split = glse[bz, hid, k] + lse_logsum_local += T.exp2(lse_local_split - lse_max_local) + lse_logsum_local = T.log2(lse_logsum_local) + lse_max_local + for k in T.serial(num_split): + for i in T.Parallel(dim): + po_local[i] = Output_partial[bz, hid, k, i] + lse_local_split = glse[bz, hid, k] + scale_local = T.exp2(lse_local_split - lse_logsum_local) + for i in T.Parallel(dim): + o_accum_local[i] += po_local[i] * scale_local + for i in T.Parallel(dim): + Output[bz, hid, i] = o_accum_local[i] + @T.prim_func + def main_no_split( + Q: T.Tensor([batch, heads, dim], dtype), + Q_pe: T.Tensor([batch, heads, pe_dim], dtype), + KV: T.Tensor([batch, seqlen_kv, kv_head_num, dim], dtype), + K_pe: T.Tensor([batch, seqlen_kv, kv_head_num, pe_dim], dtype), + Output: T.Tensor([batch, heads, dim], dtype), + ): + with T.Kernel(heads // min(block_H, kv_group_num), batch, threads=128) as (hid, bid): + Q_shared = T.alloc_shared([block_H, dim], dtype) + S_shared = T.alloc_shared([block_H, block_N], dtype) + Q_pe_shared = T.alloc_shared([block_H, pe_dim], dtype) + KV_shared = T.alloc_shared([block_N, dim], dtype) + K_pe_shared = T.alloc_shared([block_N, pe_dim], dtype) + O_shared = T.alloc_shared([block_H, dim], dtype) + acc_s = T.alloc_fragment([block_H, block_N], accum_dtype) + acc_o = T.alloc_fragment([block_H, dim], accum_dtype) + scores_max = T.alloc_fragment([block_H], accum_dtype) + scores_max_prev = T.alloc_fragment([block_H], accum_dtype) + scores_scale = T.alloc_fragment([block_H], accum_dtype) + scores_sum = T.alloc_fragment([block_H], accum_dtype) + logsum = T.alloc_fragment([block_H], accum_dtype) + cur_kv_head = hid // (kv_group_num // block_H) + T.copy(Q[bid, hid * VALID_BLOCK_H : (hid + 1) * VALID_BLOCK_H, :], Q_shared) + T.copy(Q_pe[bid, hid * VALID_BLOCK_H : (hid + 1) * VALID_BLOCK_H, :], Q_pe_shared) + T.fill(acc_o, 0) + T.fill(logsum, 0) + T.fill(scores_max, -T.infinity(accum_dtype)) + loop_range = T.ceildiv(seqlen_kv, block_N) + for k in T.Pipelined(loop_range, num_stages=0): + T.copy(KV[bid, k * block_N : (k + 1) * block_N, cur_kv_head, :], KV_shared) + T.copy(K_pe[bid, k * block_N : (k + 1) * block_N, cur_kv_head, :], K_pe_shared) + T.gemm(Q_shared, KV_shared, acc_s, transpose_B=True, policy=T.GemmWarpPolicy.FullCol, clear_accum=True) + T.gemm(Q_pe_shared, K_pe_shared, acc_s, transpose_B=True, policy=T.GemmWarpPolicy.FullCol) + T.copy(scores_max, scores_max_prev) + T.fill(scores_max, -T.infinity(accum_dtype)) + T.reduce_max(acc_s, scores_max, dim=1, clear=False) + for i in T.Parallel(block_H): + scores_max[i] = T.max(scores_max[i], scores_max_prev[i]) + for i in T.Parallel(block_H): + scores_scale[i] = T.exp2(scores_max_prev[i] * scale - scores_max[i] * scale) + for i, j in T.Parallel(block_H, block_N): + acc_s[i, j] = T.exp2(acc_s[i, j] * scale - scores_max[i] * scale) + T.reduce_sum(acc_s, scores_sum, dim=1) + T.copy(acc_s, S_shared) + for i in T.Parallel(block_H): + logsum[i] = logsum[i] * scores_scale[i] + scores_sum[i] + for i, j in T.Parallel(block_H, dim): + acc_o[i, j] *= scores_scale[i] + T.gemm(S_shared, KV_shared, acc_o, policy=T.GemmWarpPolicy.FullCol) + for i, j in T.Parallel(block_H, dim): + acc_o[i, j] /= logsum[i] + T.copy(acc_o, O_shared) + T.copy(O_shared, Output[bid, hid * VALID_BLOCK_H : (hid + 1) * VALID_BLOCK_H, :]) + if num_split > 1: + return main_split + else: + return main_no_split +def ref_program(q, q_pe, kv, k_pe): + # """ + # Inputs: + # - q (Tensor): [batch, heads, dim] + # - q_pe (Tensor): [batch, heads, pe_dim] + # - kv (Tensor): [batch, seqlen_kv, kv_head_num, dim] + # - k_pe (Tensor): [batch, seqlen_kv, kv_head_num, pe_dim] + # Outputs: + # - output (Tensor): [batch, heads, dim] + # """ + dim = q.shape[-1] + pe_dim = q_pe.shape[-1] + num_head_groups = q.shape[1] // kv.shape[2] + scale = (dim + pe_dim) ** 0.5 + q = rearrange(q, "b (h g) d -> b g h d", g=num_head_groups) # [batch_size, num_head_groups, groups, dim] + q_pe = rearrange(q_pe, "b (h g) d -> b g h d", g=num_head_groups) # [batch_size, num_head_groups, groups, pe_dim] + kv = rearrange(kv, "b n h d -> b h n d") # [batch_size, groups, seqlen_kv, dim] + k_pe = rearrange(k_pe, "b n h d -> b h n d") # [batch_size, num_head_groups, groups, pe_dim] + query = torch.concat([q, q_pe], dim=-1) + key = torch.concat([kv, k_pe], dim=-1) + scores = einsum(query, key, "b g h d, b h s d -> b g h s") # [batch_size, num_head_groups, groups, seqlen_kv] + attention = F.softmax(scores / scale, dim=-1) # [batch_size, num_head_groups, groups, seqlen_kv] + out = einsum(attention, kv, "b g h s, b h s d -> b g h d") # [batch_size, num_head_groups, groups, dim] + out = rearrange(out, "b g h d -> b (h g) d") # [batch_size, heads, dim] + return out +def main( + batch=1, + heads=128, + kv_heads=1, + kv_ctx=8192, + dim=512, + pe_dim=64, +): + qk_flops = 2 * batch * heads * kv_ctx * (dim + pe_dim) + pv_flops = 2 * batch * heads * kv_ctx * dim + total_flops = qk_flops + pv_flops + BLOCK_N = 32 + BLOCK_H = min(16, heads // kv_heads) + num_split = 1 + softmax_scale = (dim + pe_dim) ** -0.5 + kernel = flashattn(batch, heads, kv_heads, kv_ctx, dim, pe_dim, BLOCK_N, BLOCK_H, num_split, softmax_scale) + profiler = kernel.get_profiler(tensor_supply_type=tilelang.TensorSupplyType.Randn) + profiler.assert_allclose(ref_program, rtol=2e-4, atol=1e-4) + latency = profiler.do_bench(warmup=500) + tflops = total_flops / latency * 1e-9 + print(f"Latency: {latency} ms") + print(f"TFlops: {tflops} TFlops") + return latency, tflops +def run_regression_perf( + batch=1, + heads=128, + kv_heads=1, + kv_ctx=8192, + dim=512, + pe_dim=64, +): + BLOCK_N = 64 + BLOCK_H = min(64, heads // kv_heads) + num_split = 1 + softmax_scale = (dim + pe_dim) ** -0.5 + kernel = flashattn(batch, heads, kv_heads, kv_ctx, dim, pe_dim, BLOCK_N, BLOCK_H, num_split, softmax_scale) + profiler = kernel.get_profiler(tensor_supply_type=tilelang.TensorSupplyType.Randn) + profiler.assert_allclose(ref_program, rtol=2e-4, atol=1e-4) + return profiler.do_bench(backend="cupti") + +if __name__ == "__main__": + import csv + parser = argparse.ArgumentParser() + parser.add_argument("--json", type=str, default=None, help="JSON file with test cases") + parser.add_argument("--no-json", action="store_true", help="Skip JSON mode, use single-case CLI args") + parser.add_argument("--batch", type=int, default=132, help="batch size") + parser.add_argument("--heads", type=int, default=128, help="q heads number") + parser.add_argument("--kv_heads", type=int, default=1, help="kv heads number") + parser.add_argument("--kv_ctx", type=int, default=8192, help="kv context length") + parser.add_argument("--dim", type=int, default=512, help="head dim") + parser.add_argument("--pe_dim", type=int, default=64, help="pe head dim") + args = parser.parse_args() + + if args.no_json: + main(args.batch, args.heads, args.kv_heads, args.kv_ctx, args.dim, args.pe_dim) + else: + json_path = args.json if args.json else "race_tests/mla/test_cases_mla_batch_ctx.json" + with open(json_path) as f: + cases = json.load(f) + passed = 0 + failed = 0 + csv_path = json_path.replace(".json", "_results.csv") + fieldnames = ["case_id", "batch", "heads", "kv_heads", "kv_ctx", "dim", "pe_dim", "latency_ms", "tflops", "status"] + with open(csv_path, "w", newline="") as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=fieldnames) + writer.writeheader() + for c in cases: + case_id = c.get("case_id", "?") + batch = c.get("batch", 1) + heads = c.get("heads", 16) + kv_heads = c.get("kv_heads", 1) + kv_ctx = c.get("kv_ctx", 8192) + dim = c.get("dim", 512) + pe_dim = c.get("pe_dim", 64) + print(f"[Case {case_id}] batch={batch}, kv_ctx={kv_ctx}") + try: + latency, tflops = main(batch, heads, kv_heads, kv_ctx, dim, pe_dim) + writer.writerow({ + "case_id": case_id, "batch": batch, "heads": heads, "kv_heads": kv_heads, + "kv_ctx": kv_ctx, "dim": dim, "pe_dim": pe_dim, + "latency_ms": round(latency, 6), "tflops": round(tflops, 4), "status": "PASS" + }) + print(f"[Case {case_id}] PASS latency={latency:.4f}ms tflops={tflops:.4f}") + passed += 1 + except Exception as e: + writer.writerow({ + "case_id": case_id, "batch": batch, "heads": heads, "kv_heads": kv_heads, + "kv_ctx": kv_ctx, "dim": dim, "pe_dim": pe_dim, + "latency_ms": -1, "tflops": -1, "status": f"FAIL: {err_msg}" + }) + print(f"[Case {case_id}] FAIL: {e}") + failed += 1 + err_msg = str(e).split("\n")[0] + print(f"\n=== Summary: {passed}/{len(cases)} passed, {failed}/{len(cases)} failed ===") + print(f"CSV saved to: {csv_path}") + diff --git a/race_tests/mla/tilelang/README.md b/race_tests/mla/tilelang/README.md new file mode 100644 index 0000000..55bb894 --- /dev/null +++ b/race_tests/mla/tilelang/README.md @@ -0,0 +1,27 @@ +# MLA TileLang optimization versions + +## Baseline + +The tutorial implementation in `../赛题一mla教程.md` is the accepted starting +point: `BLOCK_H=16`, `BLOCK_N=32`, `num_split=1`. + +## Versions + +- `opt_001_adaptive_split.py`: partitions KV across a power-of-two number of + CTAs, targets about 128 main-kernel CTAs, keeps 16 heads together, and merges + FP16 partial outputs using FP32 LSE and FP32 accumulation. +- `opt_002_batch1_split_table.py`: uses an individually measured split count + for each of the six fixed batch-one OJ shapes. +- `run_kernel.py`: byte-identical current candidate, presently `opt_002`. + +## Test + +From `/data/operator_task_package/race_tests/mla`: + +```bash +python tilelang/test_candidate.py tilelang/opt_001_adaptive_split.py \ + --batch 1 --kv-ctx 2048 +``` + +The test utility uses PyTorch only as an out-of-kernel reference and timer. It +is not submission code. diff --git a/race_tests/mla/tilelang/__pycache__/baseline_adapter.cpython-312.pyc b/race_tests/mla/tilelang/__pycache__/baseline_adapter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51486aa1c08d939651b17aa2899aaccebc83086f GIT binary patch literal 973 zcmZ8f&ubGw6rR~%O_SZWX{)vcH43fdVg#XHN}-ghhth*53Bs`MPLnj7WIH=4rc5P* zV2cHFYmPlCz4#w^@aV--gg8_XJmpplc<|(#O@q~snKy4{-n@C=d+(FuBoW}(Vt(VJ zhR_eS836V%dKp*_kdJ&EpbE}oj7li4`PxgA*L@wN(J-=RR~cuq99|FHsOWND^#&f) zje-udXMi|B4V=~1x)}6#D62{Hsmr~hw8~q=&DBE6TwY^@yHS~h zu2*&oG{;6u?P9puRVi_OH{_Jv4jVE}yke~uQBti}NE8Mo z&J^zI&jLMpZLmNcL~R9dw<59^#MX3{KD*ND#jFaG(kn?Sp8dvl(QkTeIz{!}+&& z-&>!P_nOP6&cvJiUcRlrCe8buA*cELG(FR?)A5+>*yA00G?pW$_Gn9Mt+XE>PtKm$ za~<31IAg8(y(ew|*uL4jlp0U&T4z(}%GG^qH`+^mbtYO%E#7`~IC+%<4im9m9AbV-mp=8jU1Ufa&AsdDJxCdhn%u-wRrq404P^tO#fG)BdaHiTQng(&E ZV~oF{TW1zZ+D+@Hg|X91T*K4x(?9E%=I{Uj literal 0 HcmV?d00001 diff --git a/race_tests/mla/tilelang/__pycache__/opt_001_adaptive_split.cpython-312.pyc b/race_tests/mla/tilelang/__pycache__/opt_001_adaptive_split.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33c3373b691eacf9dc1a87f24aa189f1543e7568 GIT binary patch literal 10356 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 literal 0 HcmV?d00001 diff --git a/race_tests/mla/tilelang/__pycache__/opt_002_batch1_split_table.cpython-312.pyc b/race_tests/mla/tilelang/__pycache__/opt_002_batch1_split_table.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ae3c6b3427a7fe11795a798362f4ae03f8df820 GIT binary patch literal 10553 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 literal 0 HcmV?d00001 diff --git a/race_tests/mla/tilelang/__pycache__/run_kernel.cpython-312.pyc b/race_tests/mla/tilelang/__pycache__/run_kernel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ad9e13e830bc68951995c7221c410e95113c6b8 GIT binary patch literal 10344 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 IH*swI4_!{BqyPW_ literal 0 HcmV?d00001 diff --git a/race_tests/mla/tilelang/baseline_adapter.py b/race_tests/mla/tilelang/baseline_adapter.py new file mode 100644 index 0000000..1fc108b --- /dev/null +++ b/race_tests/mla/tilelang/baseline_adapter.py @@ -0,0 +1,41 @@ +from test_tilelang_mla import flashattn + + +_CACHE = {} + + +def _choose_num_split(batch, kv_ctx): + return 1 + + +def run_kernel( + q, + q_pe, + kv, + k_pe, + output, + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, +): + key = (batch, heads, kv_heads, kv_ctx, dim, pe_dim) + kernel = _CACHE.get(key) + if kernel is None: + kernel = flashattn( + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, + 32, + min(16, heads // kv_heads), + 1, + (dim + pe_dim) ** -0.5, + ) + _CACHE[key] = kernel + result = kernel(q, q_pe, kv, k_pe) + output.copy_(result) diff --git a/race_tests/mla/tilelang/mla_opt.md b/race_tests/mla/tilelang/mla_opt.md new file mode 100644 index 0000000..d5dabd0 --- /dev/null +++ b/race_tests/mla/tilelang/mla_opt.md @@ -0,0 +1,169 @@ +# DeepSeek MLA Decode TileLang optimization log + +## Baseline + +Tutorial configuration: + +```text +BLOCK_H=16, BLOCK_N=32, num_split=1, threads=128 +``` + +One CTA owns all 16 heads for one batch item. The main grid therefore has only +`batch` CTAs, while the current full C500 has 104 APs. Even `batch=32` cannot +produce one CTA per AP. + +Observed with the original `test_tilelang_mla.py`: + +```text +batch=1, kv_ctx=2048: 1.1671965 ms, 0.0610893 TFLOPS, correctness passed +``` + +## opt_001_adaptive_split + +Changes: + +- Keep all 16 heads in one CTA so KV remains shared across heads. +- Partition KV across a power-of-two `num_split`. +- Target about 128 main-kernel CTAs without introducing KV tail tiles. +- Merge normalized FP16 partial outputs with FP32 LSE and FP32 accumulation. +- Main and merge kernels both use 128 threads. +- Keep `BLOCK_N=32`, `BLOCK_H=16`, and `num_stages=0`. + +Split selection: + +```text +desired_split = next_power_of_two(ceil(128 / batch)) +decrease until kv_ctx is divisible by desired_split * BLOCK_N +``` + +### Split-path failures exposed during implementation + +The tutorial contained a split branch, but `num_split` was fixed to one, so the +branch had not been compiled for this shape. + +1. `threads=256` failed MetaX MMA layout inference with integer divide by zero. + For M=16 FullCol, the four-wave mapping produced a zero warp dimension. +2. After changing to 128 threads, `num_stages=2` compiled but requested 92,160 B + dynamic shared memory, exceeding the C500 65,536 B limit. +3. The legal version uses 128 threads and `num_stages=0`. + +### Local representative results + +Candidate results use the same CUDA Event test utility. All use random FP16 +inputs and the OJ tolerance `rtol=2e-3, atol=2e-3`. + +| batch | kv_ctx | split | latency ms | TFLOPS | max abs error | +|---:|---:|---:|---:|---:|---:| +| 1 | 2,048 | 64 | 0.025882 | 2.754975 | 0.0001221 | +| 1 | 16,384 | 128 | 0.208020 | 2.742160 | 0.0000610 | +| 1 | 65,536 | 128 | 0.682893 | 3.341229 | 0.0000610 | +| 32 | 2,048 | 4 | 0.708347 | 3.221164 | 0.0002441 | +| 32 | 65,536 | 4 | 21.359616 | 3.418341 | 0.0001221 | + +### Same-harness comparison + +The tutorial kernel was also measured through the same CUDA Event utility. Its +`out_idx=[4]` profiler wrapper returns a new output tensor, so the adapter copies +that small tensor into the supplied output. This makes the baseline comparison +slightly conservative but does not explain the large gap. + +| batch | kv_ctx | baseline ms | opt_001 ms | local speedup | +|---:|---:|---:|---:|---:| +| 1 | 2,048 | 1.178386 | 0.025882 | 45.53x | +| 1 | 65,536 | 36.429016 | 0.682893 | 53.34x | +| 32 | 2,048 | 1.356488 | 0.708347 | 1.92x | + +OJ remains the final source of truth because its harness, inputs, baseline, and +timing boundaries can differ from this local utility. + +## Next experiments + +1. Sweep split counts around the current policy for short, medium, and long KV. +2. Capture mcTracer launch metadata for both main and combine kernels. +3. Profile the long-context main kernel before changing MMA/layout. +4. Test a single K=576 QK GEMM as an independent version. + +## OJ result: opt_001, batch=1 + +All six batch-one cases passed on the OJ platform. + +| case | kv_ctx | user ms | baseline ms | speedup | TFLOPS | score ratio | display | +|---:|---:|---:|---:|---:|---:|---:|---:| +| 1 | 2,048 | 0.027 | 0.434 | 16.074x | 2.641 | 94.40% | 94 | +| 2 | 4,096 | 0.051 | 0.789 | 15.471x | 2.796 | 94.21% | 94 | +| 3 | 8,192 | 0.123 | 1.541 | 12.528x | 2.319 | 92.88% | 92 | +| 4 | 16,384 | 0.200 | 3.008 | 15.040x | 2.852 | 94.05% | 94 | +| 5 | 32,768 | 0.351 | 5.961 | 16.983x | 3.250 | 94.74% | 94 | +| 6 | 65,536 | 0.647 | 11.866 | 18.340x | 3.527 | 95.13% | 95 | + +Aggregate over these six cases: + +```text +arithmetic-mean speedup: 15.739x +median speedup: 15.772x +mean score ratio: 94.235% +mean display score: 93.833 / 100 +``` + +The OJ latency agrees with the local CUDA Event measurements. Examples: + +```text +b1, ctx=2,048: local 0.025882 ms, OJ 0.027 ms +b1, ctx=16,384: local 0.208020 ms, OJ 0.200 ms +b1, ctx=65,536: local 0.682893 ms, OJ 0.647 ms +``` + +This agreement confirms that the local event harness measures the relevant GPU +path and that the split/merge speedup transfers to OJ. + +### Interpretation + +- The tutorial baseline grows almost linearly with `kv_ctx`, as expected from a + single CTA serially scanning every KV tile. +- opt_001 reaches 2.3--3.5 TFLOPS and generally becomes more efficient as the + context grows. Fixed launch, Q loading, partial-output, and combine costs are + amortized over more KV work. +- `kv_ctx=8,192` is the only visible dip: 2.319 TFLOPS and 12.528x speedup. Its + neighbors use the same target of 128 CTAs, so this is not a split-count + discontinuity. It should be repeated before changing dispatch; possible causes + include measurement variance, clock state, or a two-tile-per-CTA scheduling + regime. +- The score is already saturated near 94--95. Even a large kernel speedup can + recover at most about five display points on these cases. Optimization effort + should first inspect the remaining batch regimes rather than overfit batch=1. + +## opt_002_batch1_split_table + +The OJ exposes only the six `batch=1` shapes, so opt_002 replaces the generic +128-CTA target with a measured compile-time dispatch table: + +| kv_ctx | opt_001 split | opt_002 split | selected local latency ms | +|---:|---:|---:|---:| +| 2,048 | 64 | 64 | 0.025882 | +| 4,096 | 128 | 128 | about 0.050 | +| 8,192 | 128 | 256 | 0.092516 | +| 16,384 | 128 | 512 | 0.173768 | +| 32,768 | 128 | 256 | 0.335119 | +| 65,536 | 128 | 512 | 0.583962 | + +Key sweep evidence: + +```text +ctx=8,192: split64 0.108076, split128 0.126006, split256 0.092516 ms +ctx=16,384: split128 0.208020, split256 0.211407, split512 0.173768 ms +ctx=65,536: split128 0.682893, split512 0.583962, + split1024 0.729938, split2048 0.694124 ms +``` + +The best split is not monotonic in context length. More partitions improve AP +coverage and reduce work per CTA, but also repeat Q loads and enlarge partial +output plus combine work. The table captures the measured balance for the fixed +OJ shapes. + +### Rejected companion change + +An experimental opt_002 revision removed `acc_s_cast` and fed `S_shared` +directly to PV GEMM. It compiled and remained correct, but the effect was not +stable: about 1.3% faster at `ctx=8,192` and about 2% slower at `ctx=32,768` and +`65,536`. The final opt_002 restores the opt_001 PV path and changes only split +dispatch. diff --git a/race_tests/mla/tilelang/opt_001_adaptive_split.py b/race_tests/mla/tilelang/opt_001_adaptive_split.py new file mode 100644 index 0000000..02fcdb6 --- /dev/null +++ b/race_tests/mla/tilelang/opt_001_adaptive_split.py @@ -0,0 +1,272 @@ +import tilelang +import tilelang.language as T + + +# 固定 tile:一个 CTA 同时处理全部 16 个 query heads,并扫描一段 KV。 +BLOCK_N = 32 +BLOCK_H = 16 +# C500 有 104 个 AP,目标设置为 128 个主 kernel CTA,兼顾覆盖率和调度余量。 +TARGET_CTAS = 128 +_KERNEL_CACHE = {} + + +def _choose_num_split(batch, kv_ctx): + """选择 2 的幂次 KV 分区数,并保证每个分区只包含完整的 N tile。""" + # batch 越小,沿 KV 维切出的并行分区越多;batch 越大则减少分区合并开销。 + desired = max(1, (TARGET_CTAS + batch - 1) // batch) + num_split = 1 + while num_split < desired: + num_split *= 2 + + # 主循环没有 tail mask,因此 split_len 必须是 BLOCK_N 的整数倍。 + while num_split > 1 and kv_ctx % (num_split * BLOCK_N) != 0: + num_split //= 2 + return num_split + + +@tilelang.jit(pass_configs={tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True}) +def flashattn_split( + batch, + heads, + kv_head_num, + seqlen_kv, + dim, + pe_dim, + block_n, + block_h, + num_split, + softmax_scale, +): + scale = float(softmax_scale * 1.44269504) + dtype = T.float16 + accum_dtype = T.float32 + kv_group_num = heads // kv_head_num + valid_block_h = min(block_h, kv_group_num) + assert kv_head_num == 1, "kv_head_num must be 1" + + @T.prim_func + def main( + Q: T.Tensor([batch, heads, dim], dtype), + Q_pe: T.Tensor([batch, heads, pe_dim], dtype), + KV: T.Tensor([batch, seqlen_kv, kv_head_num, dim], dtype), + K_pe: T.Tensor([batch, seqlen_kv, kv_head_num, pe_dim], dtype), + Output: T.Tensor([batch, heads, dim], dtype), + ): + # 每个 split 输出一个归一化的 partial output 和对应的 log-sum-exp。 + # LSE 工作区很小,使用 FP32 可降低长上下文跨分区合并的数值误差。 + glse = T.alloc_global([batch, heads, num_split], accum_dtype) + output_partial = T.alloc_global([batch, heads, num_split, dim], dtype) + + # 主 kernel 网格为 batch * head_group * num_split。 + # 当前 heads=BLOCK_H=16,因此 head_group=1,不会跨 CTA 重复读取同一段 KV。 + with T.Kernel( + batch, + heads // min(block_h, kv_group_num), + num_split, + threads=128, + ) as (bid, hid, split_id): + Q_shared = T.alloc_shared([block_h, dim], dtype) + S_shared = T.alloc_shared([block_h, block_n], dtype) + Q_pe_shared = T.alloc_shared([block_h, pe_dim], dtype) + KV_shared = T.alloc_shared([block_n, dim], dtype) + K_pe_shared = T.alloc_shared([block_n, pe_dim], dtype) + O_shared = T.alloc_shared([block_h, dim], dtype) + acc_s = T.alloc_fragment([block_h, block_n], accum_dtype) + acc_s_cast = T.alloc_fragment([block_h, block_n], dtype) + acc_o = T.alloc_fragment([block_h, dim], accum_dtype) + scores_max = T.alloc_fragment([block_h], accum_dtype) + scores_max_prev = T.alloc_fragment([block_h], accum_dtype) + scores_scale = T.alloc_fragment([block_h], accum_dtype) + scores_sum = T.alloc_fragment([block_h], accum_dtype) + logsum = T.alloc_fragment([block_h], accum_dtype) + cur_kv_head = hid // (kv_group_num // block_h) + + # Q/Q_PE 在整个 KV 分区循环中保持不变,只加载一次并供所有 tile 复用。 + T.use_swizzle(10) + T.copy( + Q[bid, hid * valid_block_h : (hid + 1) * valid_block_h, :], + Q_shared, + ) + T.copy( + Q_pe[bid, hid * valid_block_h : (hid + 1) * valid_block_h, :], + Q_pe_shared, + ) + T.fill(acc_o, 0) + T.fill(logsum, 0) + T.fill(scores_max, -T.infinity(accum_dtype)) + + split_len = seqlen_kv // num_split + loop_range = split_len // block_n + # num_stages=2 会把实际动态 shared 推高到 92,160 B,超过 C500 的 + # 65,536 B 上限,因此当前合法实现使用单缓冲串行流水。 + for k in T.Pipelined(loop_range, num_stages=0): + kv_start = split_len * split_id + k * block_n + kv_end = kv_start + block_n + T.copy(KV[bid, kv_start:kv_end, cur_kv_head, :], KV_shared) + T.copy(K_pe[bid, kv_start:kv_end, cur_kv_head, :], K_pe_shared) + + # score = q @ kv^T + q_pe @ k_pe^T,两次 MMA 累加到同一 FP32 fragment。 + T.clear(acc_s) + T.gemm( + Q_shared, + KV_shared, + acc_s, + transpose_B=True, + policy=T.GemmWarpPolicy.FullCol, + ) + T.gemm( + Q_pe_shared, + K_pe_shared, + acc_s, + transpose_B=True, + policy=T.GemmWarpPolicy.FullCol, + ) + + # 数值稳定的 online softmax:更新 running max,并把旧分母和旧输出 + # 重缩放到新的 running-max 基准下。 + T.copy(scores_max, scores_max_prev) + T.fill(scores_max, -T.infinity(accum_dtype)) + T.reduce_max(acc_s, scores_max, dim=1, clear=False) + for i in T.Parallel(block_h): + scores_max[i] = T.max(scores_max[i], scores_max_prev[i]) + scores_scale[i] = T.exp2( + scores_max_prev[i] * scale - scores_max[i] * scale + ) + for i, j in T.Parallel(block_h, block_n): + acc_s[i, j] = T.exp2( + acc_s[i, j] * scale - scores_max[i] * scale + ) + + T.reduce_sum(acc_s, scores_sum, dim=1) + # PV MMA 接收 FP16 概率,因此通过 shared 完成 FP32 -> FP16 转换。 + T.copy(acc_s, S_shared) + T.copy(S_shared, acc_s_cast) + for i in T.Parallel(block_h): + logsum[i] = logsum[i] * scores_scale[i] + scores_sum[i] + for i, j in T.Parallel(block_h, dim): + acc_o[i, j] *= scores_scale[i] + T.gemm( + acc_s_cast, + KV_shared, + acc_o, + policy=T.GemmWarpPolicy.FullCol, + ) + + # 先在每个 split 内归一化 partial output,再保存其 LSE 供第二个 kernel 合并。 + for i, j in T.Parallel(block_h, dim): + acc_o[i, j] /= logsum[i] + for i in T.Parallel(block_h): + logsum[i] = T.log2(logsum[i]) + scores_max[i] * scale + + T.copy( + logsum, + glse[ + bid, + hid * valid_block_h : (hid + 1) * valid_block_h, + split_id, + ], + ) + T.copy(acc_o, O_shared) + T.copy( + O_shared, + output_partial[ + bid, + hid * valid_block_h : (hid + 1) * valid_block_h, + split_id, + :, + ], + ) + + # 合并 kernel:用各 split 的 LSE 计算全局权重,再加权求和 partial output。 + # 每个 CTA 独占一个 (batch, head) 输出,不需要原子操作。 + with T.Kernel(heads, batch, threads=128) as (hid, bid): + partial = T.alloc_fragment([dim], dtype) + output_accum = T.alloc_fragment([dim], accum_dtype) + split_lse = T.alloc_var(accum_dtype) + merged_lse = T.alloc_var(accum_dtype) + max_lse = T.alloc_var(accum_dtype) + split_scale = T.alloc_var(accum_dtype) + + T.clear(merged_lse) + T.clear(output_accum) + max_lse = -T.infinity(accum_dtype) + + # 第一遍求最大 LSE,第二遍计算全局 log-sum-exp。 + for k in T.serial(num_split): + max_lse = T.max(max_lse, glse[bid, hid, k]) + for k in T.Pipelined(num_split, num_stages=1): + split_lse = glse[bid, hid, k] + merged_lse += T.exp2(split_lse - max_lse) + merged_lse = T.log2(merged_lse) + max_lse + + # 第三遍按照 exp2(split_lse - merged_lse) 合并各分区的归一化输出。 + for k in T.serial(num_split): + for i in T.Parallel(dim): + partial[i] = output_partial[bid, hid, k, i] + split_lse = glse[bid, hid, k] + split_scale = T.exp2(split_lse - merged_lse) + for i in T.Parallel(dim): + output_accum[i] += partial[i] * split_scale + + for i in T.Parallel(dim): + Output[bid, hid, i] = output_accum[i] + + return main + + +def _get_kernel(batch, heads, kv_heads, kv_ctx, dim, pe_dim): + num_split = _choose_num_split(batch, kv_ctx) + softmax_scale = (dim + pe_dim) ** -0.5 + # shape、tile 和 split 都属于编译期常量,必须共同进入缓存键。 + key = ( + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, + BLOCK_N, + BLOCK_H, + num_split, + ) + kernel = _KERNEL_CACHE.get(key) + if kernel is None: + # 每种静态规格只 JIT 一次,后续 warmup/计时直接复用已编译 kernel。 + kernel = flashattn_split( + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, + BLOCK_N, + BLOCK_H, + num_split, + softmax_scale, + ) + _KERNEL_CACHE[key] = kernel + return kernel + + +def run_kernel( + q, + q_pe, + kv, + k_pe, + output, + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, +): + kernel = _get_kernel( + int(batch), + int(heads), + int(kv_heads), + int(kv_ctx), + int(dim), + int(pe_dim), + ) + kernel(q, q_pe, kv, k_pe, output) diff --git a/race_tests/mla/tilelang/opt_002_batch1_split_table.py b/race_tests/mla/tilelang/opt_002_batch1_split_table.py new file mode 100644 index 0000000..e16cc37 --- /dev/null +++ b/race_tests/mla/tilelang/opt_002_batch1_split_table.py @@ -0,0 +1,284 @@ +import tilelang +import tilelang.language as T + + +# 固定 tile:一个 CTA 同时处理全部 16 个 query heads,并扫描一段 KV。 +BLOCK_N = 32 +BLOCK_H = 16 +# batch=1 是当前 OJ 的完整范围;每个长度使用本地扫描得到的最佳 split。 +BATCH1_SPLITS = { + 2048: 64, + 4096: 128, + 8192: 256, + 16384: 512, + 32768: 256, + 65536: 512, +} +DEFAULT_TARGET_CTAS = 128 +_KERNEL_CACHE = {} + + +def _choose_num_split(batch, kv_ctx): + """选择 2 的幂次 KV 分区数,并保证每个分区只包含完整的 N tile。""" + if batch == 1 and kv_ctx in BATCH1_SPLITS: + return BATCH1_SPLITS[kv_ctx] + + # 保留通用回退,避免接口收到题面范围以外的规格时失效。 + # batch 越小,沿 KV 维切出的并行分区越多;batch 越大则减少分区合并开销。 + desired = max(1, (DEFAULT_TARGET_CTAS + batch - 1) // batch) + num_split = 1 + while num_split < desired: + num_split *= 2 + + # 主循环没有 tail mask,因此 split_len 必须是 BLOCK_N 的整数倍。 + while num_split > 1 and kv_ctx % (num_split * BLOCK_N) != 0: + num_split //= 2 + return num_split + + +@tilelang.jit(pass_configs={tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True}) +def flashattn_split( + batch, + heads, + kv_head_num, + seqlen_kv, + dim, + pe_dim, + block_n, + block_h, + num_split, + softmax_scale, +): + scale = float(softmax_scale * 1.44269504) + dtype = T.float16 + accum_dtype = T.float32 + kv_group_num = heads // kv_head_num + valid_block_h = min(block_h, kv_group_num) + assert kv_head_num == 1, "kv_head_num must be 1" + + @T.prim_func + def main( + Q: T.Tensor([batch, heads, dim], dtype), + Q_pe: T.Tensor([batch, heads, pe_dim], dtype), + KV: T.Tensor([batch, seqlen_kv, kv_head_num, dim], dtype), + K_pe: T.Tensor([batch, seqlen_kv, kv_head_num, pe_dim], dtype), + Output: T.Tensor([batch, heads, dim], dtype), + ): + # 每个 split 输出一个归一化的 partial output 和对应的 log-sum-exp。 + # LSE 工作区很小,使用 FP32 可降低长上下文跨分区合并的数值误差。 + glse = T.alloc_global([batch, heads, num_split], accum_dtype) + output_partial = T.alloc_global([batch, heads, num_split, dim], dtype) + + # 主 kernel 网格为 batch * head_group * num_split。 + # 当前 heads=BLOCK_H=16,因此 head_group=1,不会跨 CTA 重复读取同一段 KV。 + with T.Kernel( + batch, + heads // min(block_h, kv_group_num), + num_split, + threads=128, + ) as (bid, hid, split_id): + Q_shared = T.alloc_shared([block_h, dim], dtype) + S_shared = T.alloc_shared([block_h, block_n], dtype) + Q_pe_shared = T.alloc_shared([block_h, pe_dim], dtype) + KV_shared = T.alloc_shared([block_n, dim], dtype) + K_pe_shared = T.alloc_shared([block_n, pe_dim], dtype) + O_shared = T.alloc_shared([block_h, dim], dtype) + acc_s = T.alloc_fragment([block_h, block_n], accum_dtype) + acc_s_cast = T.alloc_fragment([block_h, block_n], dtype) + acc_o = T.alloc_fragment([block_h, dim], accum_dtype) + scores_max = T.alloc_fragment([block_h], accum_dtype) + scores_max_prev = T.alloc_fragment([block_h], accum_dtype) + scores_scale = T.alloc_fragment([block_h], accum_dtype) + scores_sum = T.alloc_fragment([block_h], accum_dtype) + logsum = T.alloc_fragment([block_h], accum_dtype) + cur_kv_head = hid // (kv_group_num // block_h) + + # Q/Q_PE 在整个 KV 分区循环中保持不变,只加载一次并供所有 tile 复用。 + T.use_swizzle(10) + T.copy( + Q[bid, hid * valid_block_h : (hid + 1) * valid_block_h, :], + Q_shared, + ) + T.copy( + Q_pe[bid, hid * valid_block_h : (hid + 1) * valid_block_h, :], + Q_pe_shared, + ) + T.fill(acc_o, 0) + T.fill(logsum, 0) + T.fill(scores_max, -T.infinity(accum_dtype)) + + split_len = seqlen_kv // num_split + loop_range = split_len // block_n + # num_stages=2 会把实际动态 shared 推高到 92,160 B,超过 C500 的 + # 65,536 B 上限,因此当前合法实现使用单缓冲串行流水。 + for k in T.Pipelined(loop_range, num_stages=0): + kv_start = split_len * split_id + k * block_n + kv_end = kv_start + block_n + T.copy(KV[bid, kv_start:kv_end, cur_kv_head, :], KV_shared) + T.copy(K_pe[bid, kv_start:kv_end, cur_kv_head, :], K_pe_shared) + + # score = q @ kv^T + q_pe @ k_pe^T,两次 MMA 累加到同一 FP32 fragment。 + T.clear(acc_s) + T.gemm( + Q_shared, + KV_shared, + acc_s, + transpose_B=True, + policy=T.GemmWarpPolicy.FullCol, + ) + T.gemm( + Q_pe_shared, + K_pe_shared, + acc_s, + transpose_B=True, + policy=T.GemmWarpPolicy.FullCol, + ) + + # 数值稳定的 online softmax:更新 running max,并把旧分母和旧输出 + # 重缩放到新的 running-max 基准下。 + T.copy(scores_max, scores_max_prev) + T.fill(scores_max, -T.infinity(accum_dtype)) + T.reduce_max(acc_s, scores_max, dim=1, clear=False) + for i in T.Parallel(block_h): + scores_max[i] = T.max(scores_max[i], scores_max_prev[i]) + scores_scale[i] = T.exp2( + scores_max_prev[i] * scale - scores_max[i] * scale + ) + for i, j in T.Parallel(block_h, block_n): + acc_s[i, j] = T.exp2( + acc_s[i, j] * scale - scores_max[i] * scale + ) + + T.reduce_sum(acc_s, scores_sum, dim=1) + # PV MMA 接收 FP16 概率,因此通过 shared 完成 FP32 -> FP16 转换。 + T.copy(acc_s, S_shared) + T.copy(S_shared, acc_s_cast) + for i in T.Parallel(block_h): + logsum[i] = logsum[i] * scores_scale[i] + scores_sum[i] + for i, j in T.Parallel(block_h, dim): + acc_o[i, j] *= scores_scale[i] + T.gemm( + acc_s_cast, + KV_shared, + acc_o, + policy=T.GemmWarpPolicy.FullCol, + ) + + # 先在每个 split 内归一化 partial output,再保存其 LSE 供第二个 kernel 合并。 + for i, j in T.Parallel(block_h, dim): + acc_o[i, j] /= logsum[i] + for i in T.Parallel(block_h): + logsum[i] = T.log2(logsum[i]) + scores_max[i] * scale + + T.copy( + logsum, + glse[ + bid, + hid * valid_block_h : (hid + 1) * valid_block_h, + split_id, + ], + ) + T.copy(acc_o, O_shared) + T.copy( + O_shared, + output_partial[ + bid, + hid * valid_block_h : (hid + 1) * valid_block_h, + split_id, + :, + ], + ) + + # 合并 kernel:用各 split 的 LSE 计算全局权重,再加权求和 partial output。 + # 每个 CTA 独占一个 (batch, head) 输出,不需要原子操作。 + with T.Kernel(heads, batch, threads=128) as (hid, bid): + partial = T.alloc_fragment([dim], dtype) + output_accum = T.alloc_fragment([dim], accum_dtype) + split_lse = T.alloc_var(accum_dtype) + merged_lse = T.alloc_var(accum_dtype) + max_lse = T.alloc_var(accum_dtype) + split_scale = T.alloc_var(accum_dtype) + + T.clear(merged_lse) + T.clear(output_accum) + max_lse = -T.infinity(accum_dtype) + + # 第一遍求最大 LSE,第二遍计算全局 log-sum-exp。 + for k in T.serial(num_split): + max_lse = T.max(max_lse, glse[bid, hid, k]) + for k in T.Pipelined(num_split, num_stages=1): + split_lse = glse[bid, hid, k] + merged_lse += T.exp2(split_lse - max_lse) + merged_lse = T.log2(merged_lse) + max_lse + + # 第三遍按照 exp2(split_lse - merged_lse) 合并各分区的归一化输出。 + for k in T.serial(num_split): + for i in T.Parallel(dim): + partial[i] = output_partial[bid, hid, k, i] + split_lse = glse[bid, hid, k] + split_scale = T.exp2(split_lse - merged_lse) + for i in T.Parallel(dim): + output_accum[i] += partial[i] * split_scale + + for i in T.Parallel(dim): + Output[bid, hid, i] = output_accum[i] + + return main + + +def _get_kernel(batch, heads, kv_heads, kv_ctx, dim, pe_dim): + num_split = _choose_num_split(batch, kv_ctx) + softmax_scale = (dim + pe_dim) ** -0.5 + # shape、tile 和 split 都属于编译期常量,必须共同进入缓存键。 + key = ( + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, + BLOCK_N, + BLOCK_H, + num_split, + ) + kernel = _KERNEL_CACHE.get(key) + if kernel is None: + # 每种静态规格只 JIT 一次,后续 warmup/计时直接复用已编译 kernel。 + kernel = flashattn_split( + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, + BLOCK_N, + BLOCK_H, + num_split, + softmax_scale, + ) + _KERNEL_CACHE[key] = kernel + return kernel + + +def run_kernel( + q, + q_pe, + kv, + k_pe, + output, + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, +): + kernel = _get_kernel( + int(batch), + int(heads), + int(kv_heads), + int(kv_ctx), + int(dim), + int(pe_dim), + ) + kernel(q, q_pe, kv, k_pe, output) diff --git a/race_tests/mla/tilelang/run_kernel.py b/race_tests/mla/tilelang/run_kernel.py new file mode 100644 index 0000000..e16cc37 --- /dev/null +++ b/race_tests/mla/tilelang/run_kernel.py @@ -0,0 +1,284 @@ +import tilelang +import tilelang.language as T + + +# 固定 tile:一个 CTA 同时处理全部 16 个 query heads,并扫描一段 KV。 +BLOCK_N = 32 +BLOCK_H = 16 +# batch=1 是当前 OJ 的完整范围;每个长度使用本地扫描得到的最佳 split。 +BATCH1_SPLITS = { + 2048: 64, + 4096: 128, + 8192: 256, + 16384: 512, + 32768: 256, + 65536: 512, +} +DEFAULT_TARGET_CTAS = 128 +_KERNEL_CACHE = {} + + +def _choose_num_split(batch, kv_ctx): + """选择 2 的幂次 KV 分区数,并保证每个分区只包含完整的 N tile。""" + if batch == 1 and kv_ctx in BATCH1_SPLITS: + return BATCH1_SPLITS[kv_ctx] + + # 保留通用回退,避免接口收到题面范围以外的规格时失效。 + # batch 越小,沿 KV 维切出的并行分区越多;batch 越大则减少分区合并开销。 + desired = max(1, (DEFAULT_TARGET_CTAS + batch - 1) // batch) + num_split = 1 + while num_split < desired: + num_split *= 2 + + # 主循环没有 tail mask,因此 split_len 必须是 BLOCK_N 的整数倍。 + while num_split > 1 and kv_ctx % (num_split * BLOCK_N) != 0: + num_split //= 2 + return num_split + + +@tilelang.jit(pass_configs={tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True}) +def flashattn_split( + batch, + heads, + kv_head_num, + seqlen_kv, + dim, + pe_dim, + block_n, + block_h, + num_split, + softmax_scale, +): + scale = float(softmax_scale * 1.44269504) + dtype = T.float16 + accum_dtype = T.float32 + kv_group_num = heads // kv_head_num + valid_block_h = min(block_h, kv_group_num) + assert kv_head_num == 1, "kv_head_num must be 1" + + @T.prim_func + def main( + Q: T.Tensor([batch, heads, dim], dtype), + Q_pe: T.Tensor([batch, heads, pe_dim], dtype), + KV: T.Tensor([batch, seqlen_kv, kv_head_num, dim], dtype), + K_pe: T.Tensor([batch, seqlen_kv, kv_head_num, pe_dim], dtype), + Output: T.Tensor([batch, heads, dim], dtype), + ): + # 每个 split 输出一个归一化的 partial output 和对应的 log-sum-exp。 + # LSE 工作区很小,使用 FP32 可降低长上下文跨分区合并的数值误差。 + glse = T.alloc_global([batch, heads, num_split], accum_dtype) + output_partial = T.alloc_global([batch, heads, num_split, dim], dtype) + + # 主 kernel 网格为 batch * head_group * num_split。 + # 当前 heads=BLOCK_H=16,因此 head_group=1,不会跨 CTA 重复读取同一段 KV。 + with T.Kernel( + batch, + heads // min(block_h, kv_group_num), + num_split, + threads=128, + ) as (bid, hid, split_id): + Q_shared = T.alloc_shared([block_h, dim], dtype) + S_shared = T.alloc_shared([block_h, block_n], dtype) + Q_pe_shared = T.alloc_shared([block_h, pe_dim], dtype) + KV_shared = T.alloc_shared([block_n, dim], dtype) + K_pe_shared = T.alloc_shared([block_n, pe_dim], dtype) + O_shared = T.alloc_shared([block_h, dim], dtype) + acc_s = T.alloc_fragment([block_h, block_n], accum_dtype) + acc_s_cast = T.alloc_fragment([block_h, block_n], dtype) + acc_o = T.alloc_fragment([block_h, dim], accum_dtype) + scores_max = T.alloc_fragment([block_h], accum_dtype) + scores_max_prev = T.alloc_fragment([block_h], accum_dtype) + scores_scale = T.alloc_fragment([block_h], accum_dtype) + scores_sum = T.alloc_fragment([block_h], accum_dtype) + logsum = T.alloc_fragment([block_h], accum_dtype) + cur_kv_head = hid // (kv_group_num // block_h) + + # Q/Q_PE 在整个 KV 分区循环中保持不变,只加载一次并供所有 tile 复用。 + T.use_swizzle(10) + T.copy( + Q[bid, hid * valid_block_h : (hid + 1) * valid_block_h, :], + Q_shared, + ) + T.copy( + Q_pe[bid, hid * valid_block_h : (hid + 1) * valid_block_h, :], + Q_pe_shared, + ) + T.fill(acc_o, 0) + T.fill(logsum, 0) + T.fill(scores_max, -T.infinity(accum_dtype)) + + split_len = seqlen_kv // num_split + loop_range = split_len // block_n + # num_stages=2 会把实际动态 shared 推高到 92,160 B,超过 C500 的 + # 65,536 B 上限,因此当前合法实现使用单缓冲串行流水。 + for k in T.Pipelined(loop_range, num_stages=0): + kv_start = split_len * split_id + k * block_n + kv_end = kv_start + block_n + T.copy(KV[bid, kv_start:kv_end, cur_kv_head, :], KV_shared) + T.copy(K_pe[bid, kv_start:kv_end, cur_kv_head, :], K_pe_shared) + + # score = q @ kv^T + q_pe @ k_pe^T,两次 MMA 累加到同一 FP32 fragment。 + T.clear(acc_s) + T.gemm( + Q_shared, + KV_shared, + acc_s, + transpose_B=True, + policy=T.GemmWarpPolicy.FullCol, + ) + T.gemm( + Q_pe_shared, + K_pe_shared, + acc_s, + transpose_B=True, + policy=T.GemmWarpPolicy.FullCol, + ) + + # 数值稳定的 online softmax:更新 running max,并把旧分母和旧输出 + # 重缩放到新的 running-max 基准下。 + T.copy(scores_max, scores_max_prev) + T.fill(scores_max, -T.infinity(accum_dtype)) + T.reduce_max(acc_s, scores_max, dim=1, clear=False) + for i in T.Parallel(block_h): + scores_max[i] = T.max(scores_max[i], scores_max_prev[i]) + scores_scale[i] = T.exp2( + scores_max_prev[i] * scale - scores_max[i] * scale + ) + for i, j in T.Parallel(block_h, block_n): + acc_s[i, j] = T.exp2( + acc_s[i, j] * scale - scores_max[i] * scale + ) + + T.reduce_sum(acc_s, scores_sum, dim=1) + # PV MMA 接收 FP16 概率,因此通过 shared 完成 FP32 -> FP16 转换。 + T.copy(acc_s, S_shared) + T.copy(S_shared, acc_s_cast) + for i in T.Parallel(block_h): + logsum[i] = logsum[i] * scores_scale[i] + scores_sum[i] + for i, j in T.Parallel(block_h, dim): + acc_o[i, j] *= scores_scale[i] + T.gemm( + acc_s_cast, + KV_shared, + acc_o, + policy=T.GemmWarpPolicy.FullCol, + ) + + # 先在每个 split 内归一化 partial output,再保存其 LSE 供第二个 kernel 合并。 + for i, j in T.Parallel(block_h, dim): + acc_o[i, j] /= logsum[i] + for i in T.Parallel(block_h): + logsum[i] = T.log2(logsum[i]) + scores_max[i] * scale + + T.copy( + logsum, + glse[ + bid, + hid * valid_block_h : (hid + 1) * valid_block_h, + split_id, + ], + ) + T.copy(acc_o, O_shared) + T.copy( + O_shared, + output_partial[ + bid, + hid * valid_block_h : (hid + 1) * valid_block_h, + split_id, + :, + ], + ) + + # 合并 kernel:用各 split 的 LSE 计算全局权重,再加权求和 partial output。 + # 每个 CTA 独占一个 (batch, head) 输出,不需要原子操作。 + with T.Kernel(heads, batch, threads=128) as (hid, bid): + partial = T.alloc_fragment([dim], dtype) + output_accum = T.alloc_fragment([dim], accum_dtype) + split_lse = T.alloc_var(accum_dtype) + merged_lse = T.alloc_var(accum_dtype) + max_lse = T.alloc_var(accum_dtype) + split_scale = T.alloc_var(accum_dtype) + + T.clear(merged_lse) + T.clear(output_accum) + max_lse = -T.infinity(accum_dtype) + + # 第一遍求最大 LSE,第二遍计算全局 log-sum-exp。 + for k in T.serial(num_split): + max_lse = T.max(max_lse, glse[bid, hid, k]) + for k in T.Pipelined(num_split, num_stages=1): + split_lse = glse[bid, hid, k] + merged_lse += T.exp2(split_lse - max_lse) + merged_lse = T.log2(merged_lse) + max_lse + + # 第三遍按照 exp2(split_lse - merged_lse) 合并各分区的归一化输出。 + for k in T.serial(num_split): + for i in T.Parallel(dim): + partial[i] = output_partial[bid, hid, k, i] + split_lse = glse[bid, hid, k] + split_scale = T.exp2(split_lse - merged_lse) + for i in T.Parallel(dim): + output_accum[i] += partial[i] * split_scale + + for i in T.Parallel(dim): + Output[bid, hid, i] = output_accum[i] + + return main + + +def _get_kernel(batch, heads, kv_heads, kv_ctx, dim, pe_dim): + num_split = _choose_num_split(batch, kv_ctx) + softmax_scale = (dim + pe_dim) ** -0.5 + # shape、tile 和 split 都属于编译期常量,必须共同进入缓存键。 + key = ( + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, + BLOCK_N, + BLOCK_H, + num_split, + ) + kernel = _KERNEL_CACHE.get(key) + if kernel is None: + # 每种静态规格只 JIT 一次,后续 warmup/计时直接复用已编译 kernel。 + kernel = flashattn_split( + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, + BLOCK_N, + BLOCK_H, + num_split, + softmax_scale, + ) + _KERNEL_CACHE[key] = kernel + return kernel + + +def run_kernel( + q, + q_pe, + kv, + k_pe, + output, + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, +): + kernel = _get_kernel( + int(batch), + int(heads), + int(kv_heads), + int(kv_ctx), + int(dim), + int(pe_dim), + ) + kernel(q, q_pe, kv, k_pe, output) diff --git a/race_tests/mla/tilelang/test_candidate.py b/race_tests/mla/tilelang/test_candidate.py new file mode 100644 index 0000000..e4e4b60 --- /dev/null +++ b/race_tests/mla/tilelang/test_candidate.py @@ -0,0 +1,118 @@ +import argparse +import importlib.util +import math + +import torch + + +def load_candidate(path): + spec = importlib.util.spec_from_file_location("mla_candidate", path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def reference(q, q_pe, kv, k_pe): + query = torch.cat((q.float(), q_pe.float()), dim=-1) + key = torch.cat((kv[:, :, 0, :].float(), k_pe[:, :, 0, :].float()), dim=-1) + scores = torch.einsum("bhd,bsd->bhs", query, key) / math.sqrt(576.0) + probs = torch.softmax(scores, dim=-1) + return torch.einsum("bhs,bsd->bhd", probs, kv[:, :, 0, :].float()) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("candidate") + parser.add_argument("--batch", type=int, default=1) + parser.add_argument("--kv-ctx", type=int, default=2048) + parser.add_argument("--warmup", type=int, default=20) + parser.add_argument("--iters", type=int, default=100) + parser.add_argument("--target-ctas", type=int, default=None) + args = parser.parse_args() + + heads = 16 + kv_heads = 1 + dim = 512 + pe_dim = 64 + device = "cuda" + dtype = torch.float16 + + q = torch.randn(args.batch, heads, dim, device=device, dtype=dtype) + q_pe = torch.randn(args.batch, heads, pe_dim, device=device, dtype=dtype) + kv = torch.randn(args.batch, args.kv_ctx, kv_heads, dim, device=device, dtype=dtype) + k_pe = torch.randn( + args.batch, args.kv_ctx, kv_heads, pe_dim, device=device, dtype=dtype + ) + output = torch.empty(args.batch, heads, dim, device=device, dtype=dtype) + + candidate = load_candidate(args.candidate) + if args.target_ctas is not None and hasattr(candidate, "TARGET_CTAS"): + candidate.TARGET_CTAS = args.target_ctas + candidate.run_kernel( + q, + q_pe, + kv, + k_pe, + output, + args.batch, + heads, + kv_heads, + args.kv_ctx, + dim, + pe_dim, + ) + torch.cuda.synchronize() + + expected = reference(q, q_pe, kv, k_pe).to(dtype) + diff = (output - expected).abs() + close = torch.allclose(output, expected, rtol=2e-3, atol=2e-3) + print( + f"correct={close} max_abs={diff.max().item():.7f} " + f"mean_abs={diff.mean().item():.7f} " + f"num_split={candidate._choose_num_split(args.batch, args.kv_ctx)}" + ) + if not close: + raise AssertionError("candidate output does not satisfy OJ tolerance") + + for _ in range(args.warmup): + candidate.run_kernel( + q, + q_pe, + kv, + k_pe, + output, + args.batch, + heads, + kv_heads, + args.kv_ctx, + dim, + pe_dim, + ) + torch.cuda.synchronize() + + start = torch.cuda.Event(enable_timing=True) + end = torch.cuda.Event(enable_timing=True) + start.record() + for _ in range(args.iters): + candidate.run_kernel( + q, + q_pe, + kv, + k_pe, + output, + args.batch, + heads, + kv_heads, + args.kv_ctx, + dim, + pe_dim, + ) + end.record() + torch.cuda.synchronize() + latency_ms = start.elapsed_time(end) / args.iters + flops = 2 * args.batch * heads * args.kv_ctx * (dim + pe_dim + dim) + print(f"latency={latency_ms:.6f} ms tflops={flops / latency_ms * 1e-9:.6f}") + + +if __name__ == "__main__": + main() diff --git a/race_tests/mla/赛题一mla教程.md b/race_tests/mla/赛题一mla教程.md new file mode 100644 index 0000000..31dc386 --- /dev/null +++ b/race_tests/mla/赛题一mla教程.md @@ -0,0 +1,361 @@ +# DeepSeek MLA Decode 提交说明 + +## 当前结果 + +| Status | Score | Time | Memory | Platform | +| --- | ---: | ---: | ---: | --- | +| Accepted | 49.5 | 23 ms | 22.2 G | TileLang Maca C500 / 10.1 K | + +得分说明: + +- 50 分左右基本对应和题目 baseline 的加速比约为 `1:1`。 +- 当前 `49.5` 可以理解为 baseline 档位附近的 Accepted 结果。 +- 该结果主要用于确认提交接口、TileLang kernel 调用和输出正确性已经跑通。 +- 本文档只记录提交模板、改算子位置和当前结果,不展开进一步算子优化。 + +## 提交文件 + +提交文件为: + +```text +race_tests/mla/submission.py +``` + +评测只要求 Python 文件中暴露 `run_kernel` 函数,函数名、参数顺序必须和题目一致: + +```python +def run_kernel( + q, + q_pe, + kv, + k_pe, + output, + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, +): + ... +``` + +提交时使用 `submission.py` 的内容即可,不需要提交 benchmark、reference 或测试脚本。 + +## 算子来源 + +当前提交模板基于 `race_tests/mla/test_tilelang_mla.py` 中的 `flashattn` 算子封装而来。 + +题目计算语义为: + +```text +score = (q @ kv^T + q_pe @ k_pe^T) / sqrt(576) +attention = softmax(score, dim=-1) +output = attention @ kv +``` + +固定约束: + +```text +dim = 512 +pe_dim = 64 +kv_heads = 1 +heads = 16 +``` + +## 模板结构 + +`submission.py` 里主要有三部分: + +```text +flashattn(...) TileLang MLA kernel +_get_kernel(...) 按 shape 缓存编译后的 kernel +run_kernel(...) OJ 调用入口,写入 output +``` + +`run_kernel` 不做同步,不分配最终输出,只负责取得缓存 kernel 并调用: + +```python +kernel = _get_kernel(...) +kernel(q, q_pe, kv, k_pe, output) +``` + +## 改算子的位置 + +只改 MLA 算子时,主要看两个位置: + +```text +race_tests/mla/submission.py +``` + +1. `flashattn(...)` + - TileLang kernel 主体。 + - QK、QK_pe、online softmax、PV 都在这里。 + +2. `_get_kernel(...)` + - 设置 `block_n`、`block_h`、`num_split`。 + - 控制不同 shape 的 kernel 缓存 key。 + +一般不要改 `run_kernel` 的函数签名;评测器按固定签名调用。 + +## 完整算子代码 + +下面是当前 `race_tests/mla/submission.py` 的完整提交代码: + +```python +import tilelang +import tilelang.language as T + + +@tilelang.jit(pass_configs={tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True}) +def flashattn(batch, heads, kv_head_num, seqlen_kv, dim, pe_dim, block_N, block_H, num_split, softmax_scale): + scale = float(softmax_scale * 1.44269504) + dtype = T.float16 + accum_dtype = T.float32 + kv_group_num = heads // kv_head_num + valid_block_h = min(block_H, kv_group_num) + assert kv_head_num == 1, "kv_head_num must be 1" + + @T.prim_func + def main_split( + Q: T.Tensor([batch, heads, dim], dtype), + Q_pe: T.Tensor([batch, heads, pe_dim], dtype), + KV: T.Tensor([batch, seqlen_kv, kv_head_num, dim], dtype), + K_pe: T.Tensor([batch, seqlen_kv, kv_head_num, pe_dim], dtype), + Output: T.Tensor([batch, heads, dim], dtype), + ): + glse = T.alloc_global([batch, heads, num_split], dtype) + output_partial = T.alloc_global([batch, heads, num_split, dim], dtype) + + with T.Kernel(batch, heads // min(block_H, kv_group_num), num_split, threads=256) as (bid, hid, bz): + Q_shared = T.alloc_shared([block_H, dim], dtype) + S_shared = T.alloc_shared([block_H, block_N], dtype) + Q_pe_shared = T.alloc_shared([block_H, pe_dim], dtype) + KV_shared = T.alloc_shared([block_N, dim], dtype) + K_pe_shared = T.alloc_shared([block_N, pe_dim], dtype) + O_shared = T.alloc_shared([block_H, dim], dtype) + acc_s = T.alloc_fragment([block_H, block_N], accum_dtype) + acc_s_cast = T.alloc_fragment([block_H, block_N], dtype) + acc_o = T.alloc_fragment([block_H, dim], accum_dtype) + scores_max = T.alloc_fragment([block_H], accum_dtype) + scores_max_prev = T.alloc_fragment([block_H], accum_dtype) + scores_scale = T.alloc_fragment([block_H], accum_dtype) + scores_sum = T.alloc_fragment([block_H], accum_dtype) + logsum = T.alloc_fragment([block_H], accum_dtype) + cur_kv_head = hid // (kv_group_num // block_H) + + T.use_swizzle(10) + T.copy(Q[bid, hid * valid_block_h : (hid + 1) * valid_block_h, :], Q_shared) + T.copy(Q_pe[bid, hid * valid_block_h : (hid + 1) * valid_block_h, :], Q_pe_shared) + T.fill(acc_o, 0) + T.fill(logsum, 0) + T.fill(scores_max, -T.infinity(accum_dtype)) + + loop_range = T.ceildiv(seqlen_kv // num_split, block_N) + for k in T.Pipelined(loop_range, num_stages=2): + kv_start = (seqlen_kv // num_split) * bz + k * block_N + kv_end = (seqlen_kv // num_split) * bz + (k + 1) * block_N + T.copy(KV[bid, kv_start:kv_end, cur_kv_head, :], KV_shared) + T.copy(K_pe[bid, kv_start:kv_end, cur_kv_head, :], K_pe_shared) + + T.clear(acc_s) + T.gemm(Q_shared, KV_shared, acc_s, transpose_B=True, policy=T.GemmWarpPolicy.FullCol) + T.gemm(Q_pe_shared, K_pe_shared, acc_s, transpose_B=True, policy=T.GemmWarpPolicy.FullCol) + + T.copy(scores_max, scores_max_prev) + T.fill(scores_max, -T.infinity(accum_dtype)) + T.reduce_max(acc_s, scores_max, dim=1, clear=False) + for i in T.Parallel(block_H): + scores_max[i] = T.max(scores_max[i], scores_max_prev[i]) + for i in T.Parallel(block_H): + scores_scale[i] = T.exp2(scores_max_prev[i] * scale - scores_max[i] * scale) + for i, j in T.Parallel(block_H, block_N): + acc_s[i, j] = T.exp2(acc_s[i, j] * scale - scores_max[i] * scale) + + T.reduce_sum(acc_s, scores_sum, dim=1) + T.copy(acc_s, S_shared) + T.copy(S_shared, acc_s_cast) + for i in T.Parallel(block_H): + logsum[i] = logsum[i] * scores_scale[i] + scores_sum[i] + for i, j in T.Parallel(block_H, dim): + acc_o[i, j] *= scores_scale[i] + T.gemm(acc_s_cast, KV_shared, acc_o, policy=T.GemmWarpPolicy.FullCol) + + for i, j in T.Parallel(block_H, dim): + acc_o[i, j] /= logsum[i] + for i in T.Parallel(block_H): + logsum[i] = T.log2(logsum[i]) + scores_max[i] * scale + + T.copy(logsum, glse[bid, hid * valid_block_h : (hid + 1) * valid_block_h, bz]) + T.copy(acc_o, O_shared) + T.copy(O_shared, output_partial[bid, hid * valid_block_h : (hid + 1) * valid_block_h, bz, :]) + + with T.Kernel(heads, batch, threads=128) as (hid, bz): + po_local = T.alloc_fragment([dim], dtype) + o_accum_local = T.alloc_fragment([dim], accum_dtype) + lse_local_split = T.alloc_var(accum_dtype) + lse_logsum_local = T.alloc_var(accum_dtype) + lse_max_local = T.alloc_var(accum_dtype) + scale_local = T.alloc_var(accum_dtype) + + T.clear(lse_logsum_local) + T.clear(o_accum_local) + lse_max_local = -T.infinity(accum_dtype) + + for k in T.serial(num_split): + lse_max_local = T.max(lse_max_local, glse[bz, hid, k]) + for k in T.Pipelined(num_split, num_stages=1): + lse_local_split = glse[bz, hid, k] + lse_logsum_local += T.exp2(lse_local_split - lse_max_local) + lse_logsum_local = T.log2(lse_logsum_local) + lse_max_local + + for k in T.serial(num_split): + for i in T.Parallel(dim): + po_local[i] = output_partial[bz, hid, k, i] + lse_local_split = glse[bz, hid, k] + scale_local = T.exp2(lse_local_split - lse_logsum_local) + for i in T.Parallel(dim): + o_accum_local[i] += po_local[i] * scale_local + + for i in T.Parallel(dim): + Output[bz, hid, i] = o_accum_local[i] + + @T.prim_func + def main_no_split( + Q: T.Tensor([batch, heads, dim], dtype), + Q_pe: T.Tensor([batch, heads, pe_dim], dtype), + KV: T.Tensor([batch, seqlen_kv, kv_head_num, dim], dtype), + K_pe: T.Tensor([batch, seqlen_kv, kv_head_num, pe_dim], dtype), + Output: T.Tensor([batch, heads, dim], dtype), + ): + with T.Kernel(heads // min(block_H, kv_group_num), batch, threads=128) as (hid, bid): + Q_shared = T.alloc_shared([block_H, dim], dtype) + S_shared = T.alloc_shared([block_H, block_N], dtype) + Q_pe_shared = T.alloc_shared([block_H, pe_dim], dtype) + KV_shared = T.alloc_shared([block_N, dim], dtype) + K_pe_shared = T.alloc_shared([block_N, pe_dim], dtype) + O_shared = T.alloc_shared([block_H, dim], dtype) + acc_s = T.alloc_fragment([block_H, block_N], accum_dtype) + acc_o = T.alloc_fragment([block_H, dim], accum_dtype) + scores_max = T.alloc_fragment([block_H], accum_dtype) + scores_max_prev = T.alloc_fragment([block_H], accum_dtype) + scores_scale = T.alloc_fragment([block_H], accum_dtype) + scores_sum = T.alloc_fragment([block_H], accum_dtype) + logsum = T.alloc_fragment([block_H], accum_dtype) + cur_kv_head = hid // (kv_group_num // block_H) + + T.copy(Q[bid, hid * valid_block_h : (hid + 1) * valid_block_h, :], Q_shared) + T.copy(Q_pe[bid, hid * valid_block_h : (hid + 1) * valid_block_h, :], Q_pe_shared) + T.fill(acc_o, 0) + T.fill(logsum, 0) + T.fill(scores_max, -T.infinity(accum_dtype)) + + loop_range = T.ceildiv(seqlen_kv, block_N) + for k in T.Pipelined(loop_range, num_stages=0): + T.copy(KV[bid, k * block_N : (k + 1) * block_N, cur_kv_head, :], KV_shared) + T.copy(K_pe[bid, k * block_N : (k + 1) * block_N, cur_kv_head, :], K_pe_shared) + T.gemm( + Q_shared, + KV_shared, + acc_s, + transpose_B=True, + policy=T.GemmWarpPolicy.FullCol, + clear_accum=True, + ) + T.gemm(Q_pe_shared, K_pe_shared, acc_s, transpose_B=True, policy=T.GemmWarpPolicy.FullCol) + + T.copy(scores_max, scores_max_prev) + T.fill(scores_max, -T.infinity(accum_dtype)) + T.reduce_max(acc_s, scores_max, dim=1, clear=False) + for i in T.Parallel(block_H): + scores_max[i] = T.max(scores_max[i], scores_max_prev[i]) + for i in T.Parallel(block_H): + scores_scale[i] = T.exp2(scores_max_prev[i] * scale - scores_max[i] * scale) + for i, j in T.Parallel(block_H, block_N): + acc_s[i, j] = T.exp2(acc_s[i, j] * scale - scores_max[i] * scale) + + T.reduce_sum(acc_s, scores_sum, dim=1) + T.copy(acc_s, S_shared) + for i in T.Parallel(block_H): + logsum[i] = logsum[i] * scores_scale[i] + scores_sum[i] + for i, j in T.Parallel(block_H, dim): + acc_o[i, j] *= scores_scale[i] + T.gemm(S_shared, KV_shared, acc_o, policy=T.GemmWarpPolicy.FullCol) + + for i, j in T.Parallel(block_H, dim): + acc_o[i, j] /= logsum[i] + T.copy(acc_o, O_shared) + T.copy(O_shared, Output[bid, hid * valid_block_h : (hid + 1) * valid_block_h, :]) + + if num_split > 1: + return main_split + return main_no_split + + +_KERNEL_CACHE = {} + + +def _get_kernel(batch, heads, kv_heads, kv_ctx, dim, pe_dim): + block_n = 32 + block_h = min(16, heads // kv_heads) + num_split = 1 + softmax_scale = (dim + pe_dim) ** -0.5 + key = (batch, heads, kv_heads, kv_ctx, dim, pe_dim, block_n, block_h, num_split) + kernel = _KERNEL_CACHE.get(key) + if kernel is None: + kernel = flashattn(batch, heads, kv_heads, kv_ctx, dim, pe_dim, block_n, block_h, num_split, softmax_scale) + _KERNEL_CACHE[key] = kernel + return kernel + + +def run_kernel( + q, + q_pe, + kv, + k_pe, + output, + batch, + heads, + kv_heads, + kv_ctx, + dim, + pe_dim, +): + kernel = _get_kernel(int(batch), int(heads), int(kv_heads), int(kv_ctx), int(dim), int(pe_dim)) + kernel(q, q_pe, kv, k_pe, output) +``` + +## 本地验证 + +本地验证时需要使用已经编译好的 TileLang,并把仓库根目录和 TVM Python 路径加入 `PYTHONPATH`。 + +在仓库根目录执行: + +```bash +TILELANG_CACHE_DIR=/tmp/tilelang-cache \ +MACA_PATH=${MACA_PATH:-/opt/maca} \ +LD_LIBRARY_PATH="$(pwd)/build/lib:${MACA_PATH:-/opt/maca}/lib:${MACA_PATH:-/opt/maca}/mxgpu_llvm/lib:${LD_LIBRARY_PATH}" \ +PATH="${MACA_PATH:-/opt/maca}/bin:${MACA_PATH:-/opt/maca}/mxgpu_llvm/bin:${PATH}" \ +PYTHONPATH="$(pwd):$(pwd)/3rdparty/tvm/python:$(pwd)/race_tests/mla:${PYTHONPATH}" \ +python race_tests/mla/test_tilelang_mla.py \ + --no-json \ + --batch 1 \ + --heads 16 \ + --kv_heads 1 \ + --kv_ctx 2048 \ + --dim 512 \ + --pe_dim 64 +``` + +已用 `submission.run_kernel` 验证过: + +```text +kv_ctx=2048 allclose True +kv_ctx=8192 allclose True +``` + +## 注意事项 + +- `run_kernel` 内不要调用 `torch.cuda.synchronize()`。 +- `output` 是评测器传入的缓冲区,必须原地写入。 +- 当前文档只说明提交模板和改算子入口,不涉及进一步算子优化。 diff --git a/race_tests/moe/README.md b/race_tests/moe/README.md new file mode 100644 index 0000000..e256bb5 --- /dev/null +++ b/race_tests/moe/README.md @@ -0,0 +1,38 @@ +# 使用说明 + + +## 1. 文件定位 + +`custom_fusedmoe.py` 作为对外暴露的 MoE fused kernel 接入文件。 + +调用和改写: + +1. `RoutedMoEKernel` 的初始化和__call__接口固定; +2. 内部实现可重写调整。 + +## 2. 使用 +如下命令可以自动跑功能和性能测试,结果输出在终端 +```bash +python fusedmoe_benchmark.py +``` +或者 +```bash +bash run.sh +``` +## 3. 测试用例 +可以在`moe_test_config.json`中直接添加测试case,目前有性能和功能各两个 +当前默认:input float16, output float32 + +功能测试正确输出 +```bash +✅ Functional test passed for config: +``` +功能测试错误输出 +```bash +❌ Functional test failed for config: +``` + +## 3. 需安装 +torch \ +tilelang \ +apache-tvm-ffi \ No newline at end of file diff --git a/race_tests/moe/custom_fusedmoe.py b/race_tests/moe/custom_fusedmoe.py new file mode 100644 index 0000000..cb3b860 --- /dev/null +++ b/race_tests/moe/custom_fusedmoe.py @@ -0,0 +1,211 @@ +import math +import torch +import torch.nn as nn +from typing import Dict, Tuple, Optional +import tilelang +import tilelang.language as T +from tilelang.autotuner import * + + +@tilelang.jit(pass_configs={tilelang.PassConfigKey.TL_DISABLE_WARP_SPECIALIZED: True}) +def moe_forward_tilelang_routed( + d_hidden, + d_expert, + n_routed_experts, + group_sum, + group_count, + block_token=128, + block_dhidden=128, + block_dexpert=128, + threads=256, + num_stages=1, +): + scale = 1.44269504 # log2(e) + dtype = T.float16 + + # Parameters + dhidden = d_hidden + dexpert = d_expert + n_routed_experts = n_routed_experts + + M = math.ceil(group_sum / block_token) + group_count + accum_dtype = T.float32 + + input_shape = (group_sum, dhidden) + intermediate_shape = (group_sum, dexpert) + routed_expert_gate_shape = (n_routed_experts, dexpert, dhidden) + routed_expert_up_shape = (n_routed_experts, dexpert, dhidden) + routed_expert_down_shape = (n_routed_experts, dhidden, dexpert) + routed_expert_weights_shape = group_sum + group_sizes_shape = n_routed_experts + + @T.prim_func + def kernel( + input: T.Tensor(input_shape, dtype), # type: ignore + routed_expert_gate: T.Tensor(routed_expert_gate_shape, dtype), # type: ignore + routed_expert_up: T.Tensor(routed_expert_up_shape, dtype), # type: ignore + routed_expert_down: T.Tensor(routed_expert_down_shape, dtype), # type: ignore + routed_expert_weights: T.Tensor(routed_expert_weights_shape, dtype), # type: ignore + group_sizes: T.Tensor(group_sizes_shape, T.int32), # type: ignore + group_offsets: T.Tensor(group_sizes_shape, T.int32), # type: ignore + group_padded_offsets: T.Tensor(group_sizes_shape, T.int32), # type: ignore + group_idx_for_bx: T.Tensor((M,), T.int32), # type: ignore + up_logits: T.Tensor(intermediate_shape, dtype), # type: ignore + output: T.Tensor(input_shape, dtype), # type: ignore + ): + # Step 1: Compute gate and up logits + with T.Kernel(M, T.ceildiv(dexpert, block_dexpert), threads=threads) as (bx, by): + input_shared = T.alloc_fragment((block_token, block_dhidden), dtype=dtype) + routed_expert_gate_shared = T.alloc_shared((block_dexpert, block_dhidden), dtype=dtype) + routed_expert_up_shared = T.alloc_shared((block_dexpert, block_dhidden), dtype=dtype) + + gate_logits_local = T.alloc_fragment((block_token, block_dexpert), dtype=accum_dtype) + up_logits_local = T.alloc_fragment((block_token, block_dexpert), dtype=accum_dtype) + + T.use_swizzle(10) + + m_start_padded = bx * block_token + + cur_group_idx = group_idx_for_bx[bx] + + cur_group_size = group_sizes[cur_group_idx] + m_start = m_start_padded - group_padded_offsets[cur_group_idx] + group_offsets[cur_group_idx] + actual_rows = T.max(0, T.min(block_token, cur_group_size - (m_start_padded - group_padded_offsets[cur_group_idx]))) + + T.clear(gate_logits_local) + T.clear(up_logits_local) + + for k in T.Pipelined(T.ceildiv(dhidden, block_dhidden), num_stages=num_stages): + T.copy( + input[m_start : m_start + block_token, k * block_dhidden : (k + 1) * block_dhidden], + input_shared, + ) + T.copy( + routed_expert_gate[ + cur_group_idx, by * block_dexpert : (by + 1) * block_dexpert, k * block_dhidden : (k + 1) * block_dhidden + ], + routed_expert_gate_shared, + ) + T.gemm(input_shared, routed_expert_gate_shared, gate_logits_local, transpose_B=True) + T.copy( + routed_expert_up[ + cur_group_idx, by * block_dexpert : (by + 1) * block_dexpert, k * block_dhidden : (k + 1) * block_dhidden + ], + routed_expert_up_shared, + ) + T.gemm(input_shared, routed_expert_up_shared, up_logits_local, transpose_B=True) + + for i, j in T.Parallel(block_token, block_dexpert): + gate_logits_local[i, j] = gate_logits_local[i, j] * (1.0 / (1.0 + T.exp2(-gate_logits_local[i, j] * scale))) + up_logits_local[i, j] = up_logits_local[i, j] * gate_logits_local[i, j] + + for i, j in T.Parallel(block_token, block_dexpert): + if i < actual_rows: + up_logits[m_start + i, by * block_dexpert + j] = up_logits_local[i, j] + + # Step 2: Compute down logits + with T.Kernel(M, T.ceildiv(dhidden, block_dhidden), threads=threads) as (bx, by): + up_logits_shared = T.alloc_fragment((block_token, block_dexpert), dtype=dtype) + routed_expert_down_shared = T.alloc_shared((block_dhidden, block_dexpert), dtype=dtype) + output_local = T.alloc_fragment((block_token, block_dhidden), dtype=accum_dtype) + + T.use_swizzle(10) + + m_start_padded = bx * block_token + + cur_group_idx = group_idx_for_bx[bx] + + cur_group_size = group_sizes[cur_group_idx] + m_start = m_start_padded - group_padded_offsets[cur_group_idx] + group_offsets[cur_group_idx] + actual_rows = T.max(0, T.min(block_token, cur_group_size - (m_start_padded - group_padded_offsets[cur_group_idx]))) + + T.clear(output_local) + + for k in T.Pipelined(T.ceildiv(dexpert, block_dexpert), num_stages=num_stages): + T.copy( + up_logits[m_start : m_start + block_token, k * block_dexpert : (k + 1) * block_dexpert], + up_logits_shared, + ) + T.copy( + routed_expert_down[ + cur_group_idx, by * block_dhidden : (by + 1) * block_dhidden, k * block_dexpert : (k + 1) * block_dexpert + ], + routed_expert_down_shared, + ) + T.gemm(up_logits_shared, routed_expert_down_shared, output_local, transpose_B=True) + + for i, j in T.Parallel(block_token, block_dhidden): + if i < actual_rows: + output[m_start + i, by * block_dhidden + j] = output_local[i, j] * routed_expert_weights[m_start + i] + + return kernel + + +class RoutedMoEKernel: + + def __init__( + self, + d_hidden: int, + d_expert: int, + n_routed_experts: int, + group_sum: int, + group_count: int, + block_token: int = 128, + block_dhidden: int = 128, + block_dexpert: int = 128, + threads: int = 256, + num_stages: int = 1, + backend: str = "tilelang", + ): + self.d_hidden = d_hidden + self.d_expert = d_expert + self.n_routed_experts = n_routed_experts + self.group_sum = group_sum + self.group_count = group_count + self.block_token = block_token + self.block_dhidden = block_dhidden + self.block_dexpert = block_dexpert + self.threads = threads + self.num_stages = num_stages + self.backend = backend + + self.impl = moe_forward_tilelang_routed( + d_hidden=d_hidden, + d_expert=d_expert, + n_routed_experts=n_routed_experts, + group_sum=group_sum, + group_count=group_count, + block_token=block_token, + block_dhidden=block_dhidden, + block_dexpert=block_dexpert, + threads=threads, + num_stages=num_stages, + ) + + def __call__( + self, + input, + routed_expert_gate, + routed_expert_up, + routed_expert_down, + routed_expert_weights, + group_sizes, + group_offsets, + group_padded_offsets, + group_idx_for_bx, + up_logits, + output, + ): + return self.impl( + input, + routed_expert_gate, + routed_expert_up, + routed_expert_down, + routed_expert_weights, + group_sizes, + group_offsets, + group_padded_offsets, + group_idx_for_bx, + up_logits, + output, + ) \ No newline at end of file diff --git a/race_tests/moe/fusedmoe_benchmark.py b/race_tests/moe/fusedmoe_benchmark.py new file mode 100644 index 0000000..0997334 --- /dev/null +++ b/race_tests/moe/fusedmoe_benchmark.py @@ -0,0 +1,353 @@ +import math +import torch +import torch.nn as nn +from torch.profiler import profile, record_function, ProfilerActivity +import json +from typing import Dict, Tuple, Optional +import tilelang +import tilelang.language as T +from tilelang.autotuner import * +from custom_fusedmoe import RoutedMoEKernel +from ref_fusedmoe import ref_kernel + + +class Expert(nn.Module): + def __init__(self, config: Dict, gate: torch.Tensor, up: torch.Tensor, down: torch.Tensor, d_expert: Optional[int] = None): + super().__init__() + self.config = config + self.act_fn = nn.SiLU() + self.d_hidden: int = config["d_hidden"] + self.d_expert: int = config["d_expert"] if d_expert is None else d_expert + self.device = torch.device("cuda") + + self.W_gate_weight = gate.t().contiguous().to(self.device) + self.W_up_weight = up.t().contiguous().to(self.device) + self.W_down_weight = down.t().contiguous().to(self.device) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + gate = self.act_fn(x @ self.W_gate_weight) + out = (gate * (x @ self.W_up_weight)) @ self.W_down_weight + return out + +class MoEGate(nn.Module): + def __init__(self, config: Dict, weights: Dict): + super().__init__() + self.top_k: int = config["n_experts_per_token"] + self.num_experts: int = config["n_routed_experts"] + self.d_hidden: int = config["d_hidden"] + + self.W_g_weight = weights["router.weight"].t() + + def forward(self, x: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: + logits = x @ self.W_g_weight + scores = logits.softmax(dim=-1) + topk_scores, topk_indices = torch.topk(scores, k=self.top_k, dim=-1, sorted=False) + + return topk_indices, topk_scores + +class MoE(nn.Module): + def __init__( + self, config: Dict, routed_kernel, weights: Dict, padding_M: int = 128 + ): + super().__init__() + self.config = config + self.routed_kernel = routed_kernel + self.padding_M = padding_M + self.experts = nn.ModuleList( + [ + Expert( + config, + gate=weights[f"experts.{i}.0.weight"], + up=weights[f"experts.{i}.1.weight"], + down=weights[f"experts.{i}.2.weight"], + ) + for i in range(config["n_routed_experts"]) + ] + ) + self.device = torch.device("cuda") + self.gating_network = MoEGate(config, weights).to(self.device) + + self.expert_cache = torch.zeros( + (config["batch_size"] * config["seq_len"], config["d_hidden"]), dtype=torch.float16, device=self.device + ) + self.stacked_expert_w_gate = torch.stack([expert.W_gate_weight for expert in self.experts], dim=0) + self.stacked_expert_w_up = torch.stack([expert.W_up_weight for expert in self.experts], dim=0) + self.stacked_expert_w_down = torch.stack([expert.W_down_weight for expert in self.experts], dim=0) + self.stacked_expert_tokens = torch.empty( + (config["batch_size"] * config["seq_len"] * config["n_experts_per_token"], self.config["d_hidden"]), + dtype=torch.float16, + device=self.device, + ) + self.stacked_expert_weights = torch.empty( + (config["batch_size"] * config["seq_len"] * config["n_experts_per_token"]), dtype=torch.float16, device=self.device + ) + self.stacked_expert_tokens_idxs = torch.empty( + (config["batch_size"] * config["seq_len"] * config["n_experts_per_token"]), dtype=torch.int64, device=self.device + ) + + self.up_logits_routed = torch.empty( + (config["batch_size"] * config["seq_len"] * config["n_experts_per_token"], self.config["d_expert"]), + dtype=torch.float16, + device=self.device, + ) + self.expert_output_routed = torch.empty( + (config["batch_size"] * config["seq_len"] * config["n_experts_per_token"], self.config["d_hidden"]), + dtype=torch.float16, + device=self.device, + ) + + @torch.no_grad() + def forward(self, x: torch.Tensor) -> torch.Tensor: + orig_shape = x.shape + batch_size, seq_len, hidden_dim = x.shape + expert_indices, expert_scores = self.gating_network(x) + flat_expert_indices = expert_indices.view(-1) + flat_expert_weights = expert_scores.view(-1) + x_flat = x.view(-1, hidden_dim) + + # Prepare for grouped GEMM + idxs = flat_expert_indices.argsort() + counts = flat_expert_indices.bincount().cpu().numpy() + # counts = flat_expert_indices.bincount() + tokens_per_expert = counts.cumsum() + # tokens_per_expert = torch.cumsum(counts, dim=0) + num_per_tok = self.config["n_experts_per_token"] + token_idxs = idxs // num_per_tok + + # Get stacked expert tokens and expert weights + + for expert_id, end_idx in enumerate(tokens_per_expert): + start_idx = 0 if expert_id == 0 else tokens_per_expert[expert_id - 1] + if start_idx == end_idx: + continue + + exp_token_idxs = token_idxs[start_idx:end_idx] + expert_tokens = x_flat[exp_token_idxs] + + self.stacked_expert_tokens[start_idx:end_idx] = expert_tokens + self.stacked_expert_tokens_idxs[start_idx:end_idx] = exp_token_idxs + self.stacked_expert_weights[start_idx:end_idx] = flat_expert_weights[idxs[start_idx:end_idx]] + + group_sizes = torch.tensor(counts, dtype=torch.int32, device=self.device) + group_offset = torch.tensor(tokens_per_expert - counts, dtype=torch.int32, device=self.device) + + group_padded_offsets = [0 for _ in range(len(group_sizes))] + for i in range(1, len(group_sizes)): + group_padded_offsets[i] = group_padded_offsets[i - 1] + math.ceil((counts[i - 1] + 1) / self.padding_M) * self.padding_M + + block_token = 128 + M = ( + math.ceil(self.config["batch_size"] * self.config["seq_len"] * self.config["n_experts_per_token"] / block_token) + + self.config["n_routed_experts"] + ) + group_idx_for_bx = [0 for _ in range(M)] + + for bx in range(M): + m_start_padded = bx * block_token + for i in range(self.config["n_routed_experts"]): + if m_start_padded >= group_padded_offsets[i]: + group_idx_for_bx[bx] = i + + group_padded_offsets = torch.tensor(group_padded_offsets, dtype=torch.int32, device=self.device) + group_idx_for_bx = torch.tensor(group_idx_for_bx, dtype=torch.int32, device=self.device) + + routed_stream = torch.cuda.default_stream() + torch.cuda.synchronize() + + with torch.cuda.stream(routed_stream): + # Tilelang version: Grouped GEMM + self.routed_kernel( + self.stacked_expert_tokens, + self.stacked_expert_w_gate, + self.stacked_expert_w_up, + self.stacked_expert_w_down, + self.stacked_expert_weights, + group_sizes, + group_offset, + group_padded_offsets, + group_idx_for_bx, + self.up_logits_routed, + self.expert_output_routed, + ) + + # Scatter reduce + self.expert_cache = torch.scatter_reduce( + self.expert_cache, + 0, + self.stacked_expert_tokens_idxs.view(-1, 1).repeat(1, x_flat.shape[-1]), + self.expert_output_routed, + reduce="sum", + ) + routed_output = self.expert_cache.view(*orig_shape) + + + torch.cuda.synchronize() + + return routed_output + + +def custom_kernel(data: Tuple[torch.Tensor, Dict, Dict]) -> torch.Tensor: + """ + DeepSeek-style Mixture of Experts using Tilelang. + + Args: + data: Tuple of (input: torch.Tensor, weights: Dict[str, torch.Tensor], config: Dict) + - input: Input tensor of shape [batch_size, seq_len, hidden_size] + - weights: Dictionary containing model weights + - config: Dictionary containing model configuration parameters + + Returns: + Tuple containing: + - output: Processed tensor [batch_size, seq_len, d_model] + """ + input_tensor, weights, config = data + + routed_kernel = RoutedMoEKernel( + config["d_hidden"], + config["d_expert"], + config["n_routed_experts"], + group_sum=config["batch_size"] * config["seq_len"] * config["n_experts_per_token"], + group_count=config["n_routed_experts"] + ) + + moe = MoE(config, routed_kernel, weights, padding_M=128) + + output = moe(input_tensor) + + return output + + +def generate_input( + dhidden: int, dexpert: int, nroutedexperts: int, nexpertspertoken: int, bs: int, seqlen: int, seed: int +) -> Tuple[torch.Tensor, Dict, Dict]: + # Really dumb but for now _ isn't parsing correctly. + d_hidden = dhidden + d_expert = dexpert + n_routed_experts = nroutedexperts + n_experts_per_token = nexpertspertoken + batch_size = bs + seq_len = seqlen + + config = { + "d_hidden": d_hidden, + "d_expert": d_expert, + "n_routed_experts": n_routed_experts, + "n_experts_per_token": n_experts_per_token, + "batch_size": batch_size, + "seq_len": seq_len, + } + + gen = torch.Generator(device="cuda") + gen.manual_seed(seed) + + num_experts = n_routed_experts + expert_dim = d_expert + weights = {} + + input_tensor = torch.randn((batch_size, seq_len, d_hidden), device="cuda", dtype=torch.float16, generator=gen).contiguous() + + # Initialize router weights + weights["router.weight"] = torch.randn((num_experts, d_hidden), device="cuda", dtype=torch.float16, generator=gen) / math.sqrt(d_hidden) + + for i in range(num_experts): + weights[f"experts.{i}.0.weight"] = torch.randn( + (d_hidden, expert_dim), device="cuda", dtype=torch.float16, generator=gen + ) / math.sqrt(expert_dim) + + weights[f"experts.{i}.1.weight"] = torch.randn( + (d_hidden, expert_dim), device="cuda", dtype=torch.float16, generator=gen + ) / math.sqrt(expert_dim) + + weights[f"experts.{i}.2.weight"] = torch.randn( + (expert_dim, d_hidden), device="cuda", dtype=torch.float16, generator=gen + ) / math.sqrt(d_hidden) + + return (input_tensor, weights, config) + + +def clone_data(data): + """ + Recursively goes through data and clones all tensors. + """ + if isinstance(data, tuple): + return tuple(clone_data(x) for x in data) + elif isinstance(data, list): + return [clone_data(x) for x in data] + elif isinstance(data, dict): + return {k: clone_data(v) for k, v in data.items()} + elif isinstance(data, torch.Tensor): + return data.clone() + else: + return data + +def cal_tflops(config, t_sec): + M = config["bs"] * config["seqlen"] * config["nexpertspertoken"] + K = config["dhidden"] + N = config["dexpert"] * config["nroutedexperts"] + t_sec = prof.key_averages().total_average().cuda_time_total / 1e6 # ms -> s + flops = 2 * M * N * K + tflops = flops / (t_sec * 1e12) + print(f"Estimated TFLOPS: {tflops:.2f}") + + +def run_moe_test(config: dict, test_type: str, warm_up=10, iteration=100): + data = generate_input(**config) + + if test_type == "functional": + try: + ref_output = ref_kernel(clone_data(data)).to(torch.float32) + tilelang_output = custom_kernel(clone_data(data)).to(torch.float32) + torch.testing.assert_close(ref_output, tilelang_output, atol=1e-2, rtol=1e-2) + print(f"✅ Functional test passed for config: {config}") + except AssertionError as e: + print(f"❌ Functional test failed for config: {config}") + print("error msg: ", str(e)) + elif test_type == "performance": + import time + for i in range(warm_up): + _ = custom_kernel(clone_data(data)) + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + start_event.record() + for i in range(iteration): + _ = custom_kernel(clone_data(data)) + end_event.record() + torch.cuda.synchronize() + elapsed_ms = start_event.elapsed_time(end_event) + elapsed_ms = elapsed_ms / iteration + print(f"⏱ Performance test: {elapsed_ms:.8f}ms for config: {config}") + # with torch.profiler.profile( + # activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA], + # record_shapes=True, + # with_stack=False + # ) as prof: + # with torch.profiler.record_function("routed_kernel"): + # _ = custom_kernel(clone_data(data)) + # prof_results = prof.key_averages().table(sort_by="cuda_time_total", row_limit=10) + # print(prof_results) + else: + raise ValueError(f"Unknown test type {test_type}") + +def run_from_config_file(config_file: str): + with open(config_file, "r") as f: + configs = json.load(f) + + for test_type in ["functional", "performance"]: + print(f"\n=== Running {test_type} tests ===") + for cfg in configs.get(test_type, []): + run_moe_test(cfg, test_type) + +def clear_caches(): + import os + import shutil + cache_dir = os.path.expanduser("~/.tilelang/cache") + if os.path.exists(cache_dir): + shutil.rmtree(cache_dir) + else: + print("no tilelang cache found") + +if __name__ == "__main__": + # tilelang.disable_cache() + clear_caches() + config_file = "moe_test_configs.json" + run_from_config_file(config_file) diff --git a/race_tests/moe/moe_test_configs.json b/race_tests/moe/moe_test_configs.json new file mode 100644 index 0000000..dbf70da --- /dev/null +++ b/race_tests/moe/moe_test_configs.json @@ -0,0 +1,42 @@ +{ + "functional": [ + { + "dhidden": 7168, + "dexpert": 2048, + "nroutedexperts": 8, + "nexpertspertoken": 4, + "bs": 1, + "seqlen": 8192, + "seed": 81394 + }, + { + "dhidden": 3584, + "dexpert": 1024, + "nroutedexperts": 4, + "nexpertspertoken": 2, + "bs": 2, + "seqlen": 4096, + "seed": 81394 + } + ], + "performance": [ + { + "dhidden": 7168, + "dexpert": 2048, + "nroutedexperts": 8, + "nexpertspertoken": 4, + "bs": 4, + "seqlen": 8192, + "seed": 81394 + }, + { + "dhidden": 3584, + "dexpert": 1024, + "nroutedexperts": 4, + "nexpertspertoken": 2, + "bs": 8, + "seqlen": 4096, + "seed": 81394 + } + ] +} \ No newline at end of file diff --git a/race_tests/moe/ref_fusedmoe.py b/race_tests/moe/ref_fusedmoe.py new file mode 100644 index 0000000..77f3053 --- /dev/null +++ b/race_tests/moe/ref_fusedmoe.py @@ -0,0 +1,116 @@ +import math +import torch +import torch.nn as nn +from typing import Dict, Tuple, Optional + + +# Reference code in PyTorch +class ExpertTorch(nn.Module): + def __init__(self, config: Dict, d_expert: Optional[int] = None): + super().__init__() + self.config = config + self.act_fn = nn.SiLU() + self.d_hidden: int = config["d_hidden"] + self.d_expert: int = config["d_expert"] if d_expert is None else d_expert + + self.W_gate = nn.Linear(self.d_hidden, self.d_expert, bias=False) + self.W_up = nn.Linear(self.d_hidden, self.d_expert, bias=False) + self.W_down = nn.Linear(self.d_expert, self.d_hidden, bias=False) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + gate = self.act_fn(self.W_gate(x)) + out = self.W_down(gate * self.W_up(x)) + return out + +class MoEGateTorch(nn.Module): + def __init__(self, config: Dict): + super().__init__() + self.top_k: int = config["n_experts_per_token"] + self.num_experts: int = config["n_routed_experts"] + self.d_hidden: int = config["d_hidden"] + + self.W_g = nn.Linear(self.d_hidden, self.num_experts, bias=False) + + def forward(self, x: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: + logits = self.W_g(x) + scores = logits.softmax(dim=-1) + topk_scores, topk_indices = torch.topk(scores, k=self.top_k, dim=-1, sorted=False) + + return topk_indices, topk_scores + +class MoETorch(nn.Module): + def __init__(self, config: Dict): + super().__init__() + self.config = config + self.experts = nn.ModuleList([ExpertTorch(config) for _ in range(config["n_routed_experts"])]) + self.gating_network = MoEGateTorch(config) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + expert_indices, expert_scores = self.gating_network(x) + batch_size, seq_len, hidden_dim = x.shape + orig_shape = x.shape + x_flat = x.view(-1, hidden_dim) + flat_expert_indices = expert_indices.view(-1) + flat_expert_weights = expert_scores.view(-1, 1) + routed_output_flat = self.moe_infer(x_flat, flat_expert_indices, flat_expert_weights) + + routed_output = routed_output_flat.view(*orig_shape) + return routed_output + + @torch.no_grad() + def moe_infer(self, x: torch.Tensor, flat_expert_indices: torch.Tensor, flat_expert_weights: torch.Tensor) -> torch.Tensor: + expert_cache = torch.zeros_like(x) + idxs = flat_expert_indices.argsort() + counts = flat_expert_indices.bincount().cpu().numpy() + tokens_per_expert = counts.cumsum() + num_per_tok = self.config["n_experts_per_token"] + token_idxs = idxs // num_per_tok + for expert_id, end_idx in enumerate(tokens_per_expert): + start_idx = 0 if expert_id == 0 else tokens_per_expert[expert_id - 1] + if start_idx == end_idx: + continue + + expert = self.experts[expert_id] + exp_token_idxs = token_idxs[start_idx:end_idx] + expert_tokens = x[exp_token_idxs] + expert_out = expert(expert_tokens) + + expert_out.mul_(flat_expert_weights[idxs[start_idx:end_idx]]) + expert_cache.scatter_reduce_(0, exp_token_idxs.view(-1, 1).repeat(1, x.shape[-1]), expert_out, reduce="sum") + + return expert_cache + +def ref_kernel(data: Tuple[torch.Tensor, Dict, Dict]) -> torch.Tensor: + """ + Reference implementation of DeepSeek-style Mixture of Experts using PyTorch. + + Args: + data: Tuple of (input: torch.Tensor, weights: Dict[str, torch.Tensor], config: Dict) + - input: Input tensor of shape [batch_size, seq_len, hidden_dim] + - weights: Dictionary containing model weights + - config: Dictionary containing model configuration parameters + + Returns: + Tuple containing: + - output: Processed tensor [batch_size, seq_len, d_model] + """ + input_tensor, weights, config = data + num_experts = config["n_routed_experts"] + moe = MoETorch(config) + + # Fill in the given weights of the model + moe.gating_network.W_g.weight = nn.Parameter(weights["router.weight"]) + + for i in range(num_experts): + gate_proj_weight = weights[f"experts.{i}.0.weight"] + up_proj_weight = weights[f"experts.{i}.1.weight"] + down_proj_weight = weights[f"experts.{i}.2.weight"] + + # Transpose weights to match expected shape for nn.Linear + moe.experts[i].W_gate.weight = nn.Parameter(gate_proj_weight.t()) + moe.experts[i].W_up.weight = nn.Parameter(up_proj_weight.t()) + moe.experts[i].W_down.weight = nn.Parameter(down_proj_weight.t()) + + output = moe(input_tensor) + + return output \ No newline at end of file diff --git a/race_tests/moe/run.sh b/race_tests/moe/run.sh new file mode 100644 index 0000000..d0dfa5e --- /dev/null +++ b/race_tests/moe/run.sh @@ -0,0 +1 @@ +python fusedmoe_benchmark.py \ No newline at end of file diff --git a/race_tests/nsa/reference.py b/race_tests/nsa/reference.py new file mode 100644 index 0000000..5808310 --- /dev/null +++ b/race_tests/nsa/reference.py @@ -0,0 +1,305 @@ +# ruff: noqa +from typing import Optional + +import torch +from typing import Union +from einops import rearrange, repeat + + +def naive_nsa( + q: torch.Tensor, + k: torch.Tensor, + v: torch.Tensor, + g_slc: torch.Tensor, + g_swa: torch.Tensor, + block_indices: torch.LongTensor, + block_counts: Optional[Union[torch.LongTensor, int]] = None, + block_size: int = 64, + window_size: int = 0, + scale: Optional[float] = None, + cu_seqlens: Optional[torch.LongTensor] = None, + head_first: bool = False, +) -> torch.Tensor: + r""" + Args: + q (torch.Tensor): + Queries of shape `[B, T, HQ, K]` if `head_first=False` else `[B, HQ, T, K]`. + k (torch.Tensor): + Keys of shape `[B, T, H, K]` if `head_first=False` else `[B, H, T, K]`. + GQA is enforced here. The ratio of query heads (HQ) to key/value heads (H) must be a power of 2 and >=16. + v (torch.Tensor): + Values of shape `[B, T, H, V]` if `head_first=False` else `[B, H, T, V]`. + g_slc (torch.Tensor): + Gate score for selected attention of shape `[B, T, HQ]` if `head_first=False` else `[B, HQ, T]`. + g_swa (torch.Tensor): + Gate score for sliding attentionof shape `[B, T, HQ]` if `head_first=False` else `[B, HQ, T]`. + block_indices (torch.LongTensor): + Block indices of shape `[B, T, H, S]` if `head_first=False` else `[B, H, T, S]`. + `S` is the maximum number of selected blocks for each query token, which is set to 16 in the paper. + block_counts (Union[torch.LongTensor, int]): + Number of selected blocks for each token. + If a tensor is provided, with shape `[B, T, H]` if `head_first=True` else `[B, T, H]`, + each token can select the same number of blocks. + If not provided, it will default to `S`, Default: `None`. + block_size (int): + Selected block size. Default: 64. + window_size (int): + Sliding window size. Default: 0. + scale (Optional[int]): + Scale factor for attention scores. + If not provided, it will default to `1 / sqrt(K)`. Default: `None`. + cu_seqlens (torch.LongTensor): + Cumulative sequence lengths of shape `[N+1]` used for variable-length training, + consistent with the FlashAttention API. + head_first (Optional[bool]): + Whether the inputs are in the head-first format. Default: `False`. + + Returns: + o (torch.Tensor): + Outputs of shape `[B, T, HQ, V]` if `head_first=False` else `[B, HQ, T, V]`. + """ + if scale is None: + scale = k.shape[-1] ** -0.5 + if cu_seqlens is not None: + assert q.shape[0] == 1, "batch size must be 1 when cu_seqlens are provided" + if head_first: + raise RuntimeError("Sequences with variable lengths are not supported for head-first mode") + if head_first: + q, k, v, block_indices = map(lambda x: rearrange(x, "b h t d -> b t h d"), (q, k, v, block_indices)) + g_slc, g_swa = map(lambda x: rearrange(x, "b h t -> b t h"), (g_slc, g_swa)) + if isinstance(block_counts, torch.Tensor): + block_counts = rearrange(block_counts, "b h t -> b t h") + + dtype = q.dtype + G = q.shape[2] // k.shape[2] + BS = block_size + S = block_indices.shape[-1] + k, v, block_indices = (repeat(x, "b t h d -> b t (h g) d", g=G) for x in (k, v, block_indices)) + if isinstance(block_counts, torch.Tensor): + block_counts = repeat(block_counts, "b t h -> b t (h g)", g=G) + c = torch.arange(S).repeat_interleave(BS).unsqueeze(1).expand(-1, q.shape[2]).to(q.device) + q, k, v = map(lambda x: x.float(), (q, k, v)) + + o_slc = torch.zeros_like(v) + o_swa = torch.zeros_like(v) if window_size > 0 else None + varlen = True + if cu_seqlens is None: + varlen = False + B, T = q.shape[:2] + cu_seqlens = torch.cat([block_indices.new_tensor(range(0, B * T, T)), block_indices.new_tensor([B * T])]) + + for i in range(len(cu_seqlens) - 1): + if not varlen: + q_b, k_b, v_b, g_slc_b, g_swa_b, i_b = q[i], k[i], v[i], g_slc[i], g_swa[i], block_indices[i] + if isinstance(block_counts, torch.Tensor): + s_b = block_counts[i] + else: + s_b = block_counts + else: + T = cu_seqlens[i + 1] - cu_seqlens[i] + q_b, k_b, v_b, g_slc_b, g_swa_b, i_b = map( + lambda x: x[0][cu_seqlens[i] : cu_seqlens[i + 1]], (q, k, v, g_slc, g_swa, block_indices) + ) + if isinstance(block_counts, torch.Tensor): + s_b = block_counts[0][cu_seqlens[i] : cu_seqlens[i + 1]] + else: + s_b = block_counts + + i_b = i_b.unsqueeze(-1) * BS + i_b.new_tensor(range(BS)) + # [T, S*BS, HQ] + i_b = i_b.view(T, block_indices.shape[2], -1).transpose(1, 2) + for i_q in range(T): + # [HQ, D] + q_i = q_b[i_q] * scale + # [HQ] + g_slc_i = g_slc_b[i_q] + # [HQ] + g_swa_i = g_swa_b[i_q] + # [S*BS, HQ] + i_i = i_b[i_q] + # [HQ] + if isinstance(block_counts, torch.Tensor): + s_i = s_b[i_q] + else: + s_i = s_b + # [S*BS, HQ, -1] + k_i_slc, v_i_slc = map(lambda x: x.gather(0, i_i.clamp(0, T - 1).unsqueeze(-1).expand(*i_i.shape, x.shape[-1])), (k_b, v_b)) + # [S*BS, HQ] + attn_slc = ( + torch.einsum("h d, n h d -> n h", q_i, k_i_slc) + .masked_fill(torch.logical_or(i_i < 0, i_i > i_q) | (c >= s_i if block_counts is not None else False), float("-inf")) + .softmax(0) + ) + if not varlen: + o_slc[i, i_q] = torch.einsum("n h, n h v -> h v", attn_slc, v_i_slc) * g_slc_i.unsqueeze(-1) + else: + o_slc[0][cu_seqlens[i] + i_q] = torch.einsum("n h, n h v -> h v", attn_slc, v_i_slc) * g_slc_i.unsqueeze(-1) + if window_size > 0: + k_i_swa, v_i_swa = map(lambda x: x[max(0, i_q - window_size + 1) : i_q + 1], (k_b, v_b)) + attn_swa = torch.einsum("h d, n h d -> n h", q_i, k_i_swa).softmax(0) + if not varlen: + o_swa[i, i_q] = torch.einsum("n h, n h v -> h v", attn_swa, v_i_swa) * g_swa_i.unsqueeze(-1) + else: + o_swa[0][cu_seqlens[i] + i_q] = torch.einsum("n h, n h v -> h v", attn_swa, v_i_swa) * g_swa_i.unsqueeze(-1) + + if head_first: + o_slc = rearrange(o_slc, "b t h d -> b h t d") + o_swa = rearrange(o_swa, "b t h d -> b h t d") + + return o_slc.to(dtype) + o_swa.to(dtype) if o_swa is not None else o_slc.to(dtype) + + +def naive_nsa_simple( + q: torch.Tensor, + k: torch.Tensor, + v: torch.Tensor, + block_indices: torch.LongTensor, + block_counts: torch.LongTensor, + block_size: int = 64, +) -> torch.Tensor: + r""" + Args: + q (torch.Tensor): + queries of shape `[B, T, HQ, K]` if `head_first=False` else `[B, HQ, T, K]`. + k (torch.Tensor): + keys of shape `[B, T, H, K]` if `head_first=False` else `[B, H, T, K]`. + GQA is enforced here. The ratio of query heads (HQ) to key/value heads (H) must be a power of 2 and >=16. + v (torch.Tensor): + values of shape `[B, T, H, V]` if `head_first=False` else `[B, H, T, V]`. + block_indices (torch.LongTensor): + Block indices of shape `[B, T, H, S]` if `head_first=False` else `[B, H, T, S]`. + `S` is the maximum number of selected blocks for each query token, which is set to 16 in the paper. + block_counts (torch.LongTensor): + Block counts of shape `[B, T, H]` if `head_first=False` else `[B, H, T]`. + block_size (int): + Selected block size. Default: 64. + + Returns: + o (torch.Tensor): + Outputs of shape `[B, T, HQ, V]` if `head_first=False` else `[B, HQ, T, V]`. + """ + scale = k.shape[-1] ** -0.5 + + dtype = q.dtype + HQ = q.shape[2] + H = k.shape[2] + D = k.shape[-1] + G = HQ // H + BS = block_size + S = block_indices.shape[-1] + SELECTED_BLOCKS_SIZE = S * BS + k, v, block_indices = (repeat(x, "b t h d -> b t (h g) d", g=G) for x in (k, v, block_indices)) + block_counts = repeat(block_counts, "b t h -> b t (h g)", g=G) + c = torch.arange(S).repeat_interleave(BS).unsqueeze(1).expand(-1, q.shape[2]).to(q.device) + q, k, v = map(lambda x: x.float(), (q, k, v)) + o = torch.zeros_like(v) + B, T = q.shape[:2] + + for i in range(B): + q_b, k_b, v_b, i_b, s_b = q[i], k[i], v[i], block_indices[i], block_counts[i] + # [T, HQ, S, BS] -> [T, HQ, S*BS] + i_b = i_b.unsqueeze(-1) * BS + i_b.new_tensor(range(BS)) + # [T, HQ, S*BS] -> [T, S*BS, HQ] + i_b = i_b.view(T, block_indices.shape[2], -1).transpose(1, 2) + for i_q in range(T): + # [HQ, D] + q_i = q_b[i_q] * scale + # [S*BS, HQ] -> represents selected blocks for each query token + i_i = i_b[i_q] + # [HQ] -> represents the number of selected blocks for each query token + s_i = s_b[i_q] + + k_i = torch.zeros((S * BS, HQ, D), device=k_b.device, dtype=k_b.dtype) + v_i = torch.zeros((S * BS, HQ, D), device=v_b.device, dtype=v_b.dtype) + + for h in range(HQ): + for t in range(SELECTED_BLOCKS_SIZE): + selected_block_index = i_i[t, h] + k_i[t, h] = k_b[selected_block_index, h, :] + v_i[t, h] = v_b[selected_block_index, h, :] + + # [S*BS, HQ] + attn = torch.einsum("h d, n h d -> n h", q_i, k_i) + attn = attn.masked_fill((i_i > i_q) | (c >= s_i), float("-inf")) + attn = torch.softmax(attn, dim=0) + o[i, i_q] = torch.einsum("n h, n h v -> h v", attn, v_i) + + return o.to(dtype) + + +def naive_nsa_simple_inference( + q: torch.Tensor, + k: torch.Tensor, + v: torch.Tensor, + block_indices: torch.LongTensor, + block_counts: torch.LongTensor, + block_size: int = 64, +) -> torch.Tensor: + r""" + Args: + q (torch.Tensor): + queries of shape `[B, 1, HQ, K]` if `head_first=False` else `[B, HQ, T, K]`. + k (torch.Tensor): + keys of shape `[B, T, H, K]` if `head_first=False` else `[B, H, T, K]`. + GQA is enforced here. The ratio of query heads (HQ) to key/value heads (H) must be a power of 2 and >=16. + v (torch.Tensor): + values of shape `[B, T, H, V]` if `head_first=False` else `[B, H, T, V]`. + block_indices (torch.LongTensor): + Block indices of shape `[B, 1, H, S]` if `head_first=False` else `[B, H, T, S]`. + `S` is the maximum number of selected blocks for each query token, which is set to 16 in the paper. + block_counts (torch.LongTensor): + Block counts of shape `[B, 1, H]` if `head_first=False` else `[B, H, T]`. + block_size (int): + Selected block size. Default: 64. + + Returns: + o (torch.Tensor): + Outputs of shape `[B, 1, HQ, V]` if `head_first=False` else `[B, HQ, T, V]`. + """ + scale = k.shape[-1] ** -0.5 + + dtype = q.dtype + HQ = q.shape[2] + H = k.shape[2] + D = k.shape[-1] + G = HQ // H + BS = block_size + S = block_indices.shape[-1] + SELECTED_BLOCKS_SIZE = S * BS + k, v, block_indices = (repeat(x, "b t h d -> b t (h g) d", g=G) for x in (k, v, block_indices)) + block_counts = repeat(block_counts, "b t h -> b t (h g)", g=G) + c = torch.arange(S).repeat_interleave(BS).unsqueeze(1).expand(-1, q.shape[2]).to(q.device) + q, k, v = map(lambda x: x.float(), (q, k, v)) + o = torch.zeros_like(q) + B, T = q.shape[:2] + + for i in range(B): + q_b, k_b, v_b, i_b, s_b = q[i], k[i], v[i], block_indices[i], block_counts[i] + # [T, HQ, S, BS] -> [T, HQ, S*BS] + i_b = i_b.unsqueeze(-1) * BS + i_b.new_tensor(range(BS)) + # [T, HQ, S*BS] -> [T, S*BS, HQ] + i_b = i_b.view(T, block_indices.shape[2], -1).transpose(1, 2) + + # [HQ, D] + q_i = q_b[0] * scale + # [S*BS, HQ] -> represents selected blocks for each query token + i_i = i_b[0] + # [HQ] -> represents the number of selected blocks for each query token + s_i = s_b[0] + + k_i = torch.zeros((S * BS, HQ, D), device=k_b.device, dtype=k_b.dtype) + v_i = torch.zeros((S * BS, HQ, D), device=v_b.device, dtype=v_b.dtype) + + for h in range(HQ): + for t in range(SELECTED_BLOCKS_SIZE): + selected_block_index = i_i[t, h] + k_i[t, h] = k_b[selected_block_index, h, :] + v_i[t, h] = v_b[selected_block_index, h, :] + + # [S*BS, HQ] + attn = torch.einsum("h d, n h d -> n h", q_i, k_i) + attn = attn.masked_fill((c >= s_i), float("-inf")) + attn = torch.softmax(attn, dim=0) + o[i, 0] = torch.einsum("n h, n h v -> h v", attn, v_i) + + return o.to(dtype) diff --git a/race_tests/nsa/test_cases_nsa_fwd.json b/race_tests/nsa/test_cases_nsa_fwd.json new file mode 100644 index 0000000..6862f9b --- /dev/null +++ b/race_tests/nsa/test_cases_nsa_fwd.json @@ -0,0 +1,1092 @@ +[ + { + "B": 1, + "SEQ_LEN": 64, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 64, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 64, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 64, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 64, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 64, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 64, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 64, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 64, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 64, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 64, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 32, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 64, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 32, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 64, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 32, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 64, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 32, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 128, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 64, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 32, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 32, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 32, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 256, + "H": 2, + "HQ": 32, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 512, + "H": 2, + "HQ": 32, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 512, + "H": 2, + "HQ": 32, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 64, + "S": 2, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 64, + "S": 2, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 64, + "S": 2, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 64, + "S": 4, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 64, + "S": 4, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 64, + "S": 4, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 64, + "S": 8, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 64, + "S": 8, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 64, + "S": 8, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 32, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 1024, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 32, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 512, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 32, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 256, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 32, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 2048, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 2048, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 2048, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 48, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 48, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 48, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 48, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 96, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 96, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 96, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 96, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 4096, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 4096, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 4096, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 4096, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 8, + "SEQ_LEN": 4096, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 8192, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 8192, + "H": 1, + "HQ": 16, + "D": 128, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 8192, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 4, + "SEQ_LEN": 8192, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 16384, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 1, + "SEQ_LEN": 16384, + "H": 1, + "HQ": 16, + "D": 64, + "S": 1, + "block_size": 16, + "is_causal": true + }, + { + "B": 2, + "SEQ_LEN": 16384, + "H": 1, + "HQ": 16, + "D": 32, + "S": 1, + "block_size": 16, + "is_causal": true + } +] \ No newline at end of file diff --git a/race_tests/nsa/test_tilelang_nsa_fwd.py b/race_tests/nsa/test_tilelang_nsa_fwd.py new file mode 100644 index 0000000..aa1bd77 --- /dev/null +++ b/race_tests/nsa/test_tilelang_nsa_fwd.py @@ -0,0 +1,310 @@ +# 2025 - Modified by MetaX Integrated Circuits (Shanghai) Co., Ltd. All Rights Reserved. + +# Copyright (c) Tile-AI Corporation. +# Licensed under the MIT License. +# ruff: noqa +import torch +from reference import naive_nsa +import tilelang +from tilelang import language as T +import tilelang.testing +try: + from tvm._ffi_base import InternalError +except ImportError: + InternalError = Exception + +tilelang.testing.set_random_seed(0) + + +@tilelang.jit( + out_idx=[-1], + pass_configs={tilelang.PassConfigKey.TL_ENABLE_FAST_MATH: True, tilelang.PassConfigKey.TL_DISABLE_WARP_SPECIALIZED: True}, +) +def native_sparse_attention(batch, heads, seq_len, dim, is_causal, scale=None, block_size=64, groups=1, selected_blocks=16): + if scale is None: + scale = (1.0 / dim) ** 0.5 * 1.44269504 # log2(e) + else: + scale = scale * 1.44269504 # log2(e) + + head_kv = heads // groups + q_shape = [batch, seq_len, heads, dim] + kv_shape = [batch, seq_len, head_kv, dim] + block_indices_shape = [batch, seq_len, head_kv, selected_blocks] + block_indices_dtype = T.int32 + dtype = T.float16 + accum_dtype = T.float32 + block_S = block_size + block_T = min(128, tilelang.math.next_power_of_2(dim)) + + NK = tilelang.cdiv(dim, block_T) + NV = tilelang.cdiv(dim, block_T) + assert NK == 1, "The key dimension can not be larger than 256" + + S = selected_blocks + G = groups + BS = block_S + BK = BV = block_T + num_stages = 2 + threads = 64 + + @T.prim_func + def native_sparse_attention( + Q: T.Tensor(q_shape, dtype), + K: T.Tensor(kv_shape, dtype), + V: T.Tensor(kv_shape, dtype), + BlockIndices: T.Tensor(block_indices_shape, block_indices_dtype), + Output: T.Tensor(q_shape, dtype), + ): + with T.Kernel(seq_len, NV, batch * head_kv, threads=threads) as (bx, by, bz): + Q_shared = T.alloc_shared([G, BK], dtype) + K_shared = T.alloc_shared([BS, BK], dtype) + V_shared = T.alloc_shared([BS, BV], dtype) + O_shared = T.alloc_shared([G, BV], dtype) + + acc_s = T.alloc_fragment([G, BS], accum_dtype) + acc_s_cast = T.alloc_fragment([G, BS], dtype) + acc_o = T.alloc_fragment([G, BV], accum_dtype) + scores_max = T.alloc_fragment([G], accum_dtype) + scores_max_prev = T.alloc_fragment([G], accum_dtype) + scores_scale = T.alloc_fragment([G], accum_dtype) + scores_sum = T.alloc_fragment([G], accum_dtype) + logsum = T.alloc_fragment([G], accum_dtype) + + i_t, i_v, i_bh = bx, by, bz + i_b, i_h = i_bh // head_kv, i_bh % head_kv + + NS = S + T.copy(Q[i_b, i_t, i_h * G : (i_h + 1) * G, :], Q_shared) + + T.fill(acc_o, 0) + T.fill(logsum, 0) + T.fill(scores_max, -T.infinity(accum_dtype)) + + for i in T.Pipelined(NS, num_stages=num_stages): + i_s = BlockIndices[i_b, i_t, i_h, i] * BS + if i_s <= i_t and i_s >= 0: + # [BS, BK] + T.copy(K[i_b, i_s : i_s + BS, i_h, :], K_shared) + + if is_causal: + for i, j in T.Parallel(G, BS): + acc_s[i, j] = T.if_then_else(i_t >= (i_s + j), 0, -T.infinity(acc_s.dtype)) + else: + T.clear(acc_s) + + T.gemm(Q_shared, K_shared, acc_s, transpose_B=True, policy=T.GemmWarpPolicy.FullRow) + + # Softmax + T.copy(scores_max, scores_max_prev) + T.fill(scores_max, -T.infinity(accum_dtype)) + T.reduce_max(acc_s, scores_max, dim=1, clear=True) + for i in T.Parallel(G): + scores_scale[i] = T.exp2(scores_max_prev[i] * scale - scores_max[i] * scale) + for i, j in T.Parallel(G, BS): + acc_s[i, j] = T.exp2(acc_s[i, j] * scale - scores_max[i] * scale) + T.reduce_sum(acc_s, scores_sum, dim=1) + for i in T.Parallel(G): + logsum[i] = logsum[i] * scores_scale[i] + scores_sum[i] + T.copy(acc_s, acc_s_cast) + + # Rescale + for i, j in T.Parallel(G, BV): + acc_o[i, j] *= scores_scale[i] + + # V * softmax(Q * K) + T.copy(V[i_b, i_s : i_s + BS, i_h, i_v * BV : (i_v + 1) * BV], V_shared) + T.gemm(acc_s_cast, V_shared, acc_o, policy=T.GemmWarpPolicy.FullRow) + + for i, j in T.Parallel(G, BV): + acc_o[i, j] /= logsum[i] + T.copy(acc_o, O_shared) + T.copy(O_shared, Output[i_b, i_t, i_h * G : (i_h + 1) * G, i_v * BV : (i_v + 1) * BV]) + + return native_sparse_attention + + +def _run_one_case(B, SEQ_LEN, H, HQ, D, S, block_size, is_causal, dtype=torch.float16, scale=0.1): + G = HQ // H + # Estimate shared memory: Q_shared[G,BK] + K_shared[BS,BK] + V_shared[BS,BV] + # + O_shared[G,BV] + acc_s[G,BS] + acc_s_cast[G,BS] + # BK=BV=block_T (min(128,next_pow2(D))), BS=block_size, G=groups + block_T = min(128, 2 ** (D - 1).bit_length()) + smem_bytes = ( + G * block_T * 2 + # Q_shared (fp16) + block_size * block_T * 2 + # K_shared (fp16) + block_size * block_T * 2 + # V_shared (fp16) + G * block_T * 2 + # O_shared (fp16) + G * block_size * 4 + # acc_s (fp32) + G * block_size * 2 # acc_s_cast (fp16) + ) + max_smem = 65536 # MetaX GPU shared memory per block + if smem_bytes > max_smem: + print(f" (skipped: smem {smem_bytes} > {max_smem})") + return 0.0 + + try: + kernel = native_sparse_attention( + batch=B, + heads=HQ, + seq_len=SEQ_LEN, + dim=D, + is_causal=is_causal, + block_size=block_size, + groups=HQ // H, + selected_blocks=S, + scale=scale, + ) + except Exception as e: + msg = str(e) + if any(x in msg.lower() for x in ["shared memory", "invalid argument", "must be divisible"]): + print(f" (skipped: {msg[:100]})") + return 0.0 + raise + torch.random.manual_seed(0) + Q = torch.randn((B, SEQ_LEN, HQ, D), dtype=dtype, device="cuda").requires_grad_(True) + K = torch.randn((B, SEQ_LEN, H, D), dtype=dtype, device="cuda").requires_grad_(True) + V = torch.randn((B, SEQ_LEN, H, D), dtype=dtype, device="cuda").requires_grad_(True) + g_slc = torch.ones((B, SEQ_LEN, HQ), dtype=dtype, device="cuda").requires_grad_(True) + g_swa = torch.ones((B, SEQ_LEN, HQ), dtype=dtype, device="cuda").requires_grad_(True) + block_indices = torch.full((B, SEQ_LEN, H, S), SEQ_LEN, dtype=torch.long, device="cuda") + block_counts = torch.zeros((B, SEQ_LEN, H), dtype=torch.long, device="cuda") + for b in range(B): + for t in range(SEQ_LEN): + for h in range(H): + i_i = torch.randperm(max(1, (t // block_size)))[:S] + block_indices[b, t, h, : len(i_i)] = i_i + block_counts[b, t, h] = (block_indices[b, t, h] != SEQ_LEN).sum().item() + block_indices = block_indices.sort(-1)[0] + + try: + out = kernel(Q, K, V, block_indices.to(torch.int32)) + except Exception as e: + msg = str(e) + if any(x in msg.lower() for x in ["shared memory", "invalid argument", "must be divisible"]): + print(f" (skipped: {msg[:100]})") + return 0.0 + raise + + # Skip reference comparison for large configs (naive_nsa is O(N^2) Python, too slow) + skip_ref = (B >= 4 and SEQ_LEN >= 512 and D >= 64) or (B >= 2 and SEQ_LEN >= 512 and block_size >= 64) + if not skip_ref: + ref = naive_nsa( + q=Q, + k=K, + v=V, + g_slc=g_slc, + g_swa=g_swa, + block_indices=block_indices, + block_counts=block_counts, + block_size=block_size, + scale=scale, + ) + torch.testing.assert_close(ref, out, atol=1e-2, rtol=1e-2) + else: + print(" (skipped reference check for large config)") + + # Manual warmup + CUDA event timing to avoid do_bench hanging on large kernels + n_warmup = 3 + n_repeat = 50 + try: + for _ in range(n_warmup): + kernel(Q, K, V, block_indices.to(torch.int32)) + torch.cuda.synchronize() + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + start_event.record() + for _ in range(n_repeat): + kernel(Q, K, V, block_indices.to(torch.int32)) + end_event.record() + end_event.synchronize() + latency = start_event.elapsed_time(end_event) / n_repeat + except Exception as e: + print(f" (skipped: kernel timing failed - {str(e)[:80]})") + return 0.0 + print(f" GPU latency: {latency:.4f} ms") + return latency + + +def main(): + import json, pathlib, csv + json_path = pathlib.Path(__file__).parent / "test_cases_nsa_fwd.json" + csv_path = pathlib.Path(__file__).parent / "benchmark_results_nsa_fwd.csv" + test_cases = json.load(open(json_path)) + + n_cases = len(test_cases) + total_latency = 0.0 + n_success = 0 + fieldnames = ["idx", "B", "SEQ_LEN", "H", "HQ", "D", "S", "block_size", "is_causal", "latency_ms", "status"] + written_header = False + for i, tc in enumerate(test_cases): + print(f"[{i+1}/{n_cases}] B={tc['B']} SEQ_LEN={tc['SEQ_LEN']} H={tc['H']} HQ={tc['HQ']} D={tc['D']} S={tc['S']} block_size={tc['block_size']} is_causal={tc['is_causal']}") + lat = _run_one_case(tc['B'], tc['SEQ_LEN'], tc['H'], tc['HQ'], tc['D'], tc['S'], tc['block_size'], tc['is_causal']) + status = "PASS" if lat > 0 else "SKIP" + row = { + "idx": i + 1, + "B": tc['B'], + "SEQ_LEN": tc['SEQ_LEN'], + "H": tc['H'], + "HQ": tc['HQ'], + "D": tc['D'], + "S": tc['S'], + "block_size": tc['block_size'], + "is_causal": tc['is_causal'], + "latency_ms": round(lat, 6) if lat > 0 else 0.0, + "status": status, + } + if lat > 0: + total_latency += lat + n_success += 1 + # write row immediately so partial results are saved even if process is killed + with open(csv_path, "a", newline="") as f: + writer = csv.DictWriter(f, fieldnames=fieldnames) + if not written_header: + writer.writeheader() + written_header = True + writer.writerow(row) + + print(f"\n=== Summary: {n_success}/{n_cases} cases, avg latency: {total_latency / max(n_success, 1):.4f} ms ===") + print(f"Results saved to: {csv_path}") + + +def run_regression_perf(): + B, SEQ_LEN, H, HQ, D, S, block_size, dtype, scale = 2, 128, 1, 16, 32, 1, 32, torch.float16, 0.1 + kernel = native_sparse_attention( + batch=B, + heads=HQ, + seq_len=SEQ_LEN, + dim=D, + is_causal=True, + block_size=block_size, + groups=HQ // H, + selected_blocks=S, + scale=scale, + ) + torch.random.manual_seed(0) + Q = torch.randn((B, SEQ_LEN, HQ, D), dtype=dtype, device="cuda").requires_grad_(True) + K = torch.randn((B, SEQ_LEN, H, D), dtype=dtype, device="cuda").requires_grad_(True) + V = torch.randn((B, SEQ_LEN, H, D), dtype=dtype, device="cuda").requires_grad_(True) + g_slc = torch.ones((B, SEQ_LEN, HQ), dtype=dtype, device="cuda").requires_grad_(True) + g_swa = torch.ones((B, SEQ_LEN, HQ), dtype=dtype, device="cuda").requires_grad_(True) + DO = torch.randn((B, SEQ_LEN, HQ, D), dtype=dtype, device="cuda") + block_indices = torch.full((B, SEQ_LEN, H, S), SEQ_LEN, dtype=torch.long, device="cuda") + block_counts = torch.zeros((B, SEQ_LEN, H), dtype=torch.long, device="cuda") + for b in range(B): + for t in range(SEQ_LEN): + for h in range(H): + i_i = torch.randperm(max(1, (t // block_size)))[:S] + block_indices[b, t, h, : len(i_i)] = i_i + block_counts[b, t, h] = (block_indices[b, t, h] != SEQ_LEN).sum().item() + block_indices = block_indices.sort(-1)[0] + + from tilelang.profiler import do_bench + + def run_kernel_only(): + kernel(Q, K, V, block_indices.to(torch.int32)) + + return do_bench(run_kernel_only, backend="cupti") + + +if __name__ == "__main__": + main() diff --git a/ref/01_methodology/correctness_and_experiments.md b/ref/01_methodology/correctness_and_experiments.md new file mode 100644 index 0000000..342aec7 --- /dev/null +++ b/ref/01_methodology/correctness_and_experiments.md @@ -0,0 +1,40 @@ +# 正确性与实验设计 + +## 正确性矩阵 + +- 最小合法输入和单元素输入。 +- tile 边界前后:`tile-1`、`tile`、`tile+1`。 +- 非 2 次幂长度和不对齐地址。 +- 最大资源/长度输入。 +- 非对称维度、空段、ragged 分布、特殊 mask。 +- 随机值、极值、重复值以及可能导致 softmax/reduction 不稳定的值。 + +## 数值指标 + +除 `allclose` 外至少记录: + +```text +match_rate +max_abs_error +max_relative_or_tolerance_ratio +NaN/Inf count +worst element location +``` + +## 可归因实验 + +- 父版本固定,候选文件和 kernel symbol 使用新版本号。 +- builder、PrimFunc、JIT key 同步改名,避免陈旧缓存。 +- A/B 使用相同输入、相同 warmup、相同计时方法和相邻时间窗口。 +- 先检查生成代码是否实现了预期变化。 +- 小于正常噪声的变化必须交替顺序并重复运行。 + +## 结论分类 + +```text +retained 正确且收益稳定,成为新父版本 +rejected 正确但回退,或资源/复杂度代价不接受 +failed 编译、启动或正确性失败 +inconclusive 环境、缓存或测量问题导致无法归因 +no-op 源码变化但生成设备代码未变化 +``` diff --git a/ref/01_methodology/operator_optimization_lifecycle.md b/ref/01_methodology/operator_optimization_lifecycle.md new file mode 100644 index 0000000..b7cd91b --- /dev/null +++ b/ref/01_methodology/operator_optimization_lifecycle.md @@ -0,0 +1,51 @@ +# 算子优化生命周期 + +## 阶段 0:固定契约 + +记录输入输出 shape、dtype、layout、数学定义、边界行为、误差容限、禁止事项和 +评测接口。动态 shape 算子必须区分编译期上界、运行时实际长度和 JIT cache key。 + +## 阶段 1:建立正确性基线 + +- 选择可信 reference,并记录 reference 版本。 +- 覆盖最小输入、非 2 次幂尾部、空/短段、最大输入、非对称 shape 和特殊 mask。 +- 同时记录匹配率、最大绝对误差、最坏容差比、NaN 和 Inf。 +- 在性能工作开始前保存一个能稳定复现的正确版本。 + +## 阶段 2:建立性能模型 + +- 计算理论 FLOPs、最低 global-memory 字节数和算术强度。 +- 列出每个 tile 的 global/shared/register 生命周期。 +- 计算 threads、waves、registers、shared memory 和可能驻留 CTA。 +- 判断问题更可能受计算、带宽、延迟、同步、启动或负载不均衡限制。 + +## 阶段 3:稳定测量 + +- JIT/编译不进入计时区间。 +- warmup 后采集多次样本,保存 median、P10、P90 和离散程度。 +- 使用原始用户 kernel 时间比较版本;外部 baseline 波动时不能错误归因。 +- 一次只改变一个可解释概念,复杂度很高时允许一组紧密关联的修改。 + +## 阶段 4:生成代码与资源 + +- 检查实际 grid/block、动态 shared、register/private memory。 +- 比较生成 CU,而不是只比较 DSL 源码。 +- 统计关键循环中的 barrier、global/shared load 宽度、MMA、reduction 和分支。 +- 若生成代码未变化,将候选标记为 no-op,不进行昂贵评测。 + +## 阶段 5:定位瓶颈 + +1. mcTracer 排除 launch、同步、额外 memcpy、重编译和其他 kernel 干扰。 +2. mcProfiler 查看 AP/MMA/MTE/STE duty、stall、cache、流量和 shared efficiency。 +3. 根据证据选择最小候选,不根据单个指标直接下结论。 + +## 阶段 6:候选验收 + +顺序固定为:编译 -> 小型正确性 -> 资源 -> 局部 A/B -> 完整正确性 -> 完整性能 +-> OJ。任何阶段失败都保留原因,不覆盖当前最佳版本。 + +## 阶段 7:沉淀 + +- 更新版本表、实验记录和原始产物索引。 +- 区分有效优化、无效优化、环境失败和待验证假设。 +- 提炼成跨算子适用的信号、动作、风险和验收标准。 diff --git a/ref/01_methodology/optimization_decision_tree.md b/ref/01_methodology/optimization_decision_tree.md new file mode 100644 index 0000000..49a32d7 --- /dev/null +++ b/ref/01_methodology/optimization_decision_tree.md @@ -0,0 +1,18 @@ +# 优化决策树 + +```text +时间是否主要在目标 kernel? +├─ 否:检查 JIT、launch、同步、workspace、额外 kernel/memcpy +└─ 是:检查资源和 profiler + ├─ private memory 非零:缩小 fragment、减少展开和线程临时数组 + ├─ shared 限制驻留:复用生命周期、缩小 tile、减少 stage + ├─ AP busy 低:网格不足、负载不均、长尾或 host bubble + ├─ AP busy 高 + MMA 低 + │ ├─ WSM/shared stall 高:布局、bank conflict、barrier、reduction + │ ├─ MTE/内存高:向量加载、合并访问、预取、cache reuse + │ └─ STE/标量高:地址、mask、softmax、控制流 + ├─ cache miss/global bytes 高:重复读取、所有权、tile 复用 + └─ MMA 高但仍慢:tile 数、计算工作量、指令吞吐上界 +``` + +每条分支都先提出能被生成代码或 profiler 否证的假设,再修改代码。 diff --git a/ref/01_methodology/performance_modeling.md b/ref/01_methodology/performance_modeling.md new file mode 100644 index 0000000..80a695a --- /dev/null +++ b/ref/01_methodology/performance_modeling.md @@ -0,0 +1,45 @@ +# 性能建模 + +## 1. 工作量 + +对每个输出元素或 tile 写出: + +```text +FLOPs = 加法 + 乘法 + FMA*2 + 特殊函数的约定成本 +最低字节 = 必须读取的输入 + 必须写出的输出 +算术强度 = FLOPs / 最低字节 +``` + +同时计算实际算法引入的重复读取、中间结果和 workspace,不能只用理论下界。 + +## 2. 数据生命周期表 + +| 数据 | global 读取 | shared 读写 | register/fragment | 输出 | +|---|---:|---:|---:|---:| +| 输入 A | 每 CTA/tile 次数 | staging 次数 | 复用次数 | - | +| 输入 B | 每 CTA/tile 次数 | staging 次数 | 复用次数 | - | +| 累加器 | - | 是否落 shared | 生命周期 | 写回次数 | + +对 reduction、attention、scan 等循环依赖算子,按一次主循环迭代填写。 + +## 3. 资源预算 + +```text +waves/CTA = ceil(threads / wave_size) +shared/CTA = 所有同时存活 shared allocation + compiler workspace +register pressure = fragment + 标量状态 + 地址计算 + 展开临时值 +resident CTA/AP <= min(thread limit, wave limit, shared limit, register limit) +``` + +源代码声明的 shared 大小不是最终值,必须使用 mcTracer 或 host launcher 验证。 + +## 4. Roofline 只作为上界 + +算术强度低时优先检查合并访问、cache 和重复读取;算术强度高但 MMA duty 低时, +优先检查 operand 等待、shared conflict、barrier、reduction 和指令依赖。AP busy 高 +只说明设备有工作,不等于计算单元有效利用率高。 + +## 5. 动态 shape + +分别建模最小、典型、最大、ragged 和强非对称 shape。全局上界启动的矩形网格 +可能产生无效 CTA;编译期特化可以删除动态保护,但必须证明 predicate 安全。 diff --git a/ref/02_architecture/metax_c500/architecture_facts.md b/ref/02_architecture/metax_c500/architecture_facts.md new file mode 100644 index 0000000..c8f830f --- /dev/null +++ b/ref/02_architecture/metax_c500/architecture_facts.md @@ -0,0 +1,40 @@ +# MetaX C500 架构事实表 + +## 稳定事实 + +| 项目 | 值 | 来源 | +|---|---:|---| +| 设备名称 | MetaX C500 | `RUNTIME` mx-smi/API | +| 目标架构 | xcore1000 系列 | `RUNTIME/COMPILER` | +| physical wave | 64 threads | `OFFICIAL/RUNTIME` | +| 每 block shared 上限 | 65,536 B | `RUNTIME` device properties | +| 每 AP shared | 65,536 B | `RUNTIME` device properties | +| 每 AP 最大线程 | 2,048 | `RUNTIME` device properties | +| 每 AP registers | 131,072 | `RUNTIME` device properties | +| AP 数 | 104 | `RUNTIME` 当前完整 C500 | +| L2 | 8 MiB | `RUNTIME` device properties | + +## 当前 64 GiB 环境快照 + +```text +GPU: MetaX C500 +VRAM: 65,536 MiB +MACA: 3.7.1.5 +Kernel mode driver: 3.8.30 +mx-smi: 2.3.1 +GPU slice: disabled +``` + +以上版本和容量是环境快照,不应写进通用 kernel 假设。 + +## 需要按环境重新确认 + +- 完整卡或 sGPU 切片比例、显存容量和可用 AP。 +- 驱动、MACA、MXCC、TileLang-MetaX 和 FlashInfer 版本。 +- 实际最大 block、shared opt-in、clock 和功耗状态。 +- profiler 支持的计数器及其是否为推断值。 + +## 未公开或需源码验证 + +矩阵单元峰值、部分 pipeline 延迟、bank 细节和精确调度规则不能套用 NVIDIA +结论。使用安装头文件、生成代码、资源报告和 profiler 建立实证。 diff --git a/ref/02_architecture/metax_c500/execution_and_memory.md b/ref/02_architecture/metax_c500/execution_and_memory.md new file mode 100644 index 0000000..3fada56 --- /dev/null +++ b/ref/02_architecture/metax_c500/execution_and_memory.md @@ -0,0 +1,39 @@ +# C500 执行与存储模型 + +## 执行 + +MXMACA 使用 SIMT。physical wave 为 64 threads;CTA/block 由一个或多个 waves +组成,并受线程、wave、register 和 WSM 共同限制。线程数通常选择 64 的倍数。 + +在文档和代码中区分: + +```text +thread 单个执行线程 +wave 64-thread 调度单位 +CTA/block 共享 WSM 和同步域 +AP 执行 CTA 的处理单元 +DPC 更高层硬件分组,主要出现在 profiler 中 +``` + +## 存储层级 + +```text +register/fragment 最低延迟,容量决定 active waves +private memory 每线程地址空间,非零常提示 spill 或大局部数组 +WSM/shared CTA 可见,显式管理,C500 当前上限 64 KiB/AP +VL1/L2 硬件管理 cache +global memory 全 grid 可见,容量大、延迟高 +``` + +private memory 不等于每次直接访问 HBM,但通常不应被忽略。 + +## Shared 预算示例 + +若一个 CTA 使用 53,248 B WSM,则 `2 * 53,248 > 65,536`,shared 本身就排除 +双 CTA 驻留。缩小到 26,624 B 才给双 CTA 留出实际空间,但还要检查 register、 +threads 和增加的循环/搬运成本。 + +## 合并与向量化 + +必须从生成 CU 确认 `uint2/uint4`、64B/128B permuted layout 或标量访问。 +DSL 中的 `copy`、swizzle annotation 和连续 shape 不保证最终物理访问已经改变。 diff --git a/ref/02_architecture/metax_c500/mma_and_resources.md b/ref/02_architecture/metax_c500/mma_and_resources.md new file mode 100644 index 0000000..bf5c4c1 --- /dev/null +++ b/ref/02_architecture/metax_c500/mma_and_resources.md @@ -0,0 +1,28 @@ +# C500 MMA 与资源分析 + +安装的 MetaX FlashInfer 头文件显示 BF16 attention 使用 C500 专用 MMA 路径, +生成代码可见 `__builtin_mxc_mma_16x16x16bf16`。这证明当前环境支持 +`m16n16k16` BF16 MMA,但不能据此推导完整峰值吞吐。 + +## 分析清单 + +- MMA 输入 shape、transpose 和 fragment layout。 +- waves 在 M/N 维的分区。 +- operand 从 global -> shared -> register fragment 的路径。 +- accumulator dtype 和每线程元素数。 +- QK 与 PV 是否需要不同 fragment layout 或额外转换。 +- register/private memory 是否因 tile 或展开增长。 + +## 资源证据优先级 + +1. mcTracer 的实际 launch metadata。 +2. MXCC `-resource-usage`。 +3. 生成 host launcher 的 dynamic shared 参数。 +4. 源码静态估算。 + +## 注意事项 + +- 相同 `GemmWarpPolicy` 不保证两个不同 M/N shape 的 fragment layout 相同。 +- 改一个 GEMM policy 可能导致相邻 `copy/reduction` 的 layout inference 冲突。 +- shared padding/swizzle 只有在生成地址表达式或设备二进制变化时才算生效。 +- MMA duty 低时先判断 operand/sync stall,不要直接增大 tile。 diff --git a/ref/02_architecture/metax_c500/sources.md b/ref/02_architecture/metax_c500/sources.md new file mode 100644 index 0000000..8d939a9 --- /dev/null +++ b/ref/02_architecture/metax_c500/sources.md @@ -0,0 +1,29 @@ +# C500 与工具链来源 + +## 官方文档 + +- MXMACA 编程模型: + `https://developer.metax-tech.com/api/client/document/preview/693/split_files/编程模型.html` +- MXMACA 编程接口: + `https://developer.metax-tech.com/api/client/document/preview/693/split_files/编程接口.html` +- C500 Quick Start: + `https://developer.metax-tech.com/api/client/document/preview/558/C500_QuickStartGuide_CN.html` +- mcProfiler: + `https://developer.metax-tech.com/api/client/document/preview/679/split_files/mcprofiler.html` + +## 官方/厂商源码 + +- MetaX McFlashInfer:`https://github.com/MetaX-MACA/McFlashInfer` +- TileOps-Metax:`https://github.com/MetaX-MACA/TileOPs-Metax` +- mcoplib:`https://github.com/MetaX-MACA/mcoplib` + +## 当前环境源码 + +```text +/data/tilelang-metax +/opt/conda/lib/python3.12/site-packages/flashinfer/data/include/flashinfer +/opt/maca +``` + +安装头文件会随环境版本变化。引用 template、宏、MMA 或 shared layout 时记录 +MACA/FlashInfer/TileLang 版本或文件 hash。 diff --git a/ref/03_backends/cudamaca/programming_and_flashinfer.md b/ref/03_backends/cudamaca/programming_and_flashinfer.md new file mode 100644 index 0000000..c9c34aa --- /dev/null +++ b/ref/03_backends/cudamaca/programming_and_flashinfer.md @@ -0,0 +1,35 @@ +# CUDA MACA 与 FlashInfer 复用 + +## CUDA MACA + +CUDA 风格源码由 MXCC 面向 xcore 编译。不要假设 NVIDIA 的 warp=32、bank、MMA +吞吐和异步复制语义在 C500 上完全相同;优先使用 MetaX 头文件和生成结果。 + +编译候选至少记录: + +```text +offload arch +MXCC/MACA version +MT/ST registers +shared/private memory +staticMaxWarps/PEU +实际 kernel symbol +``` + +## 复用已安装 FlashInfer + +适配器可以实例化 MetaX FlashInfer 的 header-only attention template,而不调用 +Python wrapper。优势是直接获得架构专用 MMA、permuted shared layout、预取和 +在线 softmax;风险包括: + +- 依赖评测环境的安装路径和头文件版本; +- adapter 参数结构必须与模板契约匹配; +- planner kernel、workspace 和首次分配可能进入时间; +- 模板支持的 shape/dtype/mask 可能有限; +- 不能把调用官方 AOT baseline 冒充自定义 kernel。 + +## Planner 模式 + +复杂 ragged/sparse 算子可先生成 `request_indices`、tile indices、valid mask 和 +chunk 计划,再启动主 kernel。planner 增加固定开销,却可简化主循环和负载均衡。 +是否采用由典型任务粒度决定,tiny path 通常需要直接路径。 diff --git a/ref/03_backends/tilelang/generated_code_review.md b/ref/03_backends/tilelang/generated_code_review.md new file mode 100644 index 0000000..a939128 --- /dev/null +++ b/ref/03_backends/tilelang/generated_code_review.md @@ -0,0 +1,41 @@ +# TileLang 生成代码审查 + +## Host launcher + +检查: + +```text +kernel symbol +grid/block +dynamic shared memory +launch bounds +参数是否被常量化/删除 +是否出现额外 kernel 或同步 +``` + +## Device kernel + +主循环逐项标记: + +- global load/store 宽度和地址连续性; +- shared 写入和 shared->fragment 读取; +- MMA 数量、shape 和 operand 顺序; +- reduction 使用 wave shuffle 还是 shared workspace; +- `__syncthreads()` 数量和依赖原因; +- mask/尾部条件是否留在热循环; +- exp/div/convert/copy 是否重复; +- thread-local 数组是否可能 spill。 + +## 差分规则 + +1. 先规范化 kernel symbol 再 diff。 +2. 若设备代码相同,候选标记为 no-op。 +3. 若只改变地址表达式,确认是否真的改变 bank/事务。 +4. 若 barrier 增加,即使源码看似预取,也必须先局部 A/B。 +5. 代数运算减少不等于依赖链缩短,查看展开后实际表达式。 + +## 常见反例 + +- 添加 swizzle annotation,但生成 CU 完全相同。 +- 把 V copy 提前,编译器因两个 reduction 的 shared workspace 新增 barrier。 +- 因式分解 softmax 表达式,编译器原本已复用公共子表达式,新顺序反而更慢。 diff --git a/ref/03_backends/tilelang/programming_and_compilation.md b/ref/03_backends/tilelang/programming_and_compilation.md new file mode 100644 index 0000000..f02e8aa --- /dev/null +++ b/ref/03_backends/tilelang/programming_and_compilation.md @@ -0,0 +1,38 @@ +# TileLang 编程与编译 + +## 编译链 + +```text +Python DSL / PrimFunc +-> TileLang lowering +-> layout inference / pipeline planning / verification +-> host_kernel.cu + device_kernel.cu +-> MXCC +-> host library + device binary +-> Cython 或 TVM-FFI adapter +``` + +GPU 执行的是最终设备二进制,不是 Python。性能判断必须落到生成代码。 + +## 常用存储对象 + +```text +T.alloc_shared WSM/shared +T.alloc_fragment register/MMA fragment 为主 +T.alloc_local 可能是 register,也可能形成 private memory +``` + +## JIT 设计 + +cache key 必须覆盖所有改变 tensor shape、grid、tile、分支、dtype、head、mask 或 +代码生成的参数。builder、PrimFunc 名称和 cache identity 在候选版本中同时升级。 + +计时入口不得重复 JIT、分配临时张量、同步或加载其他 runtime。 + +## 当前 MetaX 环境经验 + +- 使用 `execution_backend="cython"` 可绕开曾出现的 TVM-FFI host export 问题。 +- TileLang-only 进程避免与 FlashInfer 默认 TVM/host toolchain 相互污染。 +- `TL_ENABLE_FAST_MATH` 必须经过数值验证。 +- `TL_DISABLE_DATA_RACE_CHECK` 只在并行所有权已经证明时启用。 +- `T.Pipelined(num_stages=2)` 不是自动加速;先证明 buffer 生命周期和资源预算。 diff --git a/ref/04_profiling/mcprofiler.md b/ref/04_profiling/mcprofiler.md new file mode 100644 index 0000000..3089bae --- /dev/null +++ b/ref/04_profiling/mcprofiler.md @@ -0,0 +1,37 @@ +# mcProfiler + +## CLI 要点 + +```text +--kernelnames 过滤设备 kernel symbol +--kernelname 不是过滤参数 +--per-kernel 生成独立 kernel 报告 +--counts N 限制匹配 kernel 数量 +--single-pass 用有限事件推断全局计数,适合大 case 的快速趋势分析 +``` + +当前版本使用显式 `--metrics` 比 `--headnames` 更稳定。只请求少量不完整指标可能 +使报告组装器缺少 CE/ISU 字段;保留 Total Cycles、AP busy 和必要基础组。 + +## 推荐核心指标 + +```text +Total Cycles +AP busy Duty +AP MMA Duty ratio +ISU stall cycles layout +VL1 Hit Rate +L2C Hit Rate +Global Memory Read/Write bytes +shared memory access efficiency +Achieved waves +Dispatched waves +``` + +第二组可补充 MTE、STE、MMA、VLS、L2C duty。每次运行保存完整 output 目录, +分析 `1_.txt/.json`,不要只看 `report.txt`。 + +## UI + +Windows mcProfiler UI 通过 SSH 配置 Linux 采样并展示报告。已有 Linux CLI 时 UI +不是采样必需条件,只是可视化入口。 diff --git a/ref/04_profiling/mctracer.md b/ref/04_profiling/mctracer.md new file mode 100644 index 0000000..d093846 --- /dev/null +++ b/ref/04_profiling/mctracer.md @@ -0,0 +1,35 @@ +# mcTracer + +## 用途 + +mcTracer 是 timeline 和 launch metadata 工具,不负责解释 kernel 内部 pipeline。 + +典型命令: + +```bash +/opt/maca/bin/mcTracer \ + --mctx \ + --odname \ + --name tracer_out \ + python +``` + +## 提取字段 + +```text +kernel name, ts, dur +grid, block +dynamic/static shared +registers/thread +private memory +occupancy metadata +queue/submit/start/complete timestamps +mcLaunchKernel duration +``` + +## 解释陷阱 + +- 多次异步入队时,后续 `queue_ts -> start_ts` 包含等待前序 kernel 的时间。 +- 正式区间应按脚本的 first launch、warmup 和 measured repeats 精确切片。 +- kernel 间 gap 很小且设备占比接近 100% 时,优化 host wrapper 收益有限。 +- mcTracer 不能区分 MMA、shared conflict、barrier 或 cache 瓶颈。 diff --git a/ref/04_profiling/metric_dictionary.md b/ref/04_profiling/metric_dictionary.md new file mode 100644 index 0000000..3ba2442 --- /dev/null +++ b/ref/04_profiling/metric_dictionary.md @@ -0,0 +1,19 @@ +# 性能指标字典 + +| 指标 | 回答的问题 | 不能单独证明什么 | +|---|---|---| +| Total Cycles | kernel 总设备工作周期 | 具体瓶颈来源 | +| AP busy Duty | AP 是否有工作 | MMA 是否有效利用 | +| MMA Duty | 矩阵 pipeline 活跃比例 | operand 是否高效、峰值吞吐 | +| MTE Duty | 数据搬运 pipeline 活跃比例 | 一定是 HBM 带宽瓶颈 | +| STE Duty | 标量/特殊 pipeline 活跃比例 | 某条源码语句的成本 | +| VLS Duty | 向量 load/store 活跃比例 | 工具返回 0 时一定无访问 | +| L2C Duty | L2 active 时的繁忙比例 | cache miss 一定高 | +| VL1/L2 hit | cache locality | global 字节一定少 | +| Global bytes | 设备观察的读写趋势 | `single-pass` 下精确理论字节 | +| shared efficiency | 非冲突 shared 访问比例 | barrier 数量 | +| WSM stall | shared/workgroup 路径等待 | 只由 bank conflict 导致 | +| VLS pipeline stall | load/store pipeline 等待 | 一定来自 global memory | +| Achieved waves | 实际完成 wave 数 | occupancy 百分比 | + +指标必须与生成代码、资源和时间联合解释。比较时使用相同工具参数和目标 kernel。 diff --git a/ref/04_profiling/profiling_workflow.md b/ref/04_profiling/profiling_workflow.md new file mode 100644 index 0000000..e6645f3 --- /dev/null +++ b/ref/04_profiling/profiling_workflow.md @@ -0,0 +1,28 @@ +# 性能分析工作流 + +## 1. 稳定基线 + +TileLang/CUDA kernel 单独运行;JIT 和输入生成在计时外。记录 median/P10/P90、 +样本数、warmup 和环境快照。 + +## 2. 资源与生成代码 + +先获得 grid/block/shared/register/private,再看主循环 CU。资源超限或生成 no-op +时无需进入 profiler。 + +## 3. mcTracer + +回答:目标 kernel 是谁、运行多久、是否连续、是否混入其他 kernel/memcpy、 +host launch 是否构成空隙、实际资源是多少。 + +## 4. mcProfiler + +只对已确认 symbol 使用 `--kernelnames`。先采核心指标,再按需要采 pipeline duty。 +per-kernel 报告优先于 aggregate report。 + +## 5. 交叉验证 + +- profiler cycles/time 应与普通 benchmark 同方向。 +- 两次 per-kernel 样本应接近。 +- `--single-pass` 全局流量主要用于同口径趋势。 +- 修改后同时比较时间、资源、stall、duty 和生成代码。 diff --git a/ref/05_optimization_patterns/mma_pipeline_and_prefetch.md b/ref/05_optimization_patterns/mma_pipeline_and_prefetch.md new file mode 100644 index 0000000..1d32653 --- /dev/null +++ b/ref/05_optimization_patterns/mma_pipeline_and_prefetch.md @@ -0,0 +1,34 @@ +# MMA、流水线与预取 + +## MMA 映射 + +- M/N/K 与硬件 MMA 基元对齐。 +- QK 和 PV 的输出 shape 可能导致不同 fragment layout。 +- policy 修改必须覆盖所有生产/消费同一 fragment 的 op。 +- layout 转换若需要 shared staging,先计算资源是否可容纳。 + +## 有效流水线 + +流水线目标是在当前计算期间搬运下一 tile,而不是简单设置 `num_stages=2`。 + +典型顺序: + +```text +prefetch K(next) global -> register +stage K(current) register -> shared +prefetch V(current) global -> register +QK MMA +stage V(current) register -> shared +softmax +PV MMA +``` + +需要独立确认 copy 是否异步、buffer 是否双缓冲、barrier 是否减少、shared 是否 +允许更多 stage,以及在线状态是否存在严格循环依赖。 + +## 验收信号 + +- 生成代码中的 load 与 MMA 交错,而不是全部串行。 +- barrier 不增加或关键等待缩短。 +- MTE/WSM stall 降低、MMA duty 上升。 +- private memory 仍为 0 或可接受。 diff --git a/ref/05_optimization_patterns/reduction_softmax_and_control.md b/ref/05_optimization_patterns/reduction_softmax_and_control.md new file mode 100644 index 0000000..51160bb --- /dev/null +++ b/ref/05_optimization_patterns/reduction_softmax_and_control.md @@ -0,0 +1,27 @@ +# Reduction、Softmax 与控制流 + +## Reduction + +优先使用 wave 内 reduction;跨 wave 时检查 shared workspace、barrier 和 bank +conflict。复用 scratch 可以降资源,但不能让不同 reduction 生命周期重叠。 + +## 在线 Softmax + +稳定更新通常维护 running max、denominator 和 output numerator: + +```text +m_new = max(m_old, tile_max) +alpha = exp(m_old - m_new) +d_new = d_old * alpha + tile_sum +o_new = o_old * alpha + P @ V +``` + +常见成本是两次 reduction、exp、FP32/BF16 转换和整行 output rescale。优化时 +必须保持 numerator/denominator 同一尺度。 + +## 控制流 + +- 完全可见 tile 与 frontier/tail tile 分开,可删除大部分逐元素 mask。 +- branch 省下的恒等算术可能小于 predicate/divergence 成本,必须 A/B。 +- 代数等价式可能改变依赖链和舍入,先看生成代码再做数值测试。 +- 避免热循环中重复除法;通常每行最终一次 reciprocal 再乘。 diff --git a/ref/05_optimization_patterns/specialization_and_load_balance.md b/ref/05_optimization_patterns/specialization_and_load_balance.md new file mode 100644 index 0000000..fab2980 --- /dev/null +++ b/ref/05_optimization_patterns/specialization_and_load_balance.md @@ -0,0 +1,31 @@ +# 特化、调度与负载均衡 + +## 编译期特化 + +当总长度等于 `batch * max_len` 且每段长度不超过 `max_len` 时,可以证明所有段 +等长,从而删除 indptr load、无效 tile guard 和动态边界。所有这类推理必须写出 +数学证明,不能仅依赖测试数据。 + +常见 regime: + +```text +tiny / launch-bound +short dense +long dense +ragged +strongly asymmetric +``` + +每个 regime 可以使用不同 tile,但 dispatch 本身必须低成本且在 JIT key 中体现。 + +## 负载均衡 + +causal、稀疏和 ragged 工作量通常不均。若重 CTA 最后提交,会形成 kernel 尾部。 +可尝试: + +- 按预计工作量降序映射逻辑 tile; +- planner 生成紧凑 tile 列表; +- persistent CTA 动态取任务; +- 超长 reduction/attention 使用 partition + merge。 + +反向提交只改变物理 block 到逻辑任务的映射,不应改变输出所有权和数学结果。 diff --git a/ref/05_optimization_patterns/tiling_ownership_and_memory.md b/ref/05_optimization_patterns/tiling_ownership_and_memory.md new file mode 100644 index 0000000..18aaa5d --- /dev/null +++ b/ref/05_optimization_patterns/tiling_ownership_and_memory.md @@ -0,0 +1,40 @@ +# Tiling、所有权与存储复用 + +## 选择 CTA 所有权 + +先决定一个 CTA 产生哪些输出,再决定 tile。好的所有权应减少跨 CTA 重复输入、 +避免 merge,并产生足够并行度。GQA、grouped convolution、batched reduction 等 +场景可以让共享输入的一组输出归同一 CTA。 + +## Tile 不是越小越好 + +小 tile 通常降低 shared/register 并提高驻留,但会增加 CTA 数、循环次数、 +边界处理和重复加载。大 tile 减少重复工作,却可能只允许单 CTA 驻留并降低 +负载均衡。必须同时计算: + +```text +CTA 数 +每 CTA 主循环次数 +全局重复读取 +softmax/reduction 更新次数 +shared/register +resident CTA/AP +``` + +## 生命周期复用 + +只有不同时存活的 buffer 才能安全复用。复用 K/V shared 前画出: + +```text +K write -> QK read complete -> storage reusable +V write -> PV read complete -> next K overwrite +``` + +编译器可能因 reduction workspace 或保守 alias 分析插入额外 barrier。最终以生成 +代码为准。 + +## Q 常驻 shared 或 register + +Q 常驻 shared 简单但占据整个循环资源;若能在循环前搬入 register fragment, +shared 可以复用给 K/V 双缓冲,从而降低 footprint 和同步。代价是 register 增长, +必须检查 spill 和 active waves。 diff --git a/ref/06_failure_catalog/common_failures.md b/ref/06_failure_catalog/common_failures.md new file mode 100644 index 0000000..fecc9de --- /dev/null +++ b/ref/06_failure_catalog/common_failures.md @@ -0,0 +1,35 @@ +# 常见失败目录 + +## 编译/JIT + +| 症状 | 常见原因 | 处理 | +|---|---|---| +| `Target triple should not be empty` | TVM-FFI host export target 缺失 | 使用已验证 adapter,隔离 runtime | +| `__macro_mxcc.h` not found | 混合 runtime 选择错误 host 编译路径 | TileLang-only 进程 | +| layout infer conflict | producer/consumer fragment 线程布局不同 | 统一 shape/policy 或显式合法 staging | +| parallel-loop warning/error | 多线程写入所有权无法证明 | 重写索引,避免只关闭检查掩盖 race | +| stale kernel | builder/key/symbol 未变化 | 所有身份同时版本化 | + +## 正确性 + +- bottom-right causal offset 写错:检查 `kv_len - q_len`。 +- ragged tail 读到下一请求:copy tail 必须显式补零/屏蔽。 +- 无效 CTA 只禁止写回但仍执行主循环:设置 zero-trip loop。 +- shared 生命周期覆盖过早:根据生成 barrier 和数据依赖检查。 +- layout policy 改变后 fragment 语义不一致。 + +## 性能回退 + +- 小 tile 提高驻留但加倍主循环和输入重复读取。 +- 提前 copy 导致 compiler 新增 barrier。 +- 条件跳过恒等操作,分支成本更高。 +- swizzle annotation 生成 no-op。 +- 表达式运算符减少,但关键依赖链变长。 + +## 测量 + +- JIT/首次分配进入时间。 +- OJ baseline 在不同提交间变化。 +- aggregate profiler 混入随机初始化和检查 kernel。 +- async queue wait 被误认为单次 launch 延迟。 +- `single-pass` 推断字节被当作精确理论流量。 diff --git a/ref/07_case_studies/flashinfer_ragged_prefill/README.md b/ref/07_case_studies/flashinfer_ragged_prefill/README.md new file mode 100644 index 0000000..7240f6e --- /dev/null +++ b/ref/07_case_studies/flashinfer_ragged_prefill/README.md @@ -0,0 +1,31 @@ +# FlashInfer Ragged Prefill 案例 + +这是知识库的第一个完整案例,用于展示通用流程,不代表其他算子应复制相同 tile。 + +## 契约摘要 + +```text +BF16 Q/K/V/output +FP32 QK/softmax/output accumulation +ragged NHD +Q heads / KV heads = 32 / 4 +GQA group = 8 +head_dim_qk = head_dim_vo = 128 +bottom-right causal mask +``` + +## 当前结论 + +- TileLang 当前最佳:`opt_012_dense_softmax_cleanup.py`。 +- CUDA MACA 当前最佳:`opt_004_flashinfer_mma_adapter.cu`。 +- TileLang 长路径已实现 packed GQA、M128/N64、reverse dense scheduling 和 + 在线 softmax,但仍受 53,248 B shared、单 CTA/AP、WSM/VLS stall 限制。 +- FlashInfer adapter 使用 C500 专用 FA2 kernel、register-resident Q、并行 K/V + staging 和预取,长 case 明显更接近硬件能力。 + +## 文档 + +- `tilelang_history.md`:TileLang 版本及有效/失败方向。 +- `cudamaca_history.md`:CUDA MACA 演进。 +- `case4_profiler.md`:opt_012 case 4 证据链。 +- `tilelang_vs_flashinfer.md`:两种实现逻辑比较。 diff --git a/ref/07_case_studies/flashinfer_ragged_prefill/case4_profiler.md b/ref/07_case_studies/flashinfer_ragged_prefill/case4_profiler.md new file mode 100644 index 0000000..75c18c5 --- /dev/null +++ b/ref/07_case_studies/flashinfer_ragged_prefill/case4_profiler.md @@ -0,0 +1,39 @@ +# opt_012 case 4 证据链 + +Case:`batch=1, q=kv=16384, causal`。 + +## mcTracer + +```text +kernel median: 46.012800 ms +20-launch device span target share: 99.994214% +grid: (1024, 4, 1) +block: (512, 1, 1) +dynamic shared: 53,248 B +registers/thread: 254 +private memory: 0 +MT-register occupancy metadata: 49% +shared occupancy metadata: 81% +``` + +launch/gap 可忽略,瓶颈位于单个设备 kernel 内。shared footprint 排除双 CTA/AP。 + +## mcProfiler + +| Metric | opt_007 | opt_012 | 变化 | +|---|---:|---:|---:| +| Total cycles | 55,369.05 K | 52,042.51 K | -6.01% | +| AP busy | 95.64% | 99.29% | +3.65 pp | +| MMA duty | 15.03% | 20.14% | +5.11 pp | +| shared efficiency | 79.62% | 74.04% | -5.58 pp | +| L2 hit | 95.24% | 97.50% | +2.26 pp | +| global read, single-pass | 711.9 MB | 310.8 MB | 趋势下降 | + +`wsm_stall` 下降 8.20% 但仍主导;`vls_pipeline_stall` 增长约 5.7 倍。 +生成 CU 每个 KV tile 有 5 个 barriers,PV 从 shared 读取 V 时存在标量 BF16 +访问。后续 policy/layout 实验受到 fragment 和 shared 预算限制。 + +## 结论 + +opt_012 的工作削减真实有效,但没有改变驻留。下一数量级提升需要重构数据驻留/ +流水线,而不是继续做无 profile 证据的 softmax 微调。 diff --git a/ref/07_case_studies/flashinfer_ragged_prefill/cudamaca_history.md b/ref/07_case_studies/flashinfer_ragged_prefill/cudamaca_history.md new file mode 100644 index 0000000..520c3c2 --- /dev/null +++ b/ref/07_case_studies/flashinfer_ragged_prefill/cudamaca_history.md @@ -0,0 +1,22 @@ +# CUDA MACA 版本历史摘要 + +| Version | 方向 | 结论 | +|---|---|---| +| 000/001 | 标量 attention 与线程调优 | 可运行但长序列极慢 | +| 002 | 64-thread physical-wave 映射 | 资源改善,仍为标量计算 | +| 003 | GQA K/V shared reuse | barrier/调度成本导致整体回退 | +| 004 | MetaX FlashInfer FA2 MMA adapter | 15/15 正确,当前 CUDA MACA 最佳 | + +opt_004 通过已安装的 header-only FlashInfer 模板实例化 C500 专用 BF16 causal +ragged prefill,不调用 Python wrapper。它增加一个 GPU planner kernel,生成请求、 +Q tile、KV tile 和 valid mask;主 kernel 使用架构专用 MMA 与流水线。 + +OJ opt_004 15 点用户 kernel 时间合计 40.367 ms,相对保留的标量 opt_001 +降低 98.81%。tiny 单 token 因固定 planner 开销相对标量路径回退,但仍优于 OJ +baseline。 + +## 可复用经验 + +- shared reuse 不能弥补标量计算与高 barrier 成本。 +- 已安装架构库可以作为实现和设计参考,但必须检查评测依赖是否合法稳定。 +- planner 对大任务有价值,对 tiny 任务需要直接 fast path。 diff --git a/ref/07_case_studies/flashinfer_ragged_prefill/tilelang_history.md b/ref/07_case_studies/flashinfer_ragged_prefill/tilelang_history.md new file mode 100644 index 0000000..306955c --- /dev/null +++ b/ref/07_case_studies/flashinfer_ragged_prefill/tilelang_history.md @@ -0,0 +1,31 @@ +# TileLang 版本历史摘要 + +完整细节以算子项目中的 `tilelang_opt.md` 为准。 + +| Version | 方向 | 结论 | +|---|---|---| +| 000 | 结构基线、TVM-FFI | host export 失败 | +| 001 | Cython adapter | 首个 OJ 可运行版本 | +| 002 | 无效 Q tile zero-trip | ragged 改善,dense 回退 | +| 003 | 编译期 dense/ragged、N32、资源削减 | 大幅改善 | +| 004 | packed GQA M128/N64 | shared 超过 64 KiB | +| 006 | packed GQA M128/N32 | 2.99x 改善 | +| 007 | K/V shared 生命周期复用,恢复 N64 | 再改善 10.97% | +| 008 | 全局 M64/N32 双驻留 | 循环翻倍,回退 5.57% | +| 009 | 只对短 equal 使用 resident-two | retained | +| 010 | 显式 swizzle annotation | 生成代码 no-op | +| 011 | dense causal 重 tile 先提交 | retained | +| 012 | softmax scratch/归一化/dense bounds cleanup | 当前最佳 | +| 013 | 放弃候选 | 不可作为父版本 | +| 014/016 | 改 GEMM warp policy | fragment layout 冲突 | +| 015 | 提前 V copy | 多一个 barrier,回退 1.95% | +| 017 | 跳过 identity rescale | branch 回退 0.53% | +| 018 | softmax scale 因式分解 | 依赖链变差,回退 1.18% | + +## 可复用经验 + +1. packed ownership 和数据复用收益通常高于局部算术修改。 +2. 驻留率与循环/重复搬运必须共同优化。 +3. causal 任务顺序可以减少调度长尾。 +4. fragment layout 是 TileLang GEMM 链的重要契约。 +5. 失败版本与生成代码解释同样具有复用价值。 diff --git a/ref/07_case_studies/flashinfer_ragged_prefill/tilelang_vs_flashinfer.md b/ref/07_case_studies/flashinfer_ragged_prefill/tilelang_vs_flashinfer.md new file mode 100644 index 0000000..c0eba30 --- /dev/null +++ b/ref/07_case_studies/flashinfer_ragged_prefill/tilelang_vs_flashinfer.md @@ -0,0 +1,89 @@ +# TileLang opt_012 与 FlashInfer MMA adapter + +## 共同逻辑 + +两者都使用: + +- packed GQA:一个 KV head 对应的 8 个 Q heads 共同处理; +- CTA Q tile 128、KV tile 64、512 threads(长路径); +- C500 BF16 `m16n16k16` MMA 完成 QK 和 PV; +- FP32 在线 softmax; +- bottom-right causal mask 和完全不可见 KV tile 裁剪; +- 每个 CTA 产生一个 packed Q tile 的完整输出,不启用 partition-KV。 + +## 调度与计划 + +TileLang 直接用三维 grid `(packed_q_tile, kv_head, batch)`,dense long 在 kernel +内部反转逻辑 Q tile;ragged 从 indptr 动态判断。 + +FlashInfer adapter 先启动 planner,生成 request/tile indices 和 valid mask。causal +主 kernel 使用交换后的 grid `(kv_head, 1, padded_tile)`,内部反转 tile 顺序。 +planner 简化主 kernel,却带来固定启动和首次 workspace 分配成本。 + +## 数据驻留 + +TileLang opt_012: + +```text +Q: global -> shared,整个 KV 循环常驻 +K/V: global -> 同一个 shared allocation,分时覆盖 +softmax/output: fragment/register +shared total: 53,248 B +``` + +FlashInfer C500 FA2: + +```text +Q: global -> shared -> register fragment,随后释放/复用 shared +K: global -> register prefetch -> permuted shared -> MMA +V: global -> register prefetch -> permuted shared -> MMA +shared union: Q 与 K+V 生命周期复用 +``` + +FlashInfer `SharedStorageQKVO` 以 union 复用 Q 和 K/V 空间;Q 进入 register 后, +K 与 V 可同时驻留在约 32 KiB shared 区域。TileLang 保留 Q shared 并只让 K/V +互相复用,因此约 53 KiB,只能单 CTA/AP。 + +## KV 主循环 + +TileLang 是串行阶段: + +```text +load K -> barrier -> QK -> reduction/softmax +-> barrier -> load V -> barrier -> PV -> next tile barrier +``` + +case-4 生成代码每轮 5 个 `__syncthreads()`。 + +FlashInfer xcore1000 ctk64 路径: + +```text +K(current) register -> shared +V(current) global -> register +sync -> QK +V register -> shared +K(next) global -> register +sync -> mask/online softmax -> PV +``` + +它使用 `enable_igroup_config`、64-bit/permuted shared 读写和专用函数选择器,让 +搬运与 MMA 更紧密交错。 + +## Mask 与边界 + +TileLang 在 KV 循环内区分 fully-visible tile 与 frontier/tail。FlashInfer 将循环 +拆成 mask-free 和 masked 两段,避免前段每轮 mask 判断。两者数学逻辑等价, +FlashInfer 的模板化分段更彻底。 + +## 为什么 FlashInfer 更快 + +第一原因不是数学公式不同,而是: + +1. Q register-resident 后释放 shared,约 32 KiB 路径支持更高驻留。 +2. K/V 分别预取到 registers,并与 QK/softmax/PV 交错。 +3. 专用 permuted shared layout 和向量 fragment 读取。 +4. 更少的循环同步和架构专用 instruction-group 调度。 +5. planner 将 ragged 控制逻辑移出主 kernel。 + +TileLang 的优势是 JIT shape 特化和 tiny/resident-two 分派;FlashInfer adapter 的 +固定 planner 对单 token 有可见开销。 diff --git a/ref/08_templates/experiment_record.md b/ref/08_templates/experiment_record.md new file mode 100644 index 0000000..9548f3a --- /dev/null +++ b/ref/08_templates/experiment_record.md @@ -0,0 +1,43 @@ +# 实验记录模板 + +```text +Operator: +Version: +Parent: +Date: +Environment: +Status: retained | rejected | failed | inconclusive | no-op +``` + +## 证据与假设 + +瓶颈证据、目标指标和为什么选择该修改。 + +## 唯一修改 + +说明改变与明确保持不变的内容。 + +## 预期 + +```text +affected cases: +expected generated-code change: +expected resource change: +acceptance signal: +risk: +``` + +## 验证 + +| 项目 | 父版本 | 候选 | 变化 | +|---|---:|---:|---:| +| correctness | | | | +| median time | | | | +| shared | | | | +| registers/private | | | | +| barrier | | | | +| target profiler metric | | | | + +## 结论 + +结论、失败原因、是否进入完整 OJ,以及可复用经验。 diff --git a/ref/08_templates/new_operator_checklist.md b/ref/08_templates/new_operator_checklist.md new file mode 100644 index 0000000..a09d600 --- /dev/null +++ b/ref/08_templates/new_operator_checklist.md @@ -0,0 +1,38 @@ +# 新算子启动清单 + +## 契约 + +- [ ] 输入/输出 shape、dtype、layout +- [ ] 数学定义和特殊参数 +- [ ] 动态 shape 上界与运行时长度 +- [ ] 正确性容限和 reference +- [ ] OJ/API 接口限制 + +## 环境 + +- [ ] GPU/slice、显存、驱动、MACA/MXCC +- [ ] TileLang/CUDA 后端版本 +- [ ] 工具链 smoke test +- [ ] 不记录凭据 + +## 基线 + +- [ ] 最小正确 kernel +- [ ] 边界正确性矩阵 +- [ ] 稳定性能样本 +- [ ] FLOPs/bytes/资源模型 +- [ ] 当前生成代码和资源报告 + +## 分析 + +- [ ] mcTracer 目标 symbol 和 timeline +- [ ] mcProfiler 核心指标 +- [ ] 主循环 barrier/load/MMA/reduction 清单 +- [ ] 第一优先瓶颈假设 + +## 实验 + +- [ ] 独立版本、父版本、唯一 JIT identity +- [ ] 正确性 -> 资源 -> A/B -> 完整评测 +- [ ] retained/rejected/failed/inconclusive +- [ ] 更新 artifact index diff --git a/ref/08_templates/profiling_report.md b/ref/08_templates/profiling_report.md new file mode 100644 index 0000000..06173cf --- /dev/null +++ b/ref/08_templates/profiling_report.md @@ -0,0 +1,38 @@ +# Profiling 报告模板 + +## Scope + +设备、软件版本、case、kernel symbol、输入 shape、采样方法。 + +## Timeline + +```text +count, min, P10, median, mean, P90, max +device span +kernel share +launch API and gaps +interleaved work +``` + +## Resources + +```text +grid/block +threads/waves +dynamic/static shared +registers/private +occupancy metadata +``` + +## Counters + +| Metric | Sample 1 | Sample 2 | Mean/reference | +|---|---:|---:|---:| + +## Generated code correlation + +将 stall/duty/bytes 映射到具体 load、barrier、MMA、reduction 或分支。 + +## Conclusion + +排除项、第一瓶颈、第二瓶颈、下一受控实验和验收标准。 diff --git a/ref/08_templates/version_decision_log.md b/ref/08_templates/version_decision_log.md new file mode 100644 index 0000000..e77354b --- /dev/null +++ b/ref/08_templates/version_decision_log.md @@ -0,0 +1,21 @@ +# 版本决策记录模板 + +| Version | Parent | Direction | Correctness | Performance | Decision | Evidence | +|---|---|---|---|---|---|---| + +## 当前最佳 + +```text +source: +submission entry hash: +validated cases: +performance baseline: +known bottleneck: +``` + +## 失败版本规则 + +- 编译失败与错误答案不能提供性能结论。 +- 环境失败不能归类为算法回退。 +- no-op 必须有生成代码 diff 证据。 +- 放弃版本不能作为后续父版本,除非重新验证。 diff --git a/ref/09_artifact_index/flashinfer_ragged_prefill.md b/ref/09_artifact_index/flashinfer_ragged_prefill.md new file mode 100644 index 0000000..dfdd8f4 --- /dev/null +++ b/ref/09_artifact_index/flashinfer_ragged_prefill.md @@ -0,0 +1,66 @@ +# FlashInfer Ragged Prefill 原始资料索引 + +项目根目录: + +```text +/data/operator_task_package/flashinfer_task_package/kernel_ops/FlashinferRaggedPrefill +``` + +## 契约与评测 + +```text +/data/operator_task_package/flashinfer_task_package/xpuoj_problem/problem_20001/Agent 推理算子库优化 - FlashInfer Ragged Prefill.md +workflows/references/xpuoj_tilelang_evaluation_guide.md +``` + +## 版本日志 + +```text +tilelang_opt.md +cudamaca_opt.md +tilelang/opt_000_...py -> opt_018_...py +cudamaca/opt_000_...cu -> opt_004_flashinfer_mma_adapter.cu +``` + +## 通用原始参考 + +```text +workflows/references/c500_device_properties.md +workflows/references/mxmaca_programming_model.md +workflows/references/mxmaca_memory_hierarchy.md +workflows/references/mxmaca_matrix_instructions.md +workflows/references/mxmaca_shuffle_and_wave.md +workflows/references/mxcc_compiler_and_profiler.md +workflows/references/mcflashinfer_kernel_notes.md +workflows/references/tilelang_kernel_optimization_directions.md +``` + +## 64 GiB profiling + +```text +results/tilelang_64g/opt_007_case4_mctracer_analysis_64g.md +results/tilelang_64g/opt_007_case4_mcprofiler_analysis_64g.md +results/tilelang_64g/opt_012_case4_mctracer_analysis_64g.md +results/tilelang_64g/opt_012_case4_mcprofiler_analysis_64g.md +results/tilelang_64g/mctracer_opt012_case4/ +results/tilelang_64g/mcprofiler_opt012_case4_targeted/ +results/tilelang_64g/mcprofiler_opt012_case4_duty/ +``` + +## 生成代码 + +```text +results/tilelang_64g/opt_007_case4_device_kernel.cu +results/tilelang_64g/opt_007_case4_host_kernel.cu +results/tilelang_64g/opt_015_case4_device_kernel.cu +results/tilelang_64g/opt_018_case4_device_kernel.cu +``` + +## OJ 结果 + +```text +results/tilelang/tilelang_oj_results_opt_*.csv/.md +results/cudamaca/cudamaca_oj_results_opt_*.csv/.md +``` + +本索引不复制原始产物。若项目移动,应更新此文件和案例内链接。 diff --git a/ref/README.md b/ref/README.md new file mode 100644 index 0000000..170a5d4 --- /dev/null +++ b/ref/README.md @@ -0,0 +1,51 @@ +# 算子优化参考知识库 + +本目录面向后续不同算子的优化工作,不以某一个算子为中心。内容分为通用方法、 +MetaX C500 架构、TileLang/CUDA MACA 后端、性能分析、优化模式、失败案例和 +可复用模板。`flashinfer_ragged_prefill` 是第一个完整案例。 + +## 使用入口 + +新算子从以下顺序开始: + +1. 复制 `08_templates/new_operator_checklist.md` 建立任务清单。 +2. 阅读 `01_methodology/operator_optimization_lifecycle.md`。 +3. 根据 `01_methodology/performance_modeling.md` 建立 FLOPs、字节数和资源预算。 +4. 按 `04_profiling/profiling_workflow.md` 收集证据。 +5. 每个候选填写 `08_templates/experiment_record.md`,不得只记录成功版本。 +6. 使用 `01_methodology/optimization_decision_tree.md` 选择下一步。 + +## 内容可信度 + +架构和工具信息使用以下标签: + +- `OFFICIAL`:来自官方文档或安装包源码。 +- `RUNTIME`:来自当前设备 API、`mx-smi` 或工具输出。 +- `COMPILER`:来自生成代码或编译器资源报告。 +- `PROFILE`:来自 mcTracer/mcProfiler 实测。 +- `INFERENCE`:根据证据推断,仍需实验验证。 + +容器显存容量、切片比例、驱动版本属于环境事实,不自动等于芯片固定规格。 + +## 维护规则 + +- 原始代码、日志、JSON、CSV 和 PDF 保留在各算子项目中;本库只保存方法、 + 结论和索引,避免复制后出现多个不一致版本。 +- 版本结论必须标明 `retained`、`rejected`、`inconclusive` 或 `failed`。 +- 性能结论必须给出原始 kernel 时间、测量环境、样本数和比较基线。 +- 不在文档中记录 SSH 密码、访问令牌或其他凭据。 +- TileLang 优化必须同时检查 DSL、生成 CU 和设备指标。 + +## 目录 + +```text +01_methodology 通用优化生命周期、性能模型和决策树 +02_architecture MetaX C500 执行模型、存储和资源事实 +03_backends TileLang 与 CUDA MACA 编程/编译经验 +04_profiling mcTracer、mcProfiler 和指标解释 +05_optimization_patterns 可跨算子复用的优化模式 +06_failure_catalog 编译、正确性、性能和测量失败 +07_case_studies 完整算子案例 +08_templates 新任务和实验记录模板 +09_artifact_index 原始资料位置索引 +```