From ce82829fc1eba7f4ca32d9a2cdce5b2dd0ba1a18 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Fri, 23 Jun 2017 17:54:27 -0500 Subject: [PATCH] hsa-runtime integration Change-Id: I48968966ffe164218ebff88d0e3a1268e96bf1dd [ROCm/ROCR-Runtime commit: 4174f07fd15de55e2bb50d9cd99be73e94e112ed] --- .../CMakeLists.txt | 6 +- .../Readme.txt | 15 +- .../cmake_modules/exportToolFlags.cmake | 0 .../cmake_modules/validateBldEnv.cmake | 0 .../doc/HSA_ven_amd_aqlprofile_api.pptx} | Bin 1114443 -> 1114397 bytes .../HSA_ven_amd_aqlprofile_api_v1_2_0.docx | Bin 0 -> 85703 bytes .../gfxip/gfx8/features_bonaire.h | 0 .../gfxip/gfx8/features_hainan.h | 0 .../gfxip/gfx8/features_oland.h | 0 .../gfxip/gfx8/features_pitcairn.h | 0 .../gfxip/gfx8/features_tahiti.h | 0 .../gfxip/gfx8/features_tiran.h | 0 .../gfxip/gfx8/features_verde.h | 0 .../gfxip/gfx8/gfx8_utils.h | 0 .../gfxip/gfx8/si_ci_vi_merged_enum.h | 0 .../gfxip/gfx8/si_ci_vi_merged_mask.h | 0 .../gfxip/gfx8/si_ci_vi_merged_offset.h | 0 .../gfx8/si_ci_vi_merged_pm4_it_opcodes.h | 0 .../gfxip/gfx8/si_ci_vi_merged_pm4cmds.h | 0 .../gfxip/gfx8/si_ci_vi_merged_shift.h | 0 .../gfxip/gfx8/si_ci_vi_merged_sq_reg.h | 0 .../gfxip/gfx8/si_ci_vi_merged_sq_uc_reg.h | 0 .../gfxip/gfx8/si_ci_vi_merged_typedef.h | 0 .../gfxip/gfx8/si_pm4defs.h | 0 .../gfxip/gfx9/f32_ce_pm4_packets_vg10.h | 0 .../gfxip/gfx9/f32_me_pm4_packets_vg10.h | 0 .../gfxip/gfx9/f32_mec_aql_packets_vg10.h | 0 .../gfxip/gfx9/f32_mec_cmn_structs_vg10.h | 0 .../gfxip/gfx9/f32_mec_pm4_packets_vg10.h | 0 .../gfxip/gfx9/f32_mes_pm4_packets_vg10.h | 0 .../gfxip/gfx9/f32_pfp_pm4_packets_vg10.h | 0 .../gfxip/gfx9/gfx9_enum.h | 0 .../gfxip/gfx9/gfx9_mask.h | 0 .../gfxip/gfx9/gfx9_offset.h | 0 .../gfxip/gfx9/gfx9_pm4_it_opcodes.h | 0 .../gfxip/gfx9/gfx9_pm4defs.h | 0 .../gfxip/gfx9/gfx9_shift.h | 0 .../gfxip/gfx9/gfx9_typedef.h | 0 .../gfxip/gfx9/gfx9_utils.h | 0 .../src/CMakeLists.txt | 14 +- .../src/commandwriter/CMakeLists.txt | 0 .../src/commandwriter/cmdwriter.h | 0 .../src/commandwriter/gfx8_cmds.h | 0 .../src/commandwriter/gfx8_cmdwriter.cpp | 0 .../src/commandwriter/gfx8_cmdwriter.h | 0 .../src/commandwriter/gfx9_cmds.h | 0 .../src/commandwriter/gfx9_cmdwriter.cpp | 0 .../src/commandwriter/gfx9_cmdwriter.h | 0 .../src/core}/CMakeLists.txt | 0 .../src/core}/amd_aql_pm4_ib_packet.h | 0 .../src/core}/aql_profile.cpp | 292 ++++++++++------- .../hsa-amd-aqlprofile/src/core/aql_profile.h | 40 +++ .../src/core/aql_profile_exception.h | 34 ++ .../src/core}/gfx8_factory.cpp | 18 +- .../src/core}/gfx9_factory.cpp | 20 +- .../src/core}/legacy_pm4.cpp | 5 +- .../hsa-amd-aqlprofile/src/core/logger.h | 137 ++++++++ .../hsa-amd-aqlprofile/src/core/pm4_factory.h | 157 +++++++++ .../src/core}/populate_aql.cpp | 3 +- .../src/perfcounter/CMakeLists.txt | 0 .../src/perfcounter/gfx8_block_info.cpp | 0 .../src/perfcounter/gfx8_block_info.h | 0 .../src/perfcounter/gfx8_perf_counter.cpp | 28 +- .../src/perfcounter/gfx8_perf_counter.h | 8 +- .../src/perfcounter/gfx9_block_info.cpp | 8 +- .../src/perfcounter/gfx9_block_info.h | 6 +- .../src/perfcounter/gfx9_perf_counter.cpp | 34 +- .../src/perfcounter/gfx9_perf_counter.h | 14 +- .../src/perfcounter/gpu_block_info.h | 0 .../src/perfcounter/perf_counter.h | 35 ++ .../src/threadtrace/CMakeLists.txt | 0 .../src/threadtrace/gfx8_thread_trace.cpp | 0 .../src/threadtrace/gfx8_thread_trace.h | 0 .../src/threadtrace/gfx9_thread_trace.cpp | 0 .../src/threadtrace/gfx9_thread_trace.h | 0 .../src/threadtrace/thread_trace.cpp | 0 .../src/threadtrace/thread_trace.h | 0 .../test/CMakeLists.txt | 9 +- .../test/binary_search/binary_search.cc | 0 .../binary_search/binary_search_kernels.cl | 0 .../test/ctrl/test.cpp | 0 .../test/ctrl/test_aql.h | 4 +- .../test/ctrl/test_assert.h | 2 +- .../test/ctrl/test_hsa.cpp | 0 .../test/ctrl/test_hsa.h | 2 +- .../test/ctrl/test_kernel.h | 0 .../test/ctrl/test_pgen.h | 5 +- .../test/ctrl/test_pgen_pmc.h | 70 ++-- .../test/ctrl/test_pgen_sqtt.h | 25 +- .../test/ctrl/test_pmgr.cpp | 7 +- .../test/ctrl/test_pmgr.h | 16 +- .../runtime/hsa-amd-aqlprofile/test/run.sh | 30 ++ .../gfx8_simpleConvolution.hsaco | Bin .../gfx9_simpleConvolution.hsaco | Bin .../simple_convolution/simple_convolution.cl | 0 .../simple_convolution/simple_convolution.cpp | 0 .../simple_convolution/simple_convolution.h | 0 .../simple_convolution.hsail | 0 .../test/util/CMakeLists.txt | 0 .../test/util/helper_funcs.cpp | 0 .../test/util/helper_funcs.h | 0 .../test/util/hsa_rsrc_factory.cpp | 1 - .../test/util/hsa_rsrc_factory.h | 0 .../test/util/perf_timer.cpp | 0 .../test/util/perf_timer.h | 0 .../doc/HSA_ext_profile_api_v1_1_0.docx | Bin 85960 -> 0 bytes .../inc/hsa_ext_amd_aql_profile.h | 267 --------------- .../src/aqlprofile/aql_profile.h | 25 -- .../src/aqlprofile/aql_profile_exception.h | 24 -- .../src/aqlprofile/logger.h | 98 ------ .../src/aqlprofile/pm4_factory.h | 133 -------- .../src/perfcounter/perf_counter.h | 92 ------ .../hsa-runtime/core/inc/hsa_api_trace_int.h | 2 + .../hsa-runtime/core/inc/hsa_ext_interface.h | 7 + .../runtime/hsa-runtime/core/runtime/hsa.cpp | 48 ++- .../core/runtime/hsa_ext_interface.cpp | 144 +++++++++ .../hsa-runtime/core/runtime/runtime.cpp | 7 + .../runtime/hsa-runtime/inc/hsa.h | 6 +- .../runtime/hsa-runtime/inc/hsa_api_trace.h | 16 + .../hsa-runtime/inc/hsa_ven_amd_aqlprofile.h | 304 ++++++++++++++++++ 120 files changed, 1300 insertions(+), 918 deletions(-) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/CMakeLists.txt (71%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/Readme.txt (78%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/cmake_modules/exportToolFlags.cmake (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/cmake_modules/validateBldEnv.cmake (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile/doc/HSA_ext_profile_api.pptx => hsa-amd-aqlprofile/doc/HSA_ven_amd_aqlprofile_api.pptx} (89%) create mode 100644 projects/rocr-runtime/runtime/hsa-amd-aqlprofile/doc/HSA_ven_amd_aqlprofile_api_v1_2_0.docx rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/features_bonaire.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/features_hainan.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/features_oland.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/features_pitcairn.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/features_tahiti.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/features_tiran.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/features_verde.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/gfx8_utils.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/si_ci_vi_merged_enum.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/si_ci_vi_merged_mask.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/si_ci_vi_merged_offset.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/si_ci_vi_merged_pm4_it_opcodes.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/si_ci_vi_merged_pm4cmds.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/si_ci_vi_merged_shift.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/si_ci_vi_merged_sq_reg.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/si_ci_vi_merged_sq_uc_reg.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/si_ci_vi_merged_typedef.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx8/si_pm4defs.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/f32_ce_pm4_packets_vg10.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/f32_me_pm4_packets_vg10.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/f32_mec_aql_packets_vg10.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/f32_mec_cmn_structs_vg10.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/f32_mec_pm4_packets_vg10.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/f32_mes_pm4_packets_vg10.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/f32_pfp_pm4_packets_vg10.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/gfx9_enum.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/gfx9_mask.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/gfx9_offset.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/gfx9_pm4_it_opcodes.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/gfx9_pm4defs.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/gfx9_shift.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/gfx9_typedef.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/gfxip/gfx9/gfx9_utils.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/CMakeLists.txt (81%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/commandwriter/CMakeLists.txt (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/commandwriter/cmdwriter.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/commandwriter/gfx8_cmds.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/commandwriter/gfx8_cmdwriter.cpp (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/commandwriter/gfx8_cmdwriter.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/commandwriter/gfx9_cmds.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/commandwriter/gfx9_cmdwriter.cpp (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/commandwriter/gfx9_cmdwriter.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile/src/aqlprofile => hsa-amd-aqlprofile/src/core}/CMakeLists.txt (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile/src/aqlprofile => hsa-amd-aqlprofile/src/core}/amd_aql_pm4_ib_packet.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile/src/aqlprofile => hsa-amd-aqlprofile/src/core}/aql_profile.cpp (54%) create mode 100644 projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/aql_profile.h create mode 100644 projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/aql_profile_exception.h rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile/src/aqlprofile => hsa-amd-aqlprofile/src/core}/gfx8_factory.cpp (72%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile/src/aqlprofile => hsa-amd-aqlprofile/src/core}/gfx9_factory.cpp (70%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile/src/aqlprofile => hsa-amd-aqlprofile/src/core}/legacy_pm4.cpp (99%) create mode 100644 projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/logger.h create mode 100644 projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/pm4_factory.h rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile/src/aqlprofile => hsa-amd-aqlprofile/src/core}/populate_aql.cpp (99%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/perfcounter/CMakeLists.txt (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/perfcounter/gfx8_block_info.cpp (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/perfcounter/gfx8_block_info.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/perfcounter/gfx8_perf_counter.cpp (98%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/perfcounter/gfx8_perf_counter.h (94%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/perfcounter/gfx9_block_info.cpp (99%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/perfcounter/gfx9_block_info.h (97%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/perfcounter/gfx9_perf_counter.cpp (97%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/perfcounter/gfx9_perf_counter.h (90%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/perfcounter/gpu_block_info.h (100%) create mode 100644 projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/perf_counter.h rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/threadtrace/CMakeLists.txt (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/threadtrace/gfx8_thread_trace.cpp (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/threadtrace/gfx8_thread_trace.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/threadtrace/gfx9_thread_trace.cpp (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/threadtrace/gfx9_thread_trace.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/threadtrace/thread_trace.cpp (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/src/threadtrace/thread_trace.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/CMakeLists.txt (92%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/binary_search/binary_search.cc (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/binary_search/binary_search_kernels.cl (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/ctrl/test.cpp (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/ctrl/test_aql.h (97%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/ctrl/test_assert.h (91%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/ctrl/test_hsa.cpp (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/ctrl/test_hsa.h (98%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/ctrl/test_kernel.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/ctrl/test_pgen.h (96%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/ctrl/test_pgen_pmc.h (61%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/ctrl/test_pgen_sqtt.h (85%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/ctrl/test_pmgr.cpp (93%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/ctrl/test_pmgr.h (85%) create mode 100755 projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/run.sh rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/simple_convolution/gfx8_simpleConvolution.hsaco (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/simple_convolution/gfx9_simpleConvolution.hsaco (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/simple_convolution/simple_convolution.cl (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/simple_convolution/simple_convolution.cpp (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/simple_convolution/simple_convolution.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/simple_convolution/simple_convolution.hsail (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/util/CMakeLists.txt (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/util/helper_funcs.cpp (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/util/helper_funcs.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/util/hsa_rsrc_factory.cpp (99%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/util/hsa_rsrc_factory.h (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/util/perf_timer.cpp (100%) rename projects/rocr-runtime/runtime/{hsa-ext-aql-profile => hsa-amd-aqlprofile}/test/util/perf_timer.h (100%) delete mode 100644 projects/rocr-runtime/runtime/hsa-ext-aql-profile/doc/HSA_ext_profile_api_v1_1_0.docx delete mode 100644 projects/rocr-runtime/runtime/hsa-ext-aql-profile/inc/hsa_ext_amd_aql_profile.h delete mode 100644 projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.h delete mode 100644 projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile_exception.h delete mode 100644 projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/logger.h delete mode 100644 projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/pm4_factory.h delete mode 100644 projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/perf_counter.h create mode 100644 projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_ven_amd_aqlprofile.h diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/CMakeLists.txt b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/CMakeLists.txt similarity index 71% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/CMakeLists.txt rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/CMakeLists.txt index 7c69079486..bbdb0c2001 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/CMakeLists.txt +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/CMakeLists.txt @@ -25,6 +25,6 @@ add_subdirectory ( ${TEST_DIR} ${PROJECT_BINARY_DIR}/test ) # # Style format # -execute_process ( COMMAND sh -xc "/usr/bin/find ${PROJ_DIR} ${TEST_DIR} ${API_DIR} -name '*.cpp' -exec /usr/bin/clang-format -i -style=file \{\} \;" ) -execute_process ( COMMAND sh -xc "/usr/bin/find ${PROJ_DIR} ${TEST_DIR} ${API_DIR} -name '*.hpp' -exec /usr/bin/clang-format -i -style=file \{\} \;" ) -execute_process ( COMMAND sh -xc "/usr/bin/find ${PROJ_DIR} ${TEST_DIR} ${API_DIR} -name '*.h' -exec /usr/bin/clang-format -i -style=file \{\} \;" ) +execute_process ( COMMAND sh -xc "/usr/bin/find ${PROJ_DIR} ${TEST_DIR} -name '*.cpp' -exec /usr/bin/clang-format -i -style=file \{\} \;" ) +execute_process ( COMMAND sh -xc "/usr/bin/find ${PROJ_DIR} ${TEST_DIR} -name '*.hpp' -exec /usr/bin/clang-format -i -style=file \{\} \;" ) +execute_process ( COMMAND sh -xc "/usr/bin/find ${PROJ_DIR} ${TEST_DIR} -name '*.h' -exec /usr/bin/clang-format -i -style=file \{\} \;" ) diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/Readme.txt b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/Readme.txt similarity index 78% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/Readme.txt rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/Readme.txt index 13c729393b..c1165a7003 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/Readme.txt +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/Readme.txt @@ -6,9 +6,9 @@ Current library implementation supports only GFX9. The library source tree: - doc - Documantation, the API specification and the presentation - inc - Public API - - hsa_ext_amd_aql_profile.h - AMD AQL profile library public API + - hsa_ven_amd_aqlprofile.h - AMD AQL profile library public API - src - AMD AQL profile library sources - - aqlprofile - AMD AQL profile library + - core - the library sources - commandwriter - PM4 command writer originated from 'hsa-runtime/tools' - perfcounter - PM4 perfcounter manager originated from 'hsa-runtime/tools' - threadtrace - PM4 threadtrace manager originated from 'hsa-runtime/tools' @@ -19,7 +19,7 @@ The library source tree: To build the library: -$ cd .../hsa-ext-aql-profile +$ cd .../hsa-amd-aqlprofile $ mkdir build $ cd build $ cmake .. @@ -27,8 +27,9 @@ $ make To run the test: -$ cd .../hsa-ext-aql-profile/build -$ test/ctrl +$ cd .../hsa-amd-aqlprofile/build +$ export LD_LIBRARY_PATH=$PWD +$ ./test/ctrl To enable PMC profiling: @@ -37,3 +38,7 @@ $ export ROCR_ENABLE_PMC=1 To enable SQTT profiling: $ export ROCR_ENABLE_SQTT=1 + +Or to use the script: + +$ ./run.sh diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/cmake_modules/exportToolFlags.cmake b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/cmake_modules/exportToolFlags.cmake similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/cmake_modules/exportToolFlags.cmake rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/cmake_modules/exportToolFlags.cmake diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/cmake_modules/validateBldEnv.cmake b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/cmake_modules/validateBldEnv.cmake similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/cmake_modules/validateBldEnv.cmake rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/cmake_modules/validateBldEnv.cmake diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/doc/HSA_ext_profile_api.pptx b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/doc/HSA_ven_amd_aqlprofile_api.pptx similarity index 89% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/doc/HSA_ext_profile_api.pptx rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/doc/HSA_ven_amd_aqlprofile_api.pptx index a3df42bba06fc81daaf76afcb3e1ef4304d77cf8..ec356d64097a16868c2f2fdfe13786885a790802 100644 GIT binary patch delta 103363 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 z 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 W7K(u{7{46$sWbet9KziQockZ9)|ZX| diff --git a/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/doc/HSA_ven_amd_aqlprofile_api_v1_2_0.docx b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/doc/HSA_ven_amd_aqlprofile_api_v1_2_0.docx new file mode 100644 index 0000000000000000000000000000000000000000..3a1fc1bcc3d3689a8ad9aa2dcf4321e340f5bfcf GIT binary patch literal 85703 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%0A7vEX-*@ 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 - #include "aql_profile.h" + +#include +#include +#include + #include "pm4_factory.h" #include "cmdwriter.h" // commandwriter #include "perf_counter.h" // perfcounter @@ -9,6 +12,14 @@ #include "logger.h" #define PUBLIC_API __attribute__((visibility("default"))) +#define DESTRUCTOR_API __attribute__((destructor)) +#define ERR_CHECK(cond, err, msg) \ + { \ + if (cond) { \ + ERR_LOGGING << msg; \ + return err; \ + } \ + } namespace aql_profile { @@ -31,7 +42,7 @@ class CommandBufferMgr { uint32_t align(const uint32_t& size) { return (size + align_mask) & ~align_mask; } public: - CommandBufferMgr(const profile_t* profile) + explicit CommandBufferMgr(const profile_t* profile) : buffer(profile->command_buffer), postfix_size(0), info(NULL) { info = (info_t*)setPostfix(sizeof(info_t)); } @@ -44,12 +55,16 @@ class CommandBufferMgr { postfix_size = size; buffer.size -= (delta < buffer.size) ? delta : buffer.size; } + if (buffer.size == 0) + throw aql_profile_exc_msg("CommandBufferMgr::setPostfix(): buffer size set to zero"); return (buffer.size != 0) ? buffer.ptr + buffer.size : NULL; } bool setPreSize(const uint32_t& size) { bool suc = (size <= buffer.size); if (suc) info->precmds_size = size; + if (!suc) + throw aql_profile_exc_msg("CommandBufferMgr::setPreSize(): size set out of the buffer"); return suc; } @@ -62,6 +77,8 @@ class CommandBufferMgr { info->postcmds_size = size - info->precmds_size; suc = ((getPostOffset() + info->postcmds_size) <= buffer.size); } + if (!suc) + throw aql_profile_exc_msg("CommandBufferMgr::checkTotalSize(): size set out of the buffer"); return suc; } @@ -80,19 +97,55 @@ class CommandBufferMgr { } }; +static inline pm4_profile::CountersMap CountersMapCreate(const profile_t* profile, + const Pm4Factory* pm4_factory) { + pm4_profile::CountersMap countersMap; + for (const hsa_ven_amd_aqlprofile_event_t* p = profile->events; + p < profile->events + profile->event_count; ++p) { + countersMap[pm4_factory->getBlockId(p)].push_back(p->counter_id); + } + return countersMap; +} + +typedef std::vector EventsVec; +static inline EventsVec EventsVecCreate(const profile_t* profile, const Pm4Factory* pm4_factory) { + pm4_profile::CountersMap countersMap = CountersMapCreate(profile, pm4_factory); + + std::map id_map; + for (const hsa_ven_amd_aqlprofile_event_t* p = profile->events; + p < profile->events + profile->event_count; ++p) { + id_map.insert(decltype(id_map)::value_type(pm4_factory->getBlockId(p), p)); + } + + // Iterate through the list of blocks/counters to generate correct order events vector + EventsVec eventsVec; + for (pm4_profile::CountersMap::const_iterator block_it = countersMap.begin(); + block_it != countersMap.end(); ++block_it) { + const uint32_t block_id = block_it->first; + const pm4_profile::CountersVec& counters = block_it->second; + const uint32_t counter_count = counters.size(); + + for (uint32_t ind = 0; ind < counter_count; ++ind) { + eventsVec.push_back(id_map[block_id] + ind); + } + } + + return eventsVec; +} + static inline bool is_event_match(const event_t& event1, const event_t& event2) { return (event1.block_name == event2.block_name) && (event1.block_index == event2.block_index) && (event1.counter_id == event2.counter_id); } -hsa_status_t default_pmcdata_callback(hsa_ext_amd_aql_profile_info_type_t info_type, - hsa_ext_amd_aql_profile_info_data_t* info_data, +hsa_status_t default_pmcdata_callback(hsa_ven_amd_aqlprofile_info_type_t info_type, + hsa_ven_amd_aqlprofile_info_data_t* info_data, void* callback_data) { hsa_status_t status = HSA_STATUS_SUCCESS; - hsa_ext_amd_aql_profile_info_data_t* passed_data = - reinterpret_cast(callback_data); + hsa_ven_amd_aqlprofile_info_data_t* passed_data = + reinterpret_cast(callback_data); - if (info_type == HSA_EXT_AQL_PROFILE_INFO_PMC_DATA) { + if (info_type == HSA_VEN_AMD_AQLPROFILE_INFO_PMC_DATA) { if (is_event_match(info_data->pmc_data.event, passed_data->pmc_data.event)) { if (passed_data->sample_id == UINT32_MAX) { passed_data->pmc_data.result += info_data->pmc_data.result; @@ -112,14 +165,14 @@ struct sqtt_ctrl_t { uint32_t writePtr; }; -hsa_status_t default_sqttdata_callback(hsa_ext_amd_aql_profile_info_type_t info_type, - hsa_ext_amd_aql_profile_info_data_t* info_data, +hsa_status_t default_sqttdata_callback(hsa_ven_amd_aqlprofile_info_type_t info_type, + hsa_ven_amd_aqlprofile_info_data_t* info_data, void* callback_data) { hsa_status_t status = HSA_STATUS_SUCCESS; - hsa_ext_amd_aql_profile_info_data_t* passed_data = - reinterpret_cast(callback_data); + hsa_ven_amd_aqlprofile_info_data_t* passed_data = + reinterpret_cast(callback_data); - if (info_type == HSA_EXT_AQL_PROFILE_INFO_SQTT_DATA) { + if (info_type == HSA_VEN_AMD_AQLPROFILE_INFO_SQTT_DATA) { if (info_data->sample_id == passed_data->sample_id) { passed_data->sqtt_data = info_data->sqtt_data; status = HSA_STATUS_INFO_BREAK; @@ -129,83 +182,98 @@ hsa_status_t default_sqttdata_callback(hsa_ext_amd_aql_profile_info_type_t info_ return status; } -Pm4Factory::tables_t Pm4Factory::tables; +std::mutex Logger::mutex; +Logger* Logger::instance = NULL; +std::mutex Pm4Factory::mutex; +Pm4Factory::instances_t Pm4Factory::instances; + +DESTRUCTOR_API void destructor() { + Logger::Destroy(); + Pm4Factory::Destroy(); +} } // aql_profile extern "C" { -// Check if event is valid for the specific GPU -PUBLIC_API hsa_status_t hsa_ext_amd_aql_profile_validate_event( - hsa_agent_t agent, const hsa_ext_amd_aql_profile_event_t* event, bool* result) { +PUBLIC_API hsa_status_t hsa_ven_amd_aqlprofile_error_string(const char** str) { + *str = aql_profile::Logger::LastMessage().c_str(); return HSA_STATUS_SUCCESS; } -// Method to populate the provided AQL packet with profiling start commands -PUBLIC_API hsa_status_t hsa_ext_amd_aql_profile_start( - const hsa_ext_amd_aql_profile_profile_t* profile, aql_profile::packet_t* aql_start_packet) { - aql_profile::Logger logger; +// Check if event is valid for the specific GPU +PUBLIC_API hsa_status_t hsa_ven_amd_aqlprofile_validate_event( + hsa_agent_t agent, const hsa_ven_amd_aqlprofile_event_t* event, bool* result) { + hsa_status_t status = HSA_STATUS_SUCCESS; + *result = false; + try { + aql_profile::Pm4Factory* pm4_factory = aql_profile::Pm4Factory::Create(agent); + if (pm4_factory->getBlockInfo(event) != NULL) *result = true; + } catch (aql_profile::event_exception& e) { + INFO_LOGGING << e.what(); + } catch (std::exception& e) { + ERR_LOGGING << e.what(); + status = HSA_STATUS_ERROR; + } + + return status; +} + +// Method to populate the provided AQL packet with profiling start commands +PUBLIC_API hsa_status_t hsa_ven_amd_aqlprofile_start( + const hsa_ven_amd_aqlprofile_profile_t* profile, aql_profile::packet_t* aql_start_packet) { try { aql_profile::Pm4Factory* pm4_factory = aql_profile::Pm4Factory::Create(profile); - if (pm4_factory == NULL) return HSA_STATUS_ERROR; - pm4_profile::CommandWriter* cmdWriter = pm4_factory->getCommandWriter(); - if (cmdWriter == NULL) return HSA_STATUS_ERROR; - pm4_profile::DefaultCmdBuf commands; aql_profile::CommandBufferMgr cmdBufMgr(profile); - if (cmdBufMgr.getSize() == 0) return HSA_STATUS_ERROR; - if (profile->type == HSA_EXT_AQL_PROFILE_EVENT_PMC) { - pm4_profile::Pmu* pmcMgr = pm4_factory->getPmcMgr(); - if (pmcMgr == NULL) return HSA_STATUS_ERROR; - - pm4_profile::CountersMap countersMap; - for (const hsa_ext_amd_aql_profile_event_t* p = profile->events; - p < profile->events + profile->event_count; ++p) { - countersMap[pm4_factory->getBlockId(p)].push_back(p->counter_id); - } + if (profile->type == HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_PMC) { + pm4_profile::PerfCounter* pmcMgr = pm4_factory->getPmcMgr(); // Generate start commands + const pm4_profile::CountersMap countersMap = CountersMapCreate(profile, pm4_factory); pmcMgr->begin(&commands, cmdWriter, countersMap); cmdBufMgr.setPreSize(commands.Size()); // Generate stop commands const uint32_t data_size = pmcMgr->end(&commands, cmdWriter, countersMap, profile->output_buffer.ptr); - if (data_size == 0) return HSA_STATUS_ERROR; + ERR_CHECK(data_size == 0, HSA_STATUS_ERROR, "PMC mgr end(): data size set to zero"); assert(data_size <= profile->output_buffer.size); - if (data_size > profile->output_buffer.size) return HSA_STATUS_ERROR; - - } else if (profile->type == HSA_EXT_AQL_PROFILE_EVENT_SQTT) { + if (data_size > profile->output_buffer.size) { + ERR_LOGGING << "data size assertion failed, data_size(" << data_size << "), buffer size(" + << profile->output_buffer.size << ")"; + return HSA_STATUS_ERROR; + } + } else if (profile->type == HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_SQTT) { pm4_profile::ThreadTrace* sqttMgr = pm4_factory->getSqttMgr(); - if (sqttMgr == NULL) return HSA_STATUS_ERROR; pm4_profile::ThreadTraceConfig sqtt_config; sqttMgr->InitThreadTraceConfig(&sqtt_config); if (profile->parameters) { - for (const hsa_ext_amd_aql_profile_parameters_t* p = profile->parameters; + for (const hsa_ven_amd_aqlprofile_parameter_t* p = profile->parameters; p < (profile->parameters + profile->parameter_count); ++p) { switch (p->parameter_name) { - case HSA_EXT_AQL_PROFILE_PARAM_COMPUTE_UNIT_TARGET: + case HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_COMPUTE_UNIT_TARGET: sqtt_config.threadTraceTargetCu = p->value; break; - case HSA_EXT_AQL_PROFILE_PARAM_VM_ID_MASK: + case HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_VM_ID_MASK: sqtt_config.threadTraceVmIdMask = p->value; break; - case HSA_EXT_AQL_PROFILE_PARAM_MASK: + case HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_MASK: sqtt_config.threadTraceMask = p->value; break; - case HSA_EXT_AQL_PROFILE_PARAM_TOKEN_MASK: + case HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_TOKEN_MASK: sqtt_config.threadTraceTokenMask = p->value; break; - case HSA_EXT_AQL_PROFILE_PARAM_TOKEN_MASK2: + case HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_TOKEN_MASK2: sqtt_config.threadTraceTokenMask2 = p->value; break; default: - ERR_LOGGING(logger) << "Bad SQTT parameter name (" << p->parameter_name << ")"; - return HSA_STATUS_ERROR; + ERR_LOGGING << "Bad SQTT parameter name (" << p->parameter_name << ")"; + return HSA_STATUS_ERROR_INVALID_ARGUMENT; } } } @@ -213,10 +281,9 @@ PUBLIC_API hsa_status_t hsa_ext_amd_aql_profile_start( sqttMgr->setSqttDataBuff((uint8_t*)profile->output_buffer.ptr, profile->output_buffer.size); + // Control buffer registering const uint32_t status_size = sqttMgr->StatusSizeInfo(); void* status_ptr = cmdBufMgr.setPostfix(status_size); - if (status_ptr == NULL) return HSA_STATUS_ERROR; - // Control buffer registering sqttMgr->setSqttCtrlBuff((uint32_t*)status_ptr); // Generate start commands @@ -224,10 +291,12 @@ PUBLIC_API hsa_status_t hsa_ext_amd_aql_profile_start( cmdBufMgr.setPreSize(commands.Size()); // Generate stop commands sqttMgr->StopSession(&commands, cmdWriter); - } else - return HSA_STATUS_ERROR; + } else { + ERR_LOGGING << "Bad profile type (" << profile->type << ")"; + return HSA_STATUS_ERROR_INVALID_ARGUMENT; + } - if (!cmdBufMgr.checkTotalSize(commands.Size())) return HSA_STATUS_ERROR; + cmdBufMgr.checkTotalSize(commands.Size()); const aql_profile::descriptor_t pre_descr = cmdBufMgr.getPreDescr(); const aql_profile::descriptor_t post_descr = cmdBufMgr.getPostDescr(); @@ -236,7 +305,7 @@ PUBLIC_API hsa_status_t hsa_ext_amd_aql_profile_start( // Populate start aql packet aql_profile::populateAql(pre_descr.ptr, pre_descr.size, cmdWriter, aql_start_packet); } catch (std::exception& e) { - ERR_LOGGING(logger) << e.what(); + ERR_LOGGING << e.what(); return HSA_STATUS_ERROR; } @@ -244,25 +313,18 @@ PUBLIC_API hsa_status_t hsa_ext_amd_aql_profile_start( } // Method to populate the provided AQL packet with profiling stop commands -PUBLIC_API hsa_status_t hsa_ext_amd_aql_profile_stop( - const hsa_ext_amd_aql_profile_profile_t* profile, aql_profile::packet_t* aql_stop_packet) { - aql_profile::Logger logger; - +PUBLIC_API hsa_status_t hsa_ven_amd_aqlprofile_stop(const hsa_ven_amd_aqlprofile_profile_t* profile, + aql_profile::packet_t* aql_stop_packet) { try { aql_profile::Pm4Factory* pm4_factory = aql_profile::Pm4Factory::Create(profile); - if (pm4_factory == NULL) return HSA_STATUS_ERROR; - pm4_profile::CommandWriter* cmdWriter = pm4_factory->getCommandWriter(); - if (cmdWriter == NULL) return HSA_STATUS_ERROR; - aql_profile::CommandBufferMgr cmdBufMgr(profile); - if (cmdBufMgr.getSize() == 0) return HSA_STATUS_ERROR; - const aql_profile::descriptor_t post_descr = cmdBufMgr.getPostDescr(); // Populate stop aql packet + const aql_profile::descriptor_t post_descr = cmdBufMgr.getPostDescr(); aql_profile::populateAql(post_descr.ptr, post_descr.size, cmdWriter, aql_stop_packet); } catch (std::exception& e) { - ERR_LOGGING(logger) << e.what(); + ERR_LOGGING << e.what(); return HSA_STATUS_ERROR; } @@ -271,9 +333,7 @@ PUBLIC_API hsa_status_t hsa_ext_amd_aql_profile_stop( // Legacy devices, converting of the profiling AQL packet to PM4 packet blob PUBLIC_API hsa_status_t -hsa_ext_amd_aql_profile_legacy_get_pm4(const aql_profile::packet_t* aql_packet, void* data) { - aql_profile::Logger logger; - +hsa_ven_amd_aqlprofile_legacy_get_pm4(const aql_profile::packet_t* aql_packet, void* data) { try { // Populate GFX8 pm4 packet blob // Adding HSA barrier acquire packet @@ -283,7 +343,7 @@ hsa_ext_amd_aql_profile_legacy_get_pm4(const aql_profile::packet_t* aql_packet, // Adding HSA barrier release packet data = aql_profile::legacyAqlRelease(aql_packet, data); } catch (std::exception& e) { - ERR_LOGGING(logger) << e.what(); + ERR_LOGGING << e.what(); return HSA_STATUS_ERROR; } @@ -292,34 +352,33 @@ hsa_ext_amd_aql_profile_legacy_get_pm4(const aql_profile::packet_t* aql_packet, // Method for getting the profile info PUBLIC_API hsa_status_t -hsa_ext_amd_aql_profile_get_info(const hsa_ext_amd_aql_profile_profile_t* profile, - hsa_ext_amd_aql_profile_info_type_t attribute, void* value) { +hsa_ven_amd_aqlprofile_get_info(const hsa_ven_amd_aqlprofile_profile_t* profile, + hsa_ven_amd_aqlprofile_info_type_t attribute, void* value) { hsa_status_t status = HSA_STATUS_SUCCESS; - aql_profile::Logger logger; try { switch (attribute) { - case HSA_EXT_AQL_PROFILE_INFO_COMMAND_BUFFER_SIZE: + case HSA_VEN_AMD_AQLPROFILE_INFO_COMMAND_BUFFER_SIZE: *(uint32_t*)value = 0x1000; // a current approximation as 4K is big enaugh break; - case HSA_EXT_AQL_PROFILE_INFO_PMC_DATA_SIZE: + case HSA_VEN_AMD_AQLPROFILE_INFO_PMC_DATA_SIZE: *(uint32_t*)value = 0x1000; // a current approximation as 4K is big enaugh break; - case HSA_EXT_AQL_PROFILE_INFO_PMC_DATA: - reinterpret_cast(value)->pmc_data.result = 0; - status = hsa_ext_amd_aql_profile_iterate_data(profile, - aql_profile::default_pmcdata_callback, value); + case HSA_VEN_AMD_AQLPROFILE_INFO_PMC_DATA: + reinterpret_cast(value)->pmc_data.result = 0; + status = hsa_ven_amd_aqlprofile_iterate_data(profile, aql_profile::default_pmcdata_callback, + value); break; - case HSA_EXT_AQL_PROFILE_INFO_SQTT_DATA: - status = hsa_ext_amd_aql_profile_iterate_data( - profile, aql_profile::default_sqttdata_callback, value); + case HSA_VEN_AMD_AQLPROFILE_INFO_SQTT_DATA: + status = hsa_ven_amd_aqlprofile_iterate_data(profile, + aql_profile::default_sqttdata_callback, value); break; default: status = HSA_STATUS_ERROR_INVALID_ARGUMENT; - ERR_LOGGING(logger) << "Invalid attribute (" << attribute << ")"; + ERR_LOGGING << "Invalid attribute (" << attribute << ")"; } } catch (std::exception& e) { - ERR_LOGGING(logger) << e.what(); + ERR_LOGGING << e.what(); return HSA_STATUS_ERROR; } @@ -328,29 +387,26 @@ hsa_ext_amd_aql_profile_get_info(const hsa_ext_amd_aql_profile_profile_t* profil // Method for iterating the events output data PUBLIC_API hsa_status_t -hsa_ext_amd_aql_profile_iterate_data(const hsa_ext_amd_aql_profile_profile_t* profile, - hsa_ext_amd_aql_profile_data_callback_t callback, void* data) { +hsa_ven_amd_aqlprofile_iterate_data(const hsa_ven_amd_aqlprofile_profile_t* profile, + hsa_ven_amd_aqlprofile_data_callback_t callback, void* data) { hsa_status_t status = HSA_STATUS_SUCCESS; - aql_profile::Logger logger; try { aql_profile::Pm4Factory* pm4_factory = aql_profile::Pm4Factory::Create(profile); - if (pm4_factory == NULL) return HSA_STATUS_ERROR; - if (profile->type == HSA_EXT_AQL_PROFILE_EVENT_PMC) { + if (profile->type == HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_PMC) { uint32_t info_size = 0; void* info_data; uint64_t* samples = (uint64_t*)profile->output_buffer.ptr; const uint32_t sample_count = profile->output_buffer.size / sizeof(uint64_t); uint32_t sample_index = 0; - pm4_profile::Pmu* pmcMgr = pm4_factory->getPmcMgr(); - if (pmcMgr == NULL) return HSA_STATUS_ERROR; + pm4_profile::PerfCounter* pmcMgr = pm4_factory->getPmcMgr(); - for (const hsa_ext_amd_aql_profile_event_t* p = profile->events; - p < (profile->events + profile->event_count); ++p) { - const pm4_profile::GpuBlockInfo* block_info = pm4_factory->getBlockInfo(p); - if (block_info == NULL) return HSA_STATUS_ERROR; + aql_profile::EventsVec eventsVec = EventsVecCreate(profile, pm4_factory); + for (aql_profile::EventsVec::const_iterator it = eventsVec.begin(); it != eventsVec.end(); + ++it) { + const hsa_ven_amd_aqlprofile_event_t* p = *it; const pm4_profile::CntlMethod method = pm4_factory->getBlockInfo(p)->method; // A perfcounter data sample per ShaderEngine const uint32_t block_samples_count = (method == pm4_profile::CntlMethodBySe || @@ -359,46 +415,52 @@ hsa_ext_amd_aql_profile_iterate_data(const hsa_ext_amd_aql_profile_profile_t* pr : 1; for (uint32_t i = 0; i < block_samples_count; ++i) { assert(sample_index < sample_count); - if (sample_index >= sample_count) return HSA_STATUS_ERROR; + if (sample_index >= sample_count) { + ERR_LOGGING << "Bad sample index (" << sample_index << "/" << sample_count << ")"; + return HSA_STATUS_ERROR; + } - hsa_ext_amd_aql_profile_info_data_t sample_info; + hsa_ven_amd_aqlprofile_info_data_t sample_info; sample_info.sample_id = i; sample_info.pmc_data.event = *p; sample_info.pmc_data.result = samples[sample_index]; - status = callback(HSA_EXT_AQL_PROFILE_INFO_PMC_DATA, &sample_info, data); + status = callback(HSA_VEN_AMD_AQLPROFILE_INFO_PMC_DATA, &sample_info, data); if (status == HSA_STATUS_INFO_BREAK) { status = HSA_STATUS_SUCCESS; break; } if (status != HSA_STATUS_SUCCESS) { - ERR_LOGGING(logger) << "PMC data callback error, sample_id(" << i << ") status(" - << status << ")"; + ERR_LOGGING << "PMC data callback error, sample_id(" << i << ") status(" << status + << ")"; break; } ++sample_index; } } - } else if (profile->type == HSA_EXT_AQL_PROFILE_EVENT_SQTT) { + } else if (profile->type == HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_SQTT) { pm4_profile::ThreadTrace* sqttMgr = pm4_factory->getSqttMgr(); - if (sqttMgr == NULL) return HSA_STATUS_ERROR; - aql_profile::CommandBufferMgr cmdBufMgr(profile); - if (cmdBufMgr.getSize() == 0) return HSA_STATUS_ERROR; - const uint32_t status_size = sqttMgr->StatusSizeInfo(); // Control buffer was allocated as the CmdBuffer postfix partition + const uint32_t status_size = sqttMgr->StatusSizeInfo(); void* status_ptr = cmdBufMgr.setPostfix(status_size); - if (status_ptr == NULL) return HSA_STATUS_ERROR; // Control buffer registering sqttMgr->setSqttCtrlBuff((uint32_t*)status_ptr); // Validate SQTT status and normalize WRPTR - if (sqttMgr->Validate() == false) return HSA_STATUS_ERROR; + if (sqttMgr->Validate() == false) { + ERR_LOGGING << "SQTT data corrupted"; + return HSA_STATUS_ERROR; + } const uint32_t se_number = sqttMgr->getNumSe(); // Casting status pointer to SQTT control per ShaderEngine array aql_profile::sqtt_ctrl_t* sqtt_ctrl = (aql_profile::sqtt_ctrl_t*)status_ptr; - assert(status_size == sizeof(aql_profile::sqtt_ctrl_t) * se_number); - if (status_size != sizeof(aql_profile::sqtt_ctrl_t) * se_number) { + const uint32_t status_size_exp = sizeof(aql_profile::sqtt_ctrl_t) * se_number; + assert(status_size == status_size_exp); + if (status_size != status_size_exp) { + ERR_LOGGING << "Bad SQTT controll data structure" + << ", status_size(" << status_size << "), status_size_exp(" << status_size_exp + << "), se_number(" << se_number << ")"; return HSA_STATUS_ERROR; } // SQTT output buffer and capacity per ShaderEngine @@ -410,29 +472,29 @@ hsa_ext_amd_aql_profile_iterate_data(const hsa_ext_amd_aql_profile_profile_t* pr // written by hardware. The index is incremented by size of 32 bytes. uint32_t sample_size = sqtt_ctrl[i].writePtr * TT_WRITE_PTR_BLK; - hsa_ext_amd_aql_profile_info_data_t sample_info; + hsa_ven_amd_aqlprofile_info_data_t sample_info; sample_info.sample_id = i; sample_info.sqtt_data.ptr = sample_ptr; sample_info.sqtt_data.size = sample_size; - status = callback(HSA_EXT_AQL_PROFILE_INFO_SQTT_DATA, &sample_info, data); + status = callback(HSA_VEN_AMD_AQLPROFILE_INFO_SQTT_DATA, &sample_info, data); if (status == HSA_STATUS_INFO_BREAK) { status = HSA_STATUS_SUCCESS; break; } if (status != HSA_STATUS_SUCCESS) { - ERR_LOGGING(logger) << "SQTT data callback error, sample_id(" << i << ") status(" - << status << ")"; + ERR_LOGGING << "SQTT data callback error, sample_id(" << i << ") status(" << status + << ")"; break; } sample_ptr += sample_capacity; } } else { - ERR_LOGGING(logger) << "Bad profile type (" << profile->type << ")"; - status = HSA_STATUS_ERROR; + ERR_LOGGING << "Bad profile type (" << profile->type << ")"; + status = HSA_STATUS_ERROR_INVALID_ARGUMENT; } } catch (std::exception& e) { - ERR_LOGGING(logger) << e.what(); + ERR_LOGGING << e.what(); return HSA_STATUS_ERROR; } diff --git a/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/aql_profile.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/aql_profile.h new file mode 100644 index 0000000000..a7e32f6ab9 --- /dev/null +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/aql_profile.h @@ -0,0 +1,40 @@ +#ifndef _AQL_PROFILE_H_ +#define _AQL_PROFILE_H_ + +#include +#include + +#include "hsa_ven_amd_aqlprofile.h" +#include "aql_profile_exception.h" + +namespace pm4_profile { +class CommandWriter; +} + +namespace aql_profile { +typedef hsa_ven_amd_aqlprofile_descriptor_t descriptor_t; +typedef hsa_ven_amd_aqlprofile_profile_t profile_t; +typedef hsa_ven_amd_aqlprofile_info_type_t info_type_t; +typedef hsa_ven_amd_aqlprofile_data_callback_t data_callback_t; +typedef hsa_ext_amd_aql_pm4_packet_t packet_t; +typedef hsa_ven_amd_aqlprofile_event_t event_t; + +void populateAql(const void* cmd_buffer, uint32_t cmd_size, pm4_profile::CommandWriter* cmd_writer, + packet_t* aql_packet); +void* legacyAqlAcquire(const packet_t* aql_packet, void* data); +void* legacyAqlRelease(const packet_t* aql_packet, void* data); +void* legacyPm4(const packet_t* aql_packet, void* data); + +class event_exception : public aql_profile_exc_val { + public: + event_exception(const std::string& m, const event_t& ev) : aql_profile_exc_val(m, ev) {} +}; + +static std::ostream& operator<<(std::ostream& os, const event_t& ev) { + os << "event( block(" << ev.block_name << "." << ev.block_index << "), Id(" << ev.counter_id + << "))"; + return os; +} +} // namespace aql_profile + +#endif // _AQL_PROFILE_H_ diff --git a/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/aql_profile_exception.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/aql_profile_exception.h new file mode 100644 index 0000000000..210ab40ab6 --- /dev/null +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/aql_profile_exception.h @@ -0,0 +1,34 @@ +#ifndef _AQL_PROFILE_EXCEPTION_H_ +#define _AQL_PROFILE_EXCEPTION_H_ + +#include + +#include +#include + +namespace aql_profile { + +class aql_profile_exc_msg : public std::exception { + public: + explicit aql_profile_exc_msg(const std::string& msg) : str(msg) {} + virtual const char* what() const throw() { return str.c_str(); } + + protected: + std::string str; +}; + +template class aql_profile_exc_val : public std::exception { + public: + aql_profile_exc_val(const std::string& msg, const T& val) { + std::ostringstream oss; + oss << msg << "(" << val << ")"; + str = oss.str(); + } + virtual const char* what() const throw() { return str.c_str(); } + + protected: + std::string str; +}; +} // namespace aql_profile + +#endif // _AQL_PROFILE_EXCEPTION_H_ diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx8_factory.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/gfx8_factory.cpp similarity index 72% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx8_factory.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/gfx8_factory.cpp index a0ecbc4107..0694e085c2 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx8_factory.cpp +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/gfx8_factory.cpp @@ -11,7 +11,7 @@ namespace aql_profile { // GFX9 block ID mapping table -uint32_t Gfx8Factory::block_id_table[HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER] = { +uint32_t Gfx8Factory::block_id_table[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER] = { pm4_profile::kHsaViCounterBlockIdCb0, pm4_profile::kHsaViCounterBlockIdCpf, pm4_profile::kHsaViCounterBlockIdDb0, pm4_profile::kHsaViCounterBlockIdGrbm, pm4_profile::kHsaViCounterBlockIdGrbmSe, pm4_profile::kHsaViCounterBlockIdPaSu, @@ -30,11 +30,21 @@ uint32_t Gfx8Factory::block_id_table[HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER] = { pm4_profile::kHsaViCounterBlockIdCpc}; pm4_profile::CommandWriter* Gfx8Factory::getCommandWriter() { - return new pm4_profile::gfx8::Gfx8CmdWriter(false, true); + auto p = new pm4_profile::gfx8::Gfx8CmdWriter(false, true); + if (p == NULL) throw aql_profile_exc_msg("CommandWriter allocation failed"); + return p; } -pm4_profile::Pmu* Gfx8Factory::getPmcMgr() { return new pm4_profile::Gfx8PerfCounter(); } +pm4_profile::PerfCounter* Gfx8Factory::getPmcMgr() { + auto p = new pm4_profile::Gfx8PerfCounter(); + if (p == NULL) throw aql_profile_exc_msg("PerfCounter mgr allocation failed"); + return p; +} -pm4_profile::ThreadTrace* Gfx8Factory::getSqttMgr() { return new pm4_profile::Gfx8ThreadTrace(); } +pm4_profile::ThreadTrace* Gfx8Factory::getSqttMgr() { + auto p = new pm4_profile::Gfx8ThreadTrace(); + if (p == NULL) throw aql_profile_exc_msg("ThreadTrace mgr allocation failed"); + return p; +} } // aql_profile diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx9_factory.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/gfx9_factory.cpp similarity index 70% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx9_factory.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/gfx9_factory.cpp index 7a293a5e90..c6d51a3cad 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx9_factory.cpp +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/gfx9_factory.cpp @@ -11,7 +11,7 @@ namespace aql_profile { // GFX9 block ID mapping table -uint32_t Gfx9Factory::block_id_table[HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER] = { +uint32_t Gfx9Factory::block_id_table[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER] = { pm4_profile::kHsaAiCounterBlockIdCb0, kBadBlockId /*CPF*/, pm4_profile::kHsaAiCounterBlockIdDb0, @@ -42,14 +42,24 @@ uint32_t Gfx9Factory::block_id_table[HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER] = { pm4_profile::kHsaAiCounterBlockIdTcs, pm4_profile::kHsaAiCounterBlockIdWd, kBadBlockId /*CPG*/, - kBadBlockId /*CPC*/}; + pm4_profile::kHsaAiCounterBlockIdCpc}; pm4_profile::CommandWriter* Gfx9Factory::getCommandWriter() { - return new pm4_profile::gfx9::Gfx9CmdWriter(false, true); + auto p = new pm4_profile::gfx9::Gfx9CmdWriter(false, true); + if (p == NULL) throw aql_profile_exc_msg("CommandWriter allocation failed"); + return p; } -pm4_profile::Pmu* Gfx9Factory::getPmcMgr() { return new pm4_profile::Gfx9PerfCounter(); } +pm4_profile::PerfCounter* Gfx9Factory::getPmcMgr() { + auto p = new pm4_profile::Gfx9PerfCounter(); + if (p == NULL) throw aql_profile_exc_msg("PerfCounter mgr allocation failed"); + return p; +} -pm4_profile::ThreadTrace* Gfx9Factory::getSqttMgr() { return new pm4_profile::Gfx9ThreadTrace(); } +pm4_profile::ThreadTrace* Gfx9Factory::getSqttMgr() { + auto p = new pm4_profile::Gfx9ThreadTrace(); + if (p == NULL) throw aql_profile_exc_msg("ThreadTrace mgr allocation failed"); + return p; +} } // aql_profile diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/legacy_pm4.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/legacy_pm4.cpp similarity index 99% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/legacy_pm4.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/legacy_pm4.cpp index 9468b3b063..eb4044349d 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/legacy_pm4.cpp +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/legacy_pm4.cpp @@ -1,8 +1,9 @@ +#include +#include + #include #include #include -#include -#include #include "aql_profile.h" #include "amd_aql_pm4_ib_packet.h" diff --git a/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/logger.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/logger.h new file mode 100644 index 0000000000..5e7c8bbaab --- /dev/null +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/logger.h @@ -0,0 +1,137 @@ +#ifndef _LOGGER_H_ +#define _LOGGER_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace aql_profile { + +class Logger { + public: + template Logger& operator<<(const T& m) { + std::ostringstream oss; + oss << m; + if (!streaming) + log(oss.str()); + else + put(oss.str()); + streaming = true; + return *this; + } + + typedef void (Logger::*manip_t)(); + Logger& operator<<(manip_t f) { + (this->*f)(); + return *this; + } + + void begm() { messaging = true; } + void endl() { resetStreaming(); } + + static const std::string& LastMessage() { + Logger& logger = Instance(); + std::lock_guard lck(mutex); + return logger.message[GetTid()]; + } + + static Logger& Instance() { + std::lock_guard lck(mutex); + if (instance == NULL) instance = new Logger(); + return *instance; + } + + static void Destroy() { + std::lock_guard lck(mutex); + if (instance != NULL) delete instance; + instance = NULL; + } + + private: + static uint32_t GetPid() { return syscall(__NR_getpid); } + static uint32_t GetTid() { return syscall(__NR_gettid); } + + Logger() : file(NULL), dirty(false), streaming(false), messaging(false) { + const char* path = getenv("HSA_VEN_AMD_AQLPROFILE_LOG"); + if (path != NULL) { + file = fopen("/tmp/aql_profile_log.txt", "a"); + } + resetStreaming(); + } + + ~Logger() { + if (file != NULL) { + if (dirty) put("\n"); + fclose(file); + } + } + + void resetStreaming() { + std::lock_guard lck(mutex); + if (messaging) { + message[GetTid()] = ""; + } + messaging = false; + streaming = false; + } + + void put(const std::string& m) { + std::lock_guard lck(mutex); + if (messaging) { + message[GetTid()] += m; + } + if (file != NULL) { + dirty = true; + flock(fileno(file), LOCK_EX); + fprintf(file, "%s", m.c_str()); + fflush(file); + flock(fileno(file), LOCK_UN); + } + } + + void log(const std::string& m) { + const time_t rawtime = time(NULL); + tm tm_info; + localtime_r(&rawtime, &tm_info); + char tm_str[26]; + strftime(tm_str, 26, "%Y-%m-%d %H:%M:%S", &tm_info); + std::ostringstream oss; + oss << "\n<" << tm_str << std::dec << " pid" << GetPid() << " tid" << GetTid() << "> " << m; + put(oss.str()); + } + + FILE* file; + bool dirty; + bool streaming; + bool messaging; + + static std::mutex mutex; + static Logger* instance; + std::map message; +}; + +} // namespace aql_profile + +#define ERR_LOGGING \ + (aql_profile::Logger::Instance() << aql_profile::Logger::endl \ + << "Error: " << __FUNCTION__ \ + << "(): " << aql_profile::Logger::begm) +#define INFO_LOGGING \ + (aql_profile::Logger::Instance() << aql_profile::Logger::endl \ + << "Info: " << __FUNCTION__ \ + << "(): " << aql_profile::Logger::begm) + +#endif // _LOGGER_H_ diff --git a/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/pm4_factory.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/pm4_factory.h new file mode 100644 index 0000000000..0e8b320d0f --- /dev/null +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/pm4_factory.h @@ -0,0 +1,157 @@ +#ifndef _PM4_FACTORY_H_ +#define _PM4_FACTORY_H_ + +#include +#include +#include + +#include +#include +#include +#include + +#include "aql_profile.h" +#include "gpu_block_info.h" +#include "aql_profile_exception.h" + +namespace pm4_profile { +class CommandWriter; +class PerfCounter; +class ThreadTrace; +extern GpuBlockInfo Gfx9HwBlocks[]; +extern const uint32_t Gfx9HwBlockCount; +extern GpuBlockInfo Gfx8HwBlocks[]; +extern const uint32_t Gfx8HwBlockCount; +} + +namespace aql_profile { + +class BlockMap { + public: + typedef std::map map_t; + typedef map_t::const_iterator iter_t; + + void init(uint32_t* id_table, pm4_profile::GpuBlockInfo* info_table, const uint32_t& info_count) { + if (block_map.size() == 0) fill(id_table, info_table, info_count); + } + + const pm4_profile::GpuBlockInfo* get(const uint32_t& id) const { + iter_t it = block_map.find(id); + return (it != block_map.end()) ? it->second : NULL; + } + + private: + void fill(uint32_t* id_table, pm4_profile::GpuBlockInfo* info_table, const uint32_t& info_count) { + map_t info_map; + for (uint32_t i = 0; i < info_count; ++i) { + const pm4_profile::GpuBlockInfo& entry = info_table[i]; + info_map[entry.counterGroupId] = &entry; + } + for (uint32_t i = 0; i < HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER; ++i) { + iter_t it = info_map.find(id_table[i]); + if (it != info_map.end()) block_map[i] = it->second; + } + } + + map_t block_map; +}; + +class Pm4Factory { + public: + enum { kBadBlockId = UINT_MAX }; + + static Pm4Factory* Create(const hsa_agent_t agent); + static Pm4Factory* Create(const profile_t* profile) { return Create(profile->agent); } + static void Destroy(); + + virtual pm4_profile::CommandWriter* getCommandWriter() = 0; + virtual pm4_profile::PerfCounter* getPmcMgr() = 0; + virtual pm4_profile::ThreadTrace* getSqttMgr() = 0; + + const pm4_profile::GpuBlockInfo* getBlockInfo(const event_t* event) const { + const pm4_profile::GpuBlockInfo* info = block_map.get(event->block_name); + if (info == NULL) throw event_exception(std::string("Bad block, "), *event); + if (event->block_index >= info->maxInstanceCount) + throw event_exception(std::string("Bad block index, "), *event); + if (event->counter_id > info->maxEventId) + throw event_exception(std::string("Bad event ID, "), *event); + return info; + } + + uint32_t getBlockId(const event_t* event) const { + return getBlockInfo(event)->counterGroupId + event->block_index; + } + + protected: + explicit Pm4Factory(const BlockMap& map) : block_map(map) {} + virtual ~Pm4Factory() {} + + private: + typedef std::map instances_t; + + static std::mutex mutex; + static instances_t instances; + const BlockMap& block_map; +}; + +class Gfx8Factory : public Pm4Factory { + public: + Gfx8Factory() : Pm4Factory(block_map) { + block_map.init(block_id_table, pm4_profile::Gfx8HwBlocks, pm4_profile::Gfx8HwBlockCount); + } + pm4_profile::CommandWriter* getCommandWriter(); + pm4_profile::PerfCounter* getPmcMgr(); + pm4_profile::ThreadTrace* getSqttMgr(); + + private: + static uint32_t block_id_table[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER]; + BlockMap block_map; +}; + +class Gfx9Factory : public Pm4Factory { + public: + Gfx9Factory() : Pm4Factory(block_map) { + block_map.init(block_id_table, pm4_profile::Gfx9HwBlocks, pm4_profile::Gfx9HwBlockCount); + } + pm4_profile::CommandWriter* getCommandWriter(); + pm4_profile::PerfCounter* getPmcMgr(); + pm4_profile::ThreadTrace* getSqttMgr(); + + private: + static uint32_t block_id_table[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER]; + BlockMap block_map; +}; + +inline Pm4Factory* Pm4Factory::Create(const hsa_agent_t agent) { + std::lock_guard lck(mutex); + + char agent_name[64]; + hsa_agent_get_info(agent, HSA_AGENT_INFO_NAME, agent_name); + instances_t::iterator it = instances.find(agent_name); + + if (it == instances.end()) { + if (strncmp(agent_name, "gfx801", 6) == 0) { + throw aql_profile_exc_val(std::string("GFX8 Carrizo is not supported "), + agent_name); + } else if (strncmp(agent_name, "gfx8", 4) == 0) { + it->second = new Gfx8Factory(); + } else if (strncmp(agent_name, "gfx9", 4) == 0) { + it->second = new Gfx9Factory(); + } else { + throw aql_profile_exc_val("Unsupported GFXIP", agent_name); + } + } + + if (it->second == NULL) throw aql_profile_exc_msg("Pm4Factory allocation failed"); + return it->second; +} + +inline void Pm4Factory::Destroy() { + std::lock_guard lck(mutex); + for (auto it : instances) delete it.second; + instances.clear(); +} + +} // namespace aql_profile + +#endif // _PM4_FACTORY_H_ diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/populate_aql.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/populate_aql.cpp similarity index 99% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/populate_aql.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/populate_aql.cpp index 24aaaf49d5..502b84b780 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/populate_aql.cpp +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/core/populate_aql.cpp @@ -1,7 +1,8 @@ +#include + #include #include #include -#include #include "aql_profile.h" #include "cmdwriter.h" diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/CMakeLists.txt b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/CMakeLists.txt similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/CMakeLists.txt rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/CMakeLists.txt diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx8_block_info.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx8_block_info.cpp similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx8_block_info.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx8_block_info.cpp diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx8_block_info.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx8_block_info.h similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx8_block_info.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx8_block_info.h diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx8_perf_counter.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx8_perf_counter.cpp similarity index 98% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx8_perf_counter.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx8_perf_counter.cpp index 729a4aeef4..f25d5ab30b 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx8_perf_counter.cpp +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx8_perf_counter.cpp @@ -18,14 +18,6 @@ using namespace pm4_profile; namespace pm4_profile { -static char errorString[][64] = {{"No error"}, - {"unknow countergroup id"}, - {"no countergroup id"}, - {"invalid operation"}, - {"counter is not available"}, - {"countegroup error state"}, - {"countegroup is not completed"}}; - Gfx8PerfCounter::Gfx8PerfCounter() { // Initialize the number of shader engines num_se_ = 4; @@ -33,8 +25,6 @@ Gfx8PerfCounter::Gfx8PerfCounter() { } void Gfx8PerfCounter::Init() { - error_code_ = 0; - // Initialize the value to use in resetting GRBM regGRBM_GFX_INDEX grbm_gfx_index; grbm_gfx_index.u32All = 0; @@ -49,6 +39,10 @@ void Gfx8PerfCounter::begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, // Reset Grbm to its default state - broadcast cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX__CI__VI, reset_grbm_); + // Reset the counter list + regCP_PERFMON_CNTL cp_perfmon_cntl = {0}; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmCP_PERFMON_CNTL__CI__VI, cp_perfmon_cntl.u32All); + // Iterate through the list of blocks to generate Pm4 commands to // program corresponding perf counters of each block for (CountersMap::const_iterator block_it = countersMap.begin(); block_it != countersMap.end(); @@ -60,7 +54,6 @@ void Gfx8PerfCounter::begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, // Iterate through each enabled perf counter and building // corresponding Pm4 commands to program the various control // registers involved - for (uint32_t ind = 0; ind < counter_count; ++ind) { const uint32_t counter_id = counters[ind]; @@ -89,9 +82,6 @@ void Gfx8PerfCounter::begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, cp_perfcount_enable.u32All); // Reset the counter list - regCP_PERFMON_CNTL cp_perfmon_cntl; - cp_perfmon_cntl.u32All = 0; - cp_perfmon_cntl.bits.PERFMON_STATE = 0; cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmCP_PERFMON_CNTL__CI__VI, cp_perfmon_cntl.u32All); // Start the counter list @@ -148,16 +138,6 @@ uint32_t Gfx8PerfCounter::end(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, return total_counter_num * sizeof(uint32_t); } -int Gfx8PerfCounter::getLastError() { return error_code_; } - -std::string Gfx8PerfCounter::getErrorString(int error) { - if ((error >= 0) && (error < kErrorCodeMax)) { - std::string err_string(errorString[error]); - return err_string; - } - return string("Error input code!"); -} - uint32_t Gfx8PerfCounter::ProgramTcpCntrs(uint32_t tcpRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, uint32_t blkCntrIdx) { regGRBM_GFX_INDEX grbm_gfx_index; diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx8_perf_counter.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx8_perf_counter.h similarity index 94% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx8_perf_counter.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx8_perf_counter.h index 81ba9148d8..ed3c39681d 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx8_perf_counter.h +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx8_perf_counter.h @@ -11,7 +11,7 @@ class CommandWriter; // This class implement the VI PMU. It is responsible for setting up // CounterGroups to represent each VI hardware block which exposes performance // counters. -class Gfx8PerfCounter : public pm4_profile::Pmu { +class Gfx8PerfCounter : public pm4_profile::PerfCounter { public: Gfx8PerfCounter(); @@ -19,10 +19,6 @@ class Gfx8PerfCounter : public pm4_profile::Pmu { // for the blocks featured shader engines instancing uint32_t getNumSe() { return num_se_; } - int getLastError(); - - std::string getErrorString(int error); - void begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, const CountersMap& countersMap); uint32_t end(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, const CountersMap& countersMap, @@ -64,8 +60,6 @@ class Gfx8PerfCounter : public pm4_profile::Pmu { uint32_t* reg_val); private: - int error_code_; - // Indicates the number of Shader Engines Present uint32_t num_se_; diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_block_info.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_block_info.cpp similarity index 99% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_block_info.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_block_info.cpp index 0843b852d6..bacefc0b01 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_block_info.cpp +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_block_info.cpp @@ -56,7 +56,7 @@ GpuBlockInfo Gfx9HwBlocks[] = { AI_COUNTER_NUM_PER_SPI, 0, 0, true, 0, 0, false, 0, 0}, // Counter block SQ - {"AI_SQ", kHsaAiCounterBlockIdSq, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + {"AI_SQ", kHsaAiCounterBlockIdSq, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 171, AI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, {"AI_SQ_GS", kHsaAiCounterBlockIdSqGs, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, AI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, @@ -251,10 +251,8 @@ GpuBlockInfo Gfx9HwBlocks[] = { // Counter block CPC // Temp commented for Vega10 - /* - {"AI_CPC", kHsaAiCounterBlockIdCpc, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 24, - AI_COUNTER_NUM_PER_CPC, 0, 0, true, 0, 0, false, 0, 0}, - */ + {"AI_CPC", kHsaAiCounterBlockIdCpc, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 34, + AI_COUNTER_NUM_PER_CPC, 0, 0, true, 0, 0, false, 0, 0}, // Counter block IOMMUV2 {"AI_IOMMUV2", kHsaAiCounterBlockIdIommuV2, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 25, diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_block_info.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_block_info.h similarity index 97% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_block_info.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_block_info.h index c5ef546d53..078ef60145 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_block_info.h +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_block_info.h @@ -192,8 +192,7 @@ typedef enum HsaAiCounterBlockId { // Temp commented out for Vega10 // kHsaAiCounterBlockIdCpg, - // Temp commented out for Vega10 - // kHsaAiCounterBlockIdCpc, + kHsaAiCounterBlockIdCpc, // Counters retrieved by KFD kHsaAiCounterBlockIdIommuV2, @@ -233,12 +232,9 @@ extern GpuCounterRegInfo AiVgtCounterRegAddr[]; extern GpuCounterRegInfo AiIaCounterRegAddr[]; extern GpuCounterRegInfo AiMcCounterRegAddr[]; extern GpuCounterRegInfo AiSrbmCounterRegAddr[]; - // No Tcs Counter block on AI // extern GpuCounterRegInfo AiTcsCounterRegAddr[]; extern GpuCounterRegInfo AiWdCounterRegAddr[]; -extern GpuCounterRegInfo AiCpgCounterRegAddr[]; -extern GpuCounterRegInfo AiCpcCounterRegAddr[]; extern GpuPrivCounterBlockId AiBlockIdSq; extern GpuPrivCounterBlockId AiBlockIdMc; diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_perf_counter.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_perf_counter.cpp similarity index 97% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_perf_counter.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_perf_counter.cpp index f5d34f49eb..eb5e30cab0 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_perf_counter.cpp +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_perf_counter.cpp @@ -19,14 +19,6 @@ using namespace pm4_profile::gfx9; namespace pm4_profile { -static char errorString[][64] = {{"No error"}, - {"unknow countergroup id"}, - {"no countergroup id"}, - {"invalid operation"}, - {"counter is not available"}, - {"countegroup error state"}, - {"countegroup is not completed"}}; - Gfx9PerfCounter::Gfx9PerfCounter() { // Initialize the number of shader engines num_se_ = 4; @@ -34,8 +26,6 @@ Gfx9PerfCounter::Gfx9PerfCounter() { } void Gfx9PerfCounter::Init() { - error_code_ = 0; - // Initialize the value to use in resetting GRBM regGRBM_GFX_INDEX grbm_gfx_index; grbm_gfx_index.u32All = 0; @@ -54,6 +44,10 @@ void Gfx9PerfCounter::begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, // On Vega this is needed to collect Perf Cntrs cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmRLC_PERFMON_CLK_CNTL, 1); + // Reset the counter list + regCP_PERFMON_CNTL cp_perfmon_cntl = {0}; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmCP_PERFMON_CNTL, cp_perfmon_cntl.u32All); + // Iterate through the list of blocks to generate Pm4 commands to // program corresponding perf counters of each block for (CountersMap::const_iterator block_it = countersMap.begin(); block_it != countersMap.end(); @@ -65,7 +59,6 @@ void Gfx9PerfCounter::begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, // Iterate through each enabled perf counter and building // corresponding Pm4 commands to program the various control // registers involved - for (uint32_t ind = 0; ind < counter_count; ++ind) { const uint32_t counter_id = counters[ind]; @@ -93,9 +86,6 @@ void Gfx9PerfCounter::begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, cmdWriter->BuildWriteShRegPacket(cmdBuff, mmCOMPUTE_PERFCOUNT_ENABLE, cp_perfcount_enable.u32All); // Reset the counter list - regCP_PERFMON_CNTL cp_perfmon_cntl; - cp_perfmon_cntl.u32All = 0; - cp_perfmon_cntl.bits.PERFMON_STATE = 0; cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmCP_PERFMON_CNTL, cp_perfmon_cntl.u32All); // Start the counter list @@ -156,16 +146,6 @@ uint32_t Gfx9PerfCounter::end(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, return total_counter_num * sizeof(uint32_t); } -int Gfx9PerfCounter::getLastError() { return error_code_; } - -std::string Gfx9PerfCounter::getErrorString(int error) { - if ((error >= 0) && (error < kErrorCodeMax)) { - std::string err_string(errorString[error]); - return err_string; - } - return string("Error input code!"); -} - uint32_t Gfx9PerfCounter::ProgramTcpCntrs(uint32_t tcpRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, uint32_t blkCntrIdx) { regGRBM_GFX_INDEX grbm_gfx_index; @@ -737,17 +717,15 @@ uint32_t Gfx9PerfCounter::BuildCounterSelRegister(uint32_t cntrIdx, uint32_t* re */ // Temp commented for Vega10 - /* case kHsaAiCounterBlockIdCpc: { regCPC_PERFCOUNTER0_SELECT cpc_perf_counter_select; cpc_perf_counter_select.u32All = 0; - cpc_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + cpc_perf_counter_select.bits.CNTR_SEL0 = blkCntrIdx; regVal[0] = cpc_perf_counter_select.u32All; regAddr[0] = AiCpcCounterRegAddr[cntrIdx].counterSelRegAddr; regIdx = 1; break; } - */ /* case kHsaAiCounterBlockIdMc: { @@ -1316,7 +1294,6 @@ uint32_t Gfx9PerfCounter::BuildCounterReadRegisters(uint32_t reg_index, uint32_t */ // Temp commented for Vega10 - /* case kHsaAiCounterBlockIdCpc: { reg_addr[reg_num] = mmGRBM_GFX_INDEX; reg_val[reg_num] = reset_grbm_; @@ -1331,7 +1308,6 @@ uint32_t Gfx9PerfCounter::BuildCounterReadRegisters(uint32_t reg_index, uint32_t reg_num++; break; } - */ // IommuV2, MC, kernel driver counters are retrieved via // KFD implementation diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_perf_counter.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_perf_counter.h similarity index 90% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_perf_counter.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_perf_counter.h index 14bd82968d..ddebd331a7 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gfx9_perf_counter.h +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gfx9_perf_counter.h @@ -11,23 +11,17 @@ class CommandWriter; // This class implement the AI PMU. It is responsible for setting up // CounterGroups to represent each AI hardware block which exposes performance // counters. -class Gfx9PerfCounter : public pm4_profile::Pmu { +class Gfx9PerfCounter : public pm4_profile::PerfCounter { public: Gfx9PerfCounter(); - // Returns number of shader engines per block - // for the blocks featured shader engines instancing - uint32_t getNumSe() { return num_se_; } - - int getLastError(); - - std::string getErrorString(int error); - void begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, const CountersMap& countersMap); uint32_t end(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, const CountersMap& countersMap, void* dataBuff); + uint32_t getNumSe() { return num_se_; } + private: void Init(); @@ -64,8 +58,6 @@ class Gfx9PerfCounter : public pm4_profile::Pmu { uint32_t* reg_val); private: - int error_code_; - // Indicates the number of Shader Engines Present uint32_t num_se_; diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_block_info.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gpu_block_info.h similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_block_info.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/gpu_block_info.h diff --git a/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/perf_counter.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/perf_counter.h new file mode 100644 index 0000000000..601a86de87 --- /dev/null +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/perfcounter/perf_counter.h @@ -0,0 +1,35 @@ +#ifndef _HSA_PERF_H_ +#define _HSA_PERF_H_ + +#include + +#include +#include +#include + +namespace pm4_profile { +class DefaultCmdBuf; +class CommandWriter; + +typedef std::vector CountersVec; +typedef std::map CountersMap; + +class PerfCounter { + public: + virtual ~PerfCounter() {} + + // Generate start profiling commands. + virtual void begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, + const CountersMap& countersMap) = 0; + + // Generate stop profiling commands. + // Return actual required data buffer size. + virtual uint32_t end(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, + const CountersMap& countersMap, void* dataBuff) = 0; + + // Returns number of shader engines per block + // for the blocks featured shader engines instancing + virtual uint32_t getNumSe() = 0; +}; +} // namespace pm4_profile +#endif // _HSA_PERF_H_ diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/CMakeLists.txt b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/CMakeLists.txt similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/CMakeLists.txt rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/CMakeLists.txt diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/gfx8_thread_trace.cpp similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/gfx8_thread_trace.cpp diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/gfx8_thread_trace.h similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/gfx8_thread_trace.h diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/gfx9_thread_trace.cpp similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/gfx9_thread_trace.cpp diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/gfx9_thread_trace.h similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/gfx9_thread_trace.h diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/thread_trace.cpp similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/thread_trace.cpp diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/thread_trace.h similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/src/threadtrace/thread_trace.h diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/CMakeLists.txt b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/CMakeLists.txt similarity index 92% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/CMakeLists.txt rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/CMakeLists.txt index eaa480f644..0b4e0461db 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/CMakeLists.txt +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/CMakeLists.txt @@ -28,7 +28,6 @@ include_directories ( ${TEST_DIR}/${TEST_NAME} ) set ( LIB_NAME "${TEST_NAME}${ONLY64STR}" ) add_library ( ${LIB_NAME} STATIC ${TEST_DIR}/${TEST_NAME}/${TEST_NAME}.cpp ) target_link_libraries( ${LIB_NAME} c stdc++ ) -execute_process ( COMMAND sh -xc "cp ${TEST_DIR}/${TEST_NAME}/*.hsaco ${PROJECT_BINARY_DIR}" ) set ( TEST_LIBS ${LIB_NAME} ) # @@ -37,7 +36,13 @@ set ( TEST_LIBS ${LIB_NAME} ) set ( SRC_LIST ${TEST_DIR}/ctrl/test.cpp ) set ( SRC_LIST ${SRC_LIST} ${TEST_DIR}/ctrl/test_pmgr.cpp ) set ( SRC_LIST ${SRC_LIST} ${TEST_DIR}/ctrl/test_hsa.cpp ) -set ( LIB_LIST ${TEST_LIBS} ${UTIL_LIB} ${CORE_UTILS_LIB} ${ROCR_LIB} ${TARGET_LIB} ) +set ( LIB_LIST ${TEST_LIBS} ${UTIL_LIB} ${CORE_UTILS_LIB} ${ROCR_LIB} ) set ( EXE_NAME "ctrl" ) add_executable ( ${EXE_NAME} ${SRC_LIST} ) target_link_libraries( ${EXE_NAME} ${LIB_LIST} c stdc++ dl pthread rt atomic ) + +# +# Copy the test files +# +execute_process ( COMMAND sh -xc "cp ${TEST_DIR}/${TEST_NAME}/*.hsaco ${PROJECT_BINARY_DIR}" ) +execute_process ( COMMAND sh -xc "cp ${TEST_DIR}/run.sh ${PROJECT_BINARY_DIR}" ) diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/binary_search/binary_search.cc b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/binary_search/binary_search.cc similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/binary_search/binary_search.cc rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/binary_search/binary_search.cc diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/binary_search/binary_search_kernels.cl b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/binary_search/binary_search_kernels.cl similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/binary_search/binary_search_kernels.cl rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/binary_search/binary_search_kernels.cl diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test.cpp similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test.cpp diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_aql.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_aql.h similarity index 97% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_aql.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_aql.h index bee82a5867..4139734afc 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_aql.h +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_aql.h @@ -30,14 +30,14 @@ OF THE POSSIBILITY OF SUCH DAMAGE. #include "hsa.h" #include "hsa_rsrc_factory.h" -#include "hsa_ext_amd_aql_profile.h" +#include "hsa_ven_amd_aqlprofile.h" // Test AQL interface class TestAql { TestAql* const test_aql; public: - TestAql(TestAql* t = 0) : test_aql(t) {} + explicit TestAql(TestAql* t = 0) : test_aql(t) {} virtual ~TestAql() {} TestAql* testAql() { return test_aql; } diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_assert.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_assert.h similarity index 91% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_assert.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_assert.h index 96292a68ed..37d012720d 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_assert.h +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_assert.h @@ -6,7 +6,7 @@ if (!(cond)) { \ std::cout << "ASSERT FAILED(" << #cond << ") at \"" << __FILE__ << "\" line " << __LINE__ \ << std::endl; \ - abort(); \ + exit(-1); \ } \ } diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_hsa.cpp similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_hsa.cpp diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_hsa.h similarity index 98% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_hsa.h index 13a4767671..7ca894de40 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.h +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_hsa.h @@ -36,7 +36,7 @@ OF THE POSSIBILITY OF SUCH DAMAGE. class TestHSA : public TestAql { public: // Constructor - TestHSA(TestKernel* test) : test_(test), name_(test->Name()) { + explicit TestHSA(TestKernel* test) : test_(test), name_(test->Name()) { total_time_taken_ = 0; setup_time_taken_ = 0; dispatch_time_taken_ = 0; diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_kernel.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_kernel.h similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_kernel.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_kernel.h diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pgen.h similarity index 96% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pgen.h index 8102c3cf0f..662dbd2c2e 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen.h +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pgen.h @@ -29,18 +29,17 @@ OF THE POSSIBILITY OF SUCH DAMAGE. #define _TEST_PGEN_H_ #include "test_pmgr.h" -#include "hsa_ext_amd_aql_profile.h" // SimpleConvolution: Class implements OpenCL SimpleConvolution sample class TestPGen : public TestPMgr { + protected: typedef hsa_ext_amd_aql_pm4_packet_t packet_t; - protected: packet_t* PrePacket() { return reinterpret_cast(&prePacket); } packet_t* PostPacket() { return reinterpret_cast(&postPacket); } public: - TestPGen(TestAql* t) : TestPMgr(t) {} + explicit TestPGen(TestAql* t) : TestPMgr(t) {} }; #endif // _TEST_PGEN_H_ diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_pmc.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pgen_pmc.h similarity index 61% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_pmc.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pgen_pmc.h index d83591f104..e62b5bb172 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_pmc.h +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pgen_pmc.h @@ -31,11 +31,13 @@ OF THE POSSIBILITY OF SUCH DAMAGE. #include "test_assert.h" #include "test_pgen.h" -hsa_status_t TestPGenPMC_Callback(hsa_ext_amd_aql_profile_info_type_t info_type, - hsa_ext_amd_aql_profile_info_data_t* info_data, +#include + +hsa_status_t TestPGenPMC_Callback(hsa_ven_amd_aqlprofile_info_type_t info_type, + hsa_ven_amd_aqlprofile_info_data_t* info_data, void* callback_data) { hsa_status_t status = HSA_STATUS_SUCCESS; - typedef std::vector passed_data_t; + typedef std::vector passed_data_t; reinterpret_cast(callback_data)->push_back(*info_data); return status; } @@ -45,29 +47,30 @@ class TestPGenPMC : public TestPGen { const static uint32_t buffer_alignment = 0x1000; // 4K hsa_agent_t agent; - hsa_ext_amd_aql_profile_profile_t profile; - hsa_ext_amd_aql_profile_event_t events[2]; + hsa_ven_amd_aqlprofile_profile_t profile; + hsa_ven_amd_aqlprofile_event_t* events; bool buildPackets() { return true; } bool dumpData() { std::cout << "TestPGenPMC::dumpData :" << std::endl; - typedef std::vector callback_data_t; + typedef std::vector callback_data_t; callback_data_t data; - hsa_ext_amd_aql_profile_iterate_data(&profile, TestPGenPMC_Callback, &data); + api.hsa_ven_amd_aqlprofile_iterate_data(&profile, TestPGenPMC_Callback, &data); for (callback_data_t::iterator it = data.begin(); it != data.end(); ++it) { - std::cout << "> sample(" << dec << it->sample_id << ") block(" - << it->pmc_data.event.block_name << "_" << it->pmc_data.event.block_index - << ") result(" << hex << it->pmc_data.result << ")" << std::endl; + std::cout << dec << "event( block(" << it->pmc_data.event.block_name << "_" + << it->pmc_data.event.block_index << "), id(" << it->pmc_data.event.counter_id + << ")), sample(" << it->sample_id << "), result(" << it->pmc_data.result << ")" + << std::endl; } return true; } public: - TestPGenPMC(TestAql* t) : TestPGen(t) { std::cout << "Test: PGen PMC" << std::endl; } + explicit TestPGenPMC(TestAql* t) : TestPGen(t) { std::cout << "Test: PGen PMC" << std::endl; } bool initialize(int arg_cnt, char** arg_list) { if (!TestPMgr::initialize(arg_cnt, arg_list)) return false; @@ -85,31 +88,43 @@ class TestPGenPMC : public TestPGen { // Instantiation of the profile object // ////////////////////////////////////////////////////////////// // Set the event fields - events[0].block_name = HSA_EXT_AQL_PROFILE_BLOCK_SQ; - events[0].block_index = 0; - events[0].counter_id = 0x4; // SQ_SQ_PERF_SEL_WAVES - events[1].block_name = HSA_EXT_AQL_PROFILE_BLOCK_SQ; - events[1].block_index = 0; - events[1].counter_id = 0xe; // SQ_SQ_PERF_SEL_ITEMS + const hsa_ven_amd_aqlprofile_event_t events_arr[] = { + {HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQ, 0, 4 /*WAVES*/}, + {HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQ, 0, 14 /*ITEMS*/}, + {HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQ, 0, 47 /*WAVE_READY*/}, + {HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCC, 2, 1 /*CYCLE*/}, + {HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCC, 2, 3 /*REQ*/}, + {HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCC, 2, 22 /*WRITEBACK*/}, + {HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_CPC, 0, 0 /*ALWAYS_COUNT*/}, + {HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_CPC, 0, 8 /*ME1_STALL_WAIT_ON_RCIU_READ*/}, + }; + const size_t event_count = sizeof(events_arr) / sizeof(hsa_ven_amd_aqlprofile_event_t); + events = new hsa_ven_amd_aqlprofile_event_t[event_count]; + memcpy(events, events_arr, sizeof(events_arr)); // Initialization the profile memset(&profile, 0, sizeof(profile)); profile.agent = agent; - profile.type = HSA_EXT_AQL_PROFILE_EVENT_PMC; + profile.type = HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_PMC; // set enabled events list profile.events = events; - profile.event_count = 2; + profile.event_count = event_count; // Profile buffers attributes command_buffer_alignment = buffer_alignment; - status = hsa_ext_amd_aql_profile_get_info( - &profile, HSA_EXT_AQL_PROFILE_INFO_COMMAND_BUFFER_SIZE, &command_buffer_size); + status = api.hsa_ven_amd_aqlprofile_get_info( + &profile, HSA_VEN_AMD_AQLPROFILE_INFO_COMMAND_BUFFER_SIZE, &command_buffer_size); + if (status != HSA_STATUS_SUCCESS) { + const char* str = ""; + api.hsa_ven_amd_aqlprofile_error_string(&str); + std::cout << "aqlprofile err: " << str << std::endl; + } test_assert(status == HSA_STATUS_SUCCESS); output_buffer_alignment = buffer_alignment; - status = hsa_ext_amd_aql_profile_get_info(&profile, HSA_EXT_AQL_PROFILE_INFO_PMC_DATA_SIZE, - &output_buffer_size); + status = api.hsa_ven_amd_aqlprofile_get_info( + &profile, HSA_VEN_AMD_AQLPROFILE_INFO_PMC_DATA_SIZE, &output_buffer_size); test_assert(status == HSA_STATUS_SUCCESS); // Application is allocating the command buffer @@ -128,12 +143,17 @@ class TestPGenPMC : public TestPGen { memset(profile.output_buffer.ptr, 0x77, output_buffer_size); // Populating the AQL start packet - status = hsa_ext_amd_aql_profile_start(&profile, PrePacket()); + status = api.hsa_ven_amd_aqlprofile_start(&profile, PrePacket()); + if (status != HSA_STATUS_SUCCESS) { + const char* str; + api.hsa_ven_amd_aqlprofile_error_string(&str); + std::cout << "aqlprofile err: " << str << std::endl; + } test_assert(status == HSA_STATUS_SUCCESS); if (status != HSA_STATUS_SUCCESS) return false; // Populating the AQL stop packet - status = hsa_ext_amd_aql_profile_stop(&profile, PostPacket()); + status = api.hsa_ven_amd_aqlprofile_stop(&profile, PostPacket()); test_assert(status == HSA_STATUS_SUCCESS); return (status == HSA_STATUS_SUCCESS); diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_sqtt.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pgen_sqtt.h similarity index 85% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_sqtt.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pgen_sqtt.h index 6cdf0ce96e..88f603c468 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_sqtt.h +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pgen_sqtt.h @@ -31,15 +31,16 @@ OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include "test_assert.h" #include "test_pgen.h" -hsa_status_t TestPGenSQTT_Callback(hsa_ext_amd_aql_profile_info_type_t info_type, - hsa_ext_amd_aql_profile_info_data_t* info_data, +hsa_status_t TestPGenSQTT_Callback(hsa_ven_amd_aqlprofile_info_type_t info_type, + hsa_ven_amd_aqlprofile_info_data_t* info_data, void* callback_data) { hsa_status_t status = HSA_STATUS_SUCCESS; - typedef std::vector passed_data_t; + typedef std::vector passed_data_t; reinterpret_cast(callback_data)->push_back(*info_data); return status; } @@ -50,17 +51,17 @@ class TestPGenSQTT : public TestPGen { const static uint32_t buffer_size = 0x2000000; // 32M hsa_agent_t agent; - hsa_ext_amd_aql_profile_profile_t profile; + hsa_ven_amd_aqlprofile_profile_t profile; bool buildPackets() { return true; } bool dumpData() { std::cout << "TestPGenSQTT::dumpData :" << std::endl; - typedef std::vector callback_data_t; + typedef std::vector callback_data_t; callback_data_t data; - hsa_ext_amd_aql_profile_iterate_data(&profile, TestPGenSQTT_Callback, &data); + api.hsa_ven_amd_aqlprofile_iterate_data(&profile, TestPGenSQTT_Callback, &data); for (callback_data_t::iterator it = data.begin(); it != data.end(); ++it) { std::cout << "> sample(" << dec << it->sample_id << ") ptr(" << hex << it->sqtt_data.ptr << ") size(" << dec << it->sqtt_data.size << ")" << std::endl; @@ -93,7 +94,7 @@ class TestPGenSQTT : public TestPGen { } public: - TestPGenSQTT(TestAql* t) : TestPGen(t) { std::cout << "Test: PGen SQTT" << std::endl; } + explicit TestPGenSQTT(TestAql* t) : TestPGen(t) { std::cout << "Test: PGen SQTT" << std::endl; } bool initialize(int arg_cnt, char** arg_list) { if (!TestPMgr::initialize(arg_cnt, arg_list)) return false; @@ -116,7 +117,7 @@ class TestPGenSQTT : public TestPGen { // Initialization the profile memset(&profile, 0, sizeof(profile)); profile.agent = agent; - profile.type = HSA_EXT_AQL_PROFILE_EVENT_SQTT; + profile.type = HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_SQTT; // set parameters // profile.parameters = &event; @@ -124,8 +125,8 @@ class TestPGenSQTT : public TestPGen { // Profile buffers attributes command_buffer_alignment = buffer_alignment; - status = hsa_ext_amd_aql_profile_get_info( - &profile, HSA_EXT_AQL_PROFILE_INFO_COMMAND_BUFFER_SIZE, &command_buffer_size); + status = api.hsa_ven_amd_aqlprofile_get_info( + &profile, HSA_VEN_AMD_AQLPROFILE_INFO_COMMAND_BUFFER_SIZE, &command_buffer_size); test_assert(status == HSA_STATUS_SUCCESS); output_buffer_alignment = buffer_alignment; @@ -146,12 +147,12 @@ class TestPGenSQTT : public TestPGen { profile.output_buffer.size = output_buffer_size; // Populating the AQL start packet - status = hsa_ext_amd_aql_profile_start(&profile, PrePacket()); + status = api.hsa_ven_amd_aqlprofile_start(&profile, PrePacket()); test_assert(status == HSA_STATUS_SUCCESS); if (status != HSA_STATUS_SUCCESS) return false; // Populating the AQL stop packet - status = hsa_ext_amd_aql_profile_stop(&profile, PostPacket()); + status = api.hsa_ven_amd_aqlprofile_stop(&profile, PostPacket()); test_assert(status == HSA_STATUS_SUCCESS); return (status == HSA_STATUS_SUCCESS); diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pmgr.cpp similarity index 93% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pmgr.cpp index cef2b8cc5c..3f95b449c0 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.cpp +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pmgr.cpp @@ -61,7 +61,7 @@ bool TestPMgr::addPacketGfx8(const packet_t* packet) { // Create legacy devices PM4 data const hsa_ext_amd_aql_pm4_packet_t* aql_packet = (const hsa_ext_amd_aql_pm4_packet_t*)packet; slot_pm4_s data; - hsa_ext_amd_aql_profile_legacy_get_pm4(aql_packet, (void*)data.words); + api.hsa_ven_amd_aqlprofile_legacy_get_pm4(aql_packet, reinterpret_cast(data.words)); // Compute the write index of queue and copy Aql packet into it uint64_t que_idx = hsa_queue_load_write_index_relaxed(getQueue()); @@ -122,4 +122,9 @@ bool TestPMgr::initialize(int argc, char** argv) { TestPMgr::TestPMgr(TestAql* t) : TestAql(t) { dummySignal.handle = 0; postSignal = dummySignal; + + hsa_status_t status = hsa_init(); + test_assert(status == HSA_STATUS_SUCCESS); + status = hsa_system_get_extension_table(HSA_EXTENSION_AMD_AQLPROFILE, 1, 0, &api); + test_assert(status == HSA_STATUS_SUCCESS); } diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pmgr.h similarity index 85% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pmgr.h index 15ea509cb8..c74f1fd2eb 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.h +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/ctrl/test_pmgr.h @@ -25,18 +25,20 @@ OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ -#ifndef _TEST_SMGR_H_ -#define _TEST_SMGR_H_ +#ifndef _TEST_PMGR_H_ +#define _TEST_PMGR_H_ #include +#include "hsa.h" #include "test_aql.h" +#include "hsa_ven_amd_aqlprofile.h" // SimpleConvolution: Class implements OpenCL SimpleConvolution sample class TestPMgr : public TestAql { public: typedef hsa_ext_amd_aql_pm4_packet_t packet_t; - TestPMgr(TestAql* t); + explicit TestPMgr(TestAql* t); bool run(); protected: @@ -45,14 +47,16 @@ class TestPMgr : public TestAql { hsa_signal_t dummySignal; hsa_signal_t postSignal; + hsa_ven_amd_aqlprofile_1_00_pfn_t api; + virtual bool buildPackets() { return false; } virtual bool dumpData() { return false; } virtual bool initialize(int argc, char** argv); private: enum { - SLOT_PM4_SIZE_DW = HSA_EXT_AQL_PROFILE_LEGACY_PM4_PACKET_SIZE / sizeof(uint32_t), - SLOT_PM4_SIZE_AQLP = HSA_EXT_AQL_PROFILE_LEGACY_PM4_PACKET_SIZE / sizeof(packet_t) + SLOT_PM4_SIZE_DW = HSA_VEN_AMD_AQLPROFILE_LEGACY_PM4_PACKET_SIZE / sizeof(uint32_t), + SLOT_PM4_SIZE_AQLP = HSA_VEN_AMD_AQLPROFILE_LEGACY_PM4_PACKET_SIZE / sizeof(packet_t) }; struct slot_pm4_s { uint32_t words[SLOT_PM4_SIZE_DW]; @@ -64,4 +68,4 @@ class TestPMgr : public TestAql { bool addPacketGfx9(const packet_t* packet); }; -#endif // _TEST_SMGR_H_ +#endif // _TEST_PMGR_H_ diff --git a/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/run.sh b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/run.sh new file mode 100755 index 0000000000..54ead87204 --- /dev/null +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/run.sh @@ -0,0 +1,30 @@ +#/bin/sh +set -x + +tbin=./test/ctrl + +CDIR=`pwd` +export LD_LIBRARY_PATH=$CDIR + +export HSA_ENABLE_SDMA=0 +export HSA_EMULATE_AQL=1 + +echo +echo "Run simple convolution kernel" +unset ROCR_ENABLE_PMC +unset ROCR_ENABLE_SQTT +eval $tbin + +echo +echo "Run with PMC" +export ROCR_ENABLE_PMC=1 +unset ROCR_ENABLE_SQTT +eval $tbin + +echo +echo "Run with SQTT" +unset ROCR_ENABLE_PMC +export ROCR_ENABLE_SQTT=1 +eval $tbin + + diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/gfx8_simpleConvolution.hsaco b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/gfx8_simpleConvolution.hsaco similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/gfx8_simpleConvolution.hsaco rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/gfx8_simpleConvolution.hsaco diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/gfx9_simpleConvolution.hsaco b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/gfx9_simpleConvolution.hsaco similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/gfx9_simpleConvolution.hsaco rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/gfx9_simpleConvolution.hsaco diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cl b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/simple_convolution.cl similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cl rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/simple_convolution.cl diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/simple_convolution.cpp similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/simple_convolution.cpp diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/simple_convolution.h similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/simple_convolution.h diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.hsail b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/simple_convolution.hsail similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.hsail rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/simple_convolution/simple_convolution.hsail diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/CMakeLists.txt b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/CMakeLists.txt similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/CMakeLists.txt rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/CMakeLists.txt diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/helper_funcs.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/helper_funcs.cpp similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/helper_funcs.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/helper_funcs.cpp diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/helper_funcs.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/helper_funcs.h similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/helper_funcs.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/helper_funcs.h diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/hsa_rsrc_factory.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/hsa_rsrc_factory.cpp similarity index 99% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/hsa_rsrc_factory.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/hsa_rsrc_factory.cpp index e1163b8542..6c0cd31825 100644 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/hsa_rsrc_factory.cpp +++ b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/hsa_rsrc_factory.cpp @@ -12,7 +12,6 @@ #include "hsa.h" #include "hsa_rsrc_factory.h" #include "hsa_ext_finalize.h" -#include "hsa_ext_profiler.h" using namespace std; diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/hsa_rsrc_factory.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/hsa_rsrc_factory.h similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/hsa_rsrc_factory.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/hsa_rsrc_factory.h diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/perf_timer.cpp b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/perf_timer.cpp similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/perf_timer.cpp rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/perf_timer.cpp diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/perf_timer.h b/projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/perf_timer.h similarity index 100% rename from projects/rocr-runtime/runtime/hsa-ext-aql-profile/test/util/perf_timer.h rename to projects/rocr-runtime/runtime/hsa-amd-aqlprofile/test/util/perf_timer.h diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/doc/HSA_ext_profile_api_v1_1_0.docx b/projects/rocr-runtime/runtime/hsa-ext-aql-profile/doc/HSA_ext_profile_api_v1_1_0.docx deleted file mode 100644 index 35ae8579aa58c4f611992ee51377e9864ee8b159..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85960 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 diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/inc/hsa_ext_amd_aql_profile.h b/projects/rocr-runtime/runtime/hsa-ext-aql-profile/inc/hsa_ext_amd_aql_profile.h deleted file mode 100644 index abeb2d88db..0000000000 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/inc/hsa_ext_amd_aql_profile.h +++ /dev/null @@ -1,267 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 ADVANCED MICRO DEVICES, INC. -// -// AMD is granting you permission to use this software and documentation(if any) -// (collectively, the "Materials") pursuant to the terms and conditions of the -// Software License Agreement included with the Materials.If you do not have a -// copy of the Software License Agreement, contact your AMD representative for a -// copy. -// -// You agree that you will not reverse engineer or decompile the Materials, in -// whole or in part, except as allowed by applicable law. -// -// WARRANTY DISCLAIMER : THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND.AMD DISCLAIMS ALL WARRANTIES, EXPRESS, IMPLIED, OR STATUTORY, -// INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE, TITLE, NON - INFRINGEMENT, THAT THE -// SOFTWARE WILL RUN UNINTERRUPTED OR ERROR - FREE OR WARRANTIES ARISING FROM -// CUSTOM OF TRADE OR COURSE OF USAGE.THE ENTIRE RISK ASSOCIATED WITH THE USE OF -// THE SOFTWARE IS ASSUMED BY YOU.Some jurisdictions do not allow the exclusion -// of implied warranties, so the above exclusion may not apply to You. -// -// LIMITATION OF LIABILITY AND INDEMNIFICATION : AMD AND ITS LICENSORS WILL NOT, -// UNDER ANY CIRCUMSTANCES BE LIABLE TO YOU FOR ANY PUNITIVE, DIRECT, -// INCIDENTAL, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM USE OF -// THE SOFTWARE OR THIS AGREEMENT EVEN IF AMD AND ITS LICENSORS HAVE BEEN -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.In no event shall AMD's total -// liability to You for all damages, losses, and causes of action (whether in -// contract, tort (including negligence) or otherwise) exceed the amount of $100 -// USD. You agree to defend, indemnify and hold harmless AMD and its licensors, -// and any of their directors, officers, employees, affiliates or agents from -// and against any and all loss, damage, liability and other expenses (including -// reasonable attorneys' fees), resulting from Your use of the Software or -// violation of the terms and conditions of this Agreement. -// -// U.S.GOVERNMENT RESTRICTED RIGHTS : The Materials are provided with -// "RESTRICTED RIGHTS." Use, duplication, or disclosure by the Government is -// subject to the restrictions as set forth in FAR 52.227 - 14 and DFAR252.227 - -// 7013, et seq., or its successor.Use of the Materials by the Government -// constitutes acknowledgement of AMD's proprietary rights in them. -// -// EXPORT RESTRICTIONS: The Materials may be subject to export restrictions as -// stated in the Software License Agreement. -// -//////////////////////////////////////////////////////////////////////////////// - -#ifndef _HSA_EXT_AMD_AQL_PROFILE_H_ -#define _HSA_EXT_AMD_AQL_PROFILE_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/////////////////////////////////////////////////////////////////////// -// Library API: -// The library provides helper methods for instantiation of -// the profile context object and for populating of the start -// and stop AQL packets. The profile object contains a profiling -// events list and needed for profiling buffers descriptors, -// a command buffer and an output data buffer. To check if there -// was an error the library methods return a status code. Also -// the library provides methods for querying required buffers -// attributes, to validate the event attributes and to get profiling -// output data. -// -// Returned status: -// hsa_status_t – HSA status codes are used from hsa.h header -// -// Supported profiling features: -// -// Supported profiling events -typedef enum { - HSA_EXT_AQL_PROFILE_EVENT_PMC, - HSA_EXT_AQL_PROFILE_EVENT_SQTT -} hsa_ext_amd_aql_profile_event_type_t; - -// Supported performance counters (PMC) blocks -// The block ID is the same for a block instances set, for example -// each block instance from the TCC block set, TCC0, TCC1, …, TCCN -// will have the same block ID HSA_EXT_AQL_PROFILE_BLOCKS_TCC. -typedef enum { - HSA_EXT_AQL_PROFILE_BLOCK_CB, - HSA_EXT_AQL_PROFILE_BLOCK_CPF, - HSA_EXT_AQL_PROFILE_BLOCK_DB, - HSA_EXT_AQL_PROFILE_BLOCK_GRBM, - HSA_EXT_AQL_PROFILE_BLOCK_GRBMSE, - HSA_EXT_AQL_PROFILE_BLOCK_PASU, - HSA_EXT_AQL_PROFILE_BLOCK_PASC, - HSA_EXT_AQL_PROFILE_BLOCK_SPI, - HSA_EXT_AQL_PROFILE_BLOCK_SQ, - HSA_EXT_AQL_PROFILE_BLOCK_SQES, - HSA_EXT_AQL_PROFILE_BLOCK_SQGS, - HSA_EXT_AQL_PROFILE_BLOCK_SQVS, - HSA_EXT_AQL_PROFILE_BLOCK_SQPS, - HSA_EXT_AQL_PROFILE_BLOCK_SQLS, - HSA_EXT_AQL_PROFILE_BLOCK_SQHS, - HSA_EXT_AQL_PROFILE_BLOCK_SQCS, - HSA_EXT_AQL_PROFILE_BLOCK_SX, - HSA_EXT_AQL_PROFILE_BLOCK_TA, - HSA_EXT_AQL_PROFILE_BLOCK_TCA, - HSA_EXT_AQL_PROFILE_BLOCK_TCC, - HSA_EXT_AQL_PROFILE_BLOCK_TD, - HSA_EXT_AQL_PROFILE_BLOCK_TCP, - HSA_EXT_AQL_PROFILE_BLOCK_GDS, - HSA_EXT_AQL_PROFILE_BLOCK_VGT, - HSA_EXT_AQL_PROFILE_BLOCK_IA, - HSA_EXT_AQL_PROFILE_BLOCK_MC, - HSA_EXT_AQL_PROFILE_BLOCK_SRBM, - HSA_EXT_AQL_PROFILE_BLOCK_TCS, - HSA_EXT_AQL_PROFILE_BLOCK_WD, - HSA_EXT_AQL_PROFILE_BLOCK_CPG, - HSA_EXT_AQL_PROFILE_BLOCK_CPC, - HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER -} hsa_ext_amd_aql_profile_block_name_t; - -// PMC event object structure -// ‘counter_id’ value is specified in GFXIPs perfcounter user guides -// which is the counters select value, “Performance Counters Selection” -// chapter. -typedef struct { - hsa_ext_amd_aql_profile_block_name_t block_name; - uint32_t block_index; - uint32_t counter_id; -} hsa_ext_amd_aql_profile_event_t; - -// Check if event is valid for the specific GPU -hsa_status_t hsa_ext_amd_aql_profile_validate_event( - hsa_agent_t agent, // HSA handle for the profiling GPU - const hsa_ext_amd_aql_profile_event_t* event, // Pointer on validated event - bool* result); // True if the event valid, False otherwise - -// Profiling parameters -// All parameters are generic and if not applicable for a specific -// profile configuration then error status will be returned. -typedef enum { - // SQTT applicable parameters - HSA_EXT_AQL_PROFILE_PARAM_COMPUTE_UNIT_TARGET, - HSA_EXT_AQL_PROFILE_PARAM_VM_ID_MASK, - HSA_EXT_AQL_PROFILE_PARAM_MASK, - HSA_EXT_AQL_PROFILE_PARAM_TOKEN_MASK, - HSA_EXT_AQL_PROFILE_PARAM_TOKEN_MASK2 -} hsa_ext_amd_aql_profile_parameter_name_t; - -// Profile parameter object -typedef struct { - hsa_ext_amd_aql_profile_parameter_name_t parameter_name; - uint32_t value; -} hsa_ext_amd_aql_profile_parameters_t; - -// -// Profile context object: -// The library provides a profile object structure which contains -// the events array, a buffer for the profiling start/stop commands -// and a buffer for the output data. -// The buffers are specified by the buffer descriptors and allocated -// by the application. The buffers allocation attributes, the command -// buffer size, the PMC output buffer size as well as profiling output -// data can be get using the generic get profile info helper _get_info. -// -// Buffer descriptor -typedef struct { - void* ptr; - uint32_t size; -} hsa_ext_amd_aql_profile_descriptor_t; - -// Profile context object structure, contains profiling events list and -// needed for profiling buffers descriptors, a command buffer and -// an output data buffer -typedef struct { - hsa_agent_t agent; // GFXIP handle - hsa_ext_amd_aql_profile_event_type_t type; // Events type - const hsa_ext_amd_aql_profile_event_t* events; // Events array - uint32_t event_count; // Events count - const hsa_ext_amd_aql_profile_parameters_t* parameters; // Parameters array - uint32_t parameter_count; // Parameters count - hsa_ext_amd_aql_profile_descriptor_t output_buffer; // Output buffer - hsa_ext_amd_aql_profile_descriptor_t command_buffer; // PM4 commands -} hsa_ext_amd_aql_profile_profile_t; - -// -// AQL packets populating methods: -// The helper methods to populate provided by the application START and -// STOP AQL packets which the application is required to submit before and -// after profiled GPU task packets respectively. -// -// AQL Vendor Specific packet which carries a PM4 command -typedef struct { - uint16_t header; - uint16_t pm4_command[27]; - hsa_signal_t completion_signal; -} hsa_ext_amd_aql_pm4_packet_t; - -// Method to populate the provided AQL packet with profiling start commands -// Only 'pm4_command' fields of the packet are set and the application -// is responsible to set Vendor Specific header type a completion signal -hsa_status_t hsa_ext_amd_aql_profile_start( - const hsa_ext_amd_aql_profile_profile_t* profile, // [in] profile contex object - hsa_ext_amd_aql_pm4_packet_t* aql_start_packet); // [out] profile start AQL packet - -// Method to populate the provided AQL packet with profiling stop commands -// Only 'pm4_command' fields of the packet are set and the application -// is responsible to set Vendor Specific header type and a completion signal -hsa_status_t hsa_ext_amd_aql_profile_stop( - const hsa_ext_amd_aql_profile_profile_t* profile, // [in] profile contex object - hsa_ext_amd_aql_pm4_packet_t* aql_stop_packet); // [out] profile stop AQL packet - -// Legacy devices, PM4 profiling packet size -const unsigned HSA_EXT_AQL_PROFILE_LEGACY_PM4_PACKET_SIZE = 192; -// Legacy devices, converting the profiling AQL packet to PM4 packet blob -hsa_status_t hsa_ext_amd_aql_profile_legacy_get_pm4( - const hsa_ext_amd_aql_pm4_packet_t* aql_packet, // [in] AQL packet - void* data); // [out] PM4 packet blob - -// -// Get profile info: -// Generic method for getting various profile info including profile buffers -// attributes like the command buffer size and the profiling PMC results. -// It’s implied that all counters are 64bit values. -// -// Profile generic output data: -typedef struct { - uint32_t sample_id; // PMC sample of SQTT buffer index - union { - struct { - hsa_ext_amd_aql_profile_event_t event; // PMC event - uint64_t result; // PMC result - } pmc_data; - hsa_ext_amd_aql_profile_descriptor_t sqtt_data; // SQTT output data descriptor - }; -} hsa_ext_amd_aql_profile_info_data_t; - -// Profile attributes -typedef enum { - HSA_EXT_AQL_PROFILE_INFO_COMMAND_BUFFER_SIZE, // get_info returns uint32_t value - HSA_EXT_AQL_PROFILE_INFO_PMC_DATA_SIZE, // get_info returns uint32_t value - HSA_EXT_AQL_PROFILE_INFO_PMC_DATA, // get_info returns PMC uint64_t value - // in info_data object - HSA_EXT_AQL_PROFILE_INFO_SQTT_DATA // get_info returns SQTT buffer ptr/size - // in info_data object -} hsa_ext_amd_aql_profile_info_type_t; - -// Definition of output data iterator callback -typedef hsa_status_t (*hsa_ext_amd_aql_profile_data_callback_t)( - hsa_ext_amd_aql_profile_info_type_t info_type, // [in] data type, PMC or SQTT data - hsa_ext_amd_aql_profile_info_data_t* info_data, // [in] info_data object - void* callback_data); // [in/out] data passed to the callback - -// Method for getting the profile info -hsa_status_t hsa_ext_amd_aql_profile_get_info( - const hsa_ext_amd_aql_profile_profile_t* profile, // [in] profile context object - hsa_ext_amd_aql_profile_info_type_t attribute, // [in] requested profile attribute - void* value); // [in/out] returned value - -// Method for iterating the events output data -hsa_status_t hsa_ext_amd_aql_profile_iterate_data( - const hsa_ext_amd_aql_profile_profile_t* profile, // [in] profile context object - hsa_ext_amd_aql_profile_data_callback_t callback, // [in] callback to iterate the output data - void* data); // [in/out] data passed to the callback - -#ifdef __cplusplus -} -#endif // __cplusplus - -#endif // _HSA_EXT_AMD_AQL_PROFILE_H_ diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.h b/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.h deleted file mode 100644 index 2764a0e702..0000000000 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _AQL_PROFILE_H_ -#define _AQL_PROFILE_H_ - -#include "hsa_ext_amd_aql_profile.h" - -namespace pm4_profile { -class CommandWriter; -} - -namespace aql_profile { -typedef hsa_ext_amd_aql_profile_descriptor_t descriptor_t; -typedef hsa_ext_amd_aql_profile_profile_t profile_t; -typedef hsa_ext_amd_aql_profile_info_type_t info_type_t; -typedef hsa_ext_amd_aql_profile_data_callback_t data_callback_t; -typedef hsa_ext_amd_aql_pm4_packet_t packet_t; -typedef hsa_ext_amd_aql_profile_event_t event_t; - -void populateAql(const void* cmd_buffer, uint32_t cmd_size, pm4_profile::CommandWriter* cmd_writer, - packet_t* aql_packet); -void* legacyAqlAcquire(const packet_t* aql_packet, void* data); -void* legacyAqlRelease(const packet_t* aql_packet, void* data); -void* legacyPm4(const packet_t* aql_packet, void* data); -} - -#endif // _AQL_PROFILE_H_ diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile_exception.h b/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile_exception.h deleted file mode 100644 index bfba9dd0df..0000000000 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile_exception.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _AQL_PROFILE_EXCEPTION_H_ -#define _AQL_PROFILE_EXCEPTION_H_ - -#include -#include - -namespace aql_profile { - -template class aql_profile_exception : public std::exception { - public: - aql_profile_exception(const std::string& m, const T& v) : msg(m), val(v) {} - virtual const char* what() const throw() { - std::ostringstream oss; - oss << msg << "(" << val << ")"; - return strdup(oss.str().c_str()); - } - - private: - std::string msg; - T val; -}; -} - -#endif // _AQL_PROFILE_EXCEPTION_H_ diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/logger.h b/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/logger.h deleted file mode 100644 index 0034c04b2c..0000000000 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/logger.h +++ /dev/null @@ -1,98 +0,0 @@ -#ifndef _LOGGER_H_ -#define _LOGGER_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace aql_profile { - -class Logger { - public: - void msg(const std::string& m) { log(m); } - - void prn(const char* fmt, ...) { - const size_t formatted_size = 256; - char formatted_string[formatted_size]; - va_list argptr; - va_start(argptr, fmt); - vsnprintf(formatted_string, formatted_size, fmt, argptr); - va_end(argptr); - msg(formatted_string); - } - - template Logger& operator<<(const T& m) { - std::ostringstream oss; - oss << m; - if (!streaming) - log(oss.str()); - else - put(oss.str()); - streaming = true; - return *this; - } - - typedef void (*manip_t)(Logger&); - Logger& operator<<(manip_t f) { - f(*this); - return *this; - } - - static void endl(Logger& logger) { logger.streaming = false; } - - Logger() : file(NULL), dirty(false), streaming(false) { - const char* path = getenv("HSA_EXT_AQL_PROFILE_LOG"); - if (path != NULL) { - file = fopen("/tmp/aql_profile_log.txt", "a"); - } - } - ~Logger() { - if (file != NULL) { - if (dirty) put("\n"); - fclose(file); - } - } - - private: - void put(const std::string& m) { - if (file != NULL) { - dirty = true; - flock(fileno(file), LOCK_EX); - fprintf(file, "%s", m.c_str()); - fflush(file); - flock(fileno(file), LOCK_UN); - } - } - - void log(const std::string& m) { - const time_t rawtime = time(NULL); - const tm* tm_info = localtime(&rawtime); - char tm_str[26]; - strftime(tm_str, 26, "%Y-%m-%d %H:%M:%S", tm_info); - std::ostringstream oss; - oss << "\n<" << tm_str << std::dec << " pid" << syscall(__NR_getpid) << " tid" - << syscall(__NR_gettid) << "> " << m; - put(oss.str()); - } - - FILE* file; - bool dirty; - bool streaming; -}; - -} // aql_profile - -#define ERR_LOGGING(logger) \ - (logger << aql_profile::Logger::endl << "Error: " << __FUNCTION__ << "(): ") - -#endif // _LOGGER_H_ diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/pm4_factory.h b/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/pm4_factory.h deleted file mode 100644 index 9402109ae3..0000000000 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/aqlprofile/pm4_factory.h +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef _PM4_FACTORY_H_ -#define _PM4_FACTORY_H_ - -#include -#include -#include -#include - -#include "aql_profile.h" -#include "gpu_block_info.h" -#include "aql_profile_exception.h" - -namespace pm4_profile { -class CommandWriter; -class Pmu; -class ThreadTrace; -extern GpuBlockInfo Gfx9HwBlocks[]; -extern const uint32_t Gfx9HwBlockCount; -extern GpuBlockInfo Gfx8HwBlocks[]; -extern const uint32_t Gfx8HwBlockCount; -} - -namespace aql_profile { - -class Pm4Factory { - public: - enum { kBadBlockId = UINT_MAX }; - - static Pm4Factory* Create(const hsa_ext_amd_aql_profile_profile_t* profile); - virtual pm4_profile::CommandWriter* getCommandWriter() = 0; - virtual pm4_profile::Pmu* getPmcMgr() = 0; - virtual pm4_profile::ThreadTrace* getSqttMgr() = 0; - - uint32_t getBlockId(const event_t* event) { - const hsa_ext_amd_aql_profile_block_name_t& block_name = event->block_name; - if (block_name >= tables.get_block_id_count()) - throw aql_profile_exception(std::string("Invalid block name, block_name"), - block_name); - return (block_name < tables.get_block_id_count()) - ? tables.get_block_id_ptr()[block_name] + event->block_index - : kBadBlockId; - } - const pm4_profile::GpuBlockInfo* getBlockInfo(const uint32_t& block_id) { - const pm4_profile::GpuBlockInfo* info = NULL; - if (block_id < tables.get_block_info_count()) { - info = tables.get_block_info_ptr() + block_id; - if (info->counterGroupId != block_id) - throw aql_profile_exception(std::string("Bad block id table, block_id"), - block_id); - } else - throw aql_profile_exception(std::string("Invalid block id, block_id"), block_id); - return info; - } - const pm4_profile::GpuBlockInfo* getBlockInfo(const event_t* event) { - const uint32_t block_id = getBlockId(event); - return getBlockInfo(block_id); - } - - protected: - class tables_t { - public: - tables_t(uint32_t* dp, uint32_t dc, pm4_profile::GpuBlockInfo* ip, uint32_t ic) - : block_id_ptr(dp), block_id_count(dc), block_info_ptr(ip), block_info_count(ic) {} - tables_t(const tables_t& t) - : block_id_ptr(t.block_id_ptr), - block_id_count(t.block_id_count), - block_info_ptr(t.block_info_ptr), - block_info_count(t.block_info_count) {} - tables_t() : block_id_ptr(0), block_id_count(0), block_info_ptr(0), block_info_count(0) {} - - uint32_t* get_block_id_ptr() { return block_id_ptr; } - uint32_t get_block_id_count() { return block_id_count; } - pm4_profile::GpuBlockInfo* get_block_info_ptr() { return block_info_ptr; } - uint32_t get_block_info_count() { return block_info_count; } - - private: - uint32_t* block_id_ptr; - uint32_t block_id_count; - pm4_profile::GpuBlockInfo* block_info_ptr; - uint32_t block_info_count; - }; - - Pm4Factory(const tables_t& t) { tables = t; } - - static tables_t tables; -}; - -class Gfx8Factory : public Pm4Factory { - public: - Gfx8Factory() - : Pm4Factory(tables_t(block_id_table, HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER, - pm4_profile::Gfx8HwBlocks, pm4_profile::Gfx8HwBlockCount)) {} - pm4_profile::CommandWriter* getCommandWriter(); - pm4_profile::Pmu* getPmcMgr(); - pm4_profile::ThreadTrace* getSqttMgr(); - - private: - static uint32_t block_id_table[HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER]; -}; - -class Gfx9Factory : public Pm4Factory { - public: - Gfx9Factory() - : Pm4Factory(tables_t(block_id_table, HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER, - pm4_profile::Gfx9HwBlocks, pm4_profile::Gfx9HwBlockCount)) {} - pm4_profile::CommandWriter* getCommandWriter(); - pm4_profile::Pmu* getPmcMgr(); - pm4_profile::ThreadTrace* getSqttMgr(); - - private: - static uint32_t block_id_table[HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER]; -}; - -inline Pm4Factory* Pm4Factory::Create(const hsa_ext_amd_aql_profile_profile_t* profile) { - Pm4Factory* instance = NULL; - char agent_name[64]; - hsa_agent_get_info(profile->agent, HSA_AGENT_INFO_NAME, agent_name); - - if (strncmp(agent_name, "gfx801", 6) == 0) { - throw aql_profile_exception(std::string("GFX8 Carrizo is not supported "), - agent_name); - } else if (strncmp(agent_name, "gfx8", 4) == 0) { - instance = new Gfx8Factory(); - } else if (strncmp(agent_name, "gfx9", 4) == 0) { - instance = new Gfx9Factory(); - } - - return instance; -} - -} // aql_profile - -#endif // _PM4_FACTORY_H_ diff --git a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/perf_counter.h b/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/perf_counter.h deleted file mode 100644 index dffdcce027..0000000000 --- a/projects/rocr-runtime/runtime/hsa-ext-aql-profile/src/perfcounter/perf_counter.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef _HSA_PERF_H_ -#define _HSA_PERF_H_ - -#include -#include -#include -#include - -namespace pm4_profile { -class DefaultCmdBuf; -class CommandWriter; - -typedef std::vector CountersVec; -typedef std::map CountersMap; - -class Pmu { - public: - // Enumeration of Pmu error codes - typedef enum ErrorCode { - // Generic PMU error - kErrorCodeNoError = 0x0, - - // Unknown CounterBlock ID - kErrorCodeUnknownCounterBlockId, - - // No CounterBlock exists - kErrorCodeNoCounterBlock, - - // The previously operation is not valid. This could be due to - // invalid transition from the current state. - kErrorCodeInvalidOperation, - - // PMU is not currently available (e.g. PMU is currently - // in-used by others) - kErrorCodeNotAvailable, - - // PMU is not currently available (e.g. PMU is currently - // in-used by others) - kErrorCodeErrorState, - - // PMU result is timeout - kErrorCodeTimeOut, - - // Max error count - kErrorCodeMax - } ErrorCode; - - // Destructor of PMU. - // note This stops the performance counters if running and releases - // any resources used by the PMU. - virtual ~Pmu() {} - - // Retrieve the last error code generated. This should be checked when - // values returned are NULL or void. - // Return an integer corresponding to the last error reported. - virtual int getLastError() = 0; - - // Given and error number reported from getLastError or returned from a - // function call, retreive the corresponding stl string. - // @param[in] error The error corresponding to a call to getLastError - // or a return code from a function call. - // Return An stl string representing a text corresponding to the error - // number. If invalid error code is given, the returned string is empty. - virtual std::string getErrorString(int error) = 0; - - // Start profiling on the PMU. - // @param[in] reset_counter indicates whether reset counter before - // recording. Default is reset counters. - // note This function must be implemented by children classes. - // Return true or false - // Possible error codes are: - // kErrorCodeInvalidOperation - // kErrorCodeNotAvailable - virtual void begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, - const CountersMap& countersMap) = 0; - - // Stop profiling on the PMU. - // note This function must be called after \ref begin(). - // note This function must be implemented by children classes. - // Return true or false - // Possible error codes are: - // kErrorCodeInvalidOperation - virtual uint32_t end(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, - const CountersMap& countersMap, void* dataBuff) = 0; - - // Returns number of shader engines per block - // for the blocks featured shader engines instancing - virtual uint32_t getNumSe() = 0; - -}; // class Pmu -} // pm4_profile -#endif // _HSA_PERF_H_ diff --git a/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_api_trace_int.h b/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_api_trace_int.h index 769dbed2e0..67acd50cd5 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_api_trace_int.h +++ b/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_api_trace_int.h @@ -51,12 +51,14 @@ namespace core { static const uint32_t HSA_EXT_FINALIZER_API_TABLE_ID = 0; static const uint32_t HSA_EXT_IMAGE_API_TABLE_ID = 1; + static const uint32_t HSA_EXT_AQLPROFILE_API_TABLE_ID = 2; ::HsaApiTable hsa_api; ::CoreApiTable core_api; ::AmdExtTable amd_ext_api; ::FinalizerExtTable finalizer_api; ::ImageExtTable image_api; + ::AqlProfileExtTable aqlprofile_api; HsaApiTable(); void Init(); diff --git a/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_ext_interface.h b/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_ext_interface.h index 236a165c73..b86d435e75 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_ext_interface.h +++ b/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_ext_interface.h @@ -65,10 +65,14 @@ class ExtensionEntryPoints { // Table of function pointers for Hsa Extension Finalizer FinalizerExtTable finalizer_api; + // Table of function pointers for Hsa Extension AqlProfiler + AqlProfileExtTable aqlprofile_api; + ExtensionEntryPoints(); bool LoadFinalizer(std::string library_name); bool LoadImage(std::string library_name); + bool LoadAqlProfileApi(std::string library_name); void Unload(); private: @@ -83,6 +87,9 @@ class ExtensionEntryPoints { // Initialize table for HSA Image Extension Api's void InitImageExtTable(); + // Initialize table for HSA AqlProfile Extension Api's + void InitAqlProfileExtTable(); + // Initialize Amd Ext table for Api related to Images void InitAmdExtTable(); diff --git a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa.cpp b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa.cpp index 64129ac03f..04217e21c5 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa.cpp +++ b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa.cpp @@ -70,6 +70,7 @@ #include "core/inc/interrupt_signal.h" #include "core/inc/amd_loader_context.hpp" #include "inc/hsa_ven_amd_loader.h" +#include "inc/hsa_ven_amd_aqlprofile.h" #include "core/inc/hsa_ext_amd_impl.h" using namespace amd::hsa; @@ -230,6 +231,9 @@ hsa_status_t hsa_extension_get_name(uint16_t extension, const char** name) { case HSA_EXTENSION_AMD_LOADER: *name = "HSA_EXTENSION_AMD_LOADER"; break; + case HSA_EXTENSION_AMD_AQLPROFILE: + *name = "HSA_EXTENSION_AMD_AQLPROFILE"; + break; default: *name = "HSA_EXTENSION_INVALID"; return HSA_STATUS_ERROR_INVALID_ARGUMENT; @@ -293,6 +297,12 @@ hsa_status_t hsa_system_major_extension_supported(uint16_t extension, uint16_t v return HSA_STATUS_SUCCESS; } + if ((extension == HSA_EXTENSION_AMD_AQLPROFILE) && (version_major == 1)) { + *version_minor = 0; + *result = true; + return HSA_STATUS_SUCCESS; + } + *result = false; return HSA_STATUS_SUCCESS; } @@ -306,7 +316,8 @@ static size_t get_extension_table_length(uint16_t extension, uint16_t major, uin static sizes_t sizes[] = { {"hsa_ext_images_1_00_pfn_t", sizeof(hsa_ext_images_1_00_pfn_t)}, {"hsa_ext_finalizer_1_00_pfn_t", sizeof(hsa_ext_finalizer_1_00_pfn_t)}, - {"hsa_ven_amd_loader_1_00_pfn_t", sizeof(hsa_ven_amd_loader_1_00_pfn_t)}}; + {"hsa_ven_amd_loader_1_00_pfn_t", sizeof(hsa_ven_amd_loader_1_00_pfn_t)}, + {"hsa_ven_amd_aqlprofile_1_00_pfn_t", sizeof(hsa_ven_amd_aqlprofile_1_00_pfn_t)}}; static const size_t num_tables = sizeof(sizes) / sizeof(sizes_t); if (minor > 99) return 0; @@ -332,6 +343,9 @@ static size_t get_extension_table_length(uint16_t extension, uint16_t major, uin case HSA_EXTENSION_AMD_LOADER: name = "hsa_ven_amd_loader_"; break; + case HSA_EXTENSION_AMD_AQLPROFILE: + name = "hsa_ven_amd_aqlprofile_"; + break; default: return 0; } @@ -361,7 +375,11 @@ hsa_status_t hsa_system_get_major_extension_table(uint16_t extension, uint16_t v if (table_length == 0) return HSA_STATUS_ERROR_INVALID_ARGUMENT; if (extension == HSA_EXTENSION_IMAGES) { - if (version_major > 1) return HSA_STATUS_ERROR; + if (version_major != + core::Runtime::runtime_singleton_->extensions_.image_api.version.major_id) { + return HSA_STATUS_ERROR; + } + hsa_ext_images_1_pfn_t ext_table; ext_table.hsa_ext_image_clear = hsa_ext_image_clear; ext_table.hsa_ext_image_copy = hsa_ext_image_copy; @@ -383,7 +401,11 @@ hsa_status_t hsa_system_get_major_extension_table(uint16_t extension, uint16_t v } if (extension == HSA_EXTENSION_FINALIZER) { - if (version_major > 1) return HSA_STATUS_ERROR; + if (version_major != + core::Runtime::runtime_singleton_->extensions_.finalizer_api.version.major_id) { + return HSA_STATUS_ERROR; + } + hsa_ext_finalizer_1_00_pfn_t ext_table; ext_table.hsa_ext_program_add_module = hsa_ext_program_add_module; ext_table.hsa_ext_program_create = hsa_ext_program_create; @@ -410,6 +432,26 @@ hsa_status_t hsa_system_get_major_extension_table(uint16_t extension, uint16_t v return HSA_STATUS_SUCCESS; } + if (extension == HSA_EXTENSION_AMD_AQLPROFILE) { + if (version_major != + core::Runtime::runtime_singleton_->extensions_.aqlprofile_api.version.major_id) { + return HSA_STATUS_ERROR; + } + + hsa_ven_amd_aqlprofile_1_00_pfn_t ext_table; + ext_table.hsa_ven_amd_aqlprofile_error_string = hsa_ven_amd_aqlprofile_error_string; + ext_table.hsa_ven_amd_aqlprofile_validate_event = hsa_ven_amd_aqlprofile_validate_event; + ext_table.hsa_ven_amd_aqlprofile_start = hsa_ven_amd_aqlprofile_start; + ext_table.hsa_ven_amd_aqlprofile_stop = hsa_ven_amd_aqlprofile_stop; + ext_table.hsa_ven_amd_aqlprofile_legacy_get_pm4 = hsa_ven_amd_aqlprofile_legacy_get_pm4; + ext_table.hsa_ven_amd_aqlprofile_get_info = hsa_ven_amd_aqlprofile_get_info; + ext_table.hsa_ven_amd_aqlprofile_iterate_data = hsa_ven_amd_aqlprofile_iterate_data; + + memcpy(table, &ext_table, Min(sizeof(ext_table), table_length)); + + return HSA_STATUS_SUCCESS; + } + return HSA_STATUS_ERROR; } diff --git a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa_ext_interface.cpp b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa_ext_interface.cpp index 39dc71fb50..ae6f0ca8f1 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa_ext_interface.cpp +++ b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa_ext_interface.cpp @@ -42,6 +42,8 @@ #include "core/inc/hsa_ext_interface.h" +#include + #include "core/inc/runtime.h" namespace core { @@ -169,6 +171,7 @@ static T0 hsa_amd_null(T1, T2, T3, T4, T5, T6) { ExtensionEntryPoints::ExtensionEntryPoints() { InitFinalizerExtTable(); InitImageExtTable(); + InitAqlProfileExtTable(); InitAmdExtTable(); } @@ -212,6 +215,21 @@ void ExtensionEntryPoints::InitImageExtTable() { image_api.hsa_ext_image_create_with_layout_fn = hsa_ext_null; } +void ExtensionEntryPoints::InitAqlProfileExtTable() { + // Initialize Version of Api Table + aqlprofile_api.version.major_id = 0x00; + aqlprofile_api.version.minor_id = 0x00; + aqlprofile_api.version.step_id = 0x00; + + aqlprofile_api.hsa_ven_amd_aqlprofile_error_string_fn = hsa_ext_null; + aqlprofile_api.hsa_ven_amd_aqlprofile_validate_event_fn = hsa_ext_null; + aqlprofile_api.hsa_ven_amd_aqlprofile_start_fn = hsa_ext_null; + aqlprofile_api.hsa_ven_amd_aqlprofile_stop_fn = hsa_ext_null; + aqlprofile_api.hsa_ven_amd_aqlprofile_legacy_get_pm4_fn = hsa_ext_null; + aqlprofile_api.hsa_ven_amd_aqlprofile_get_info_fn = hsa_ext_null; + aqlprofile_api.hsa_ven_amd_aqlprofile_iterate_data_fn = hsa_ext_null; +} + // Initialize Amd Ext table for Api related to Images void ExtensionEntryPoints::InitAmdExtTable() { hsa_api_table_.amd_ext_api.hsa_amd_image_create_fn = hsa_ext_null; @@ -485,6 +503,81 @@ bool ExtensionEntryPoints::LoadFinalizer(std::string library_name) { return true; } +bool ExtensionEntryPoints::LoadAqlProfileApi(std::string library_name) { + os::LibHandle lib = os::LoadLib(library_name); + if (lib == NULL) { + return false; + } + libs_.push_back(lib); + + void* ptr; + + ptr = os::GetExportAddress(lib, "hsa_ven_amd_aqlprofile_error_string"); + if (ptr != NULL) { + assert(aqlprofile_api.hsa_ven_amd_aqlprofile_error_string_fn == + (decltype(::hsa_ven_amd_aqlprofile_error_string)*)hsa_ext_null && + "Duplicate load of extension import."); + aqlprofile_api.hsa_ven_amd_aqlprofile_error_string_fn = (decltype(::hsa_ven_amd_aqlprofile_error_string)*)ptr; + } + ptr = os::GetExportAddress(lib, "hsa_ven_amd_aqlprofile_validate_event"); + if (ptr != NULL) { + assert(aqlprofile_api.hsa_ven_amd_aqlprofile_validate_event_fn == + (decltype(::hsa_ven_amd_aqlprofile_validate_event)*)hsa_ext_null && + "Duplicate load of extension import."); + aqlprofile_api.hsa_ven_amd_aqlprofile_validate_event_fn = (decltype(::hsa_ven_amd_aqlprofile_validate_event)*)ptr; + } + ptr = os::GetExportAddress(lib, "hsa_ven_amd_aqlprofile_start"); + if (ptr != NULL) { + assert(aqlprofile_api.hsa_ven_amd_aqlprofile_start_fn == + (decltype(::hsa_ven_amd_aqlprofile_start)*)hsa_ext_null && + "Duplicate load of extension import."); + aqlprofile_api.hsa_ven_amd_aqlprofile_start_fn = (decltype(::hsa_ven_amd_aqlprofile_start)*)ptr; + } + ptr = os::GetExportAddress(lib, "hsa_ven_amd_aqlprofile_stop"); + if (ptr != NULL) { + assert(aqlprofile_api.hsa_ven_amd_aqlprofile_stop_fn == + (decltype(::hsa_ven_amd_aqlprofile_stop)*)hsa_ext_null && + "Duplicate load of extension import."); + aqlprofile_api.hsa_ven_amd_aqlprofile_stop_fn = (decltype(::hsa_ven_amd_aqlprofile_stop)*)ptr; + } + ptr = os::GetExportAddress(lib, "hsa_ven_amd_aqlprofile_legacy_get_pm4"); + if (ptr != NULL) { + assert(aqlprofile_api.hsa_ven_amd_aqlprofile_legacy_get_pm4_fn == + (decltype(::hsa_ven_amd_aqlprofile_legacy_get_pm4)*)hsa_ext_null && + "Duplicate load of extension import."); + aqlprofile_api.hsa_ven_amd_aqlprofile_legacy_get_pm4_fn = (decltype(::hsa_ven_amd_aqlprofile_legacy_get_pm4)*)ptr; + } + ptr = os::GetExportAddress(lib, "hsa_ven_amd_aqlprofile_get_info"); + if (ptr != NULL) { + assert(aqlprofile_api.hsa_ven_amd_aqlprofile_get_info_fn == + (decltype(::hsa_ven_amd_aqlprofile_get_info)*)hsa_ext_null && + "Duplicate load of extension import."); + aqlprofile_api.hsa_ven_amd_aqlprofile_get_info_fn = (decltype(::hsa_ven_amd_aqlprofile_get_info)*)ptr; + } + ptr = os::GetExportAddress(lib, "hsa_ven_amd_aqlprofile_iterate_data"); + if (ptr != NULL) { + assert(aqlprofile_api.hsa_ven_amd_aqlprofile_iterate_data_fn == + (decltype(::hsa_ven_amd_aqlprofile_iterate_data)*)hsa_ext_null && + "Duplicate load of extension import."); + aqlprofile_api.hsa_ven_amd_aqlprofile_iterate_data_fn = (decltype(::hsa_ven_amd_aqlprofile_iterate_data)*)ptr; + } + + // Initialize Version of Api Table + aqlprofile_api.version.major_id = HSA_AQLPROFILE_API_TABLE_MAJOR_VERSION; + aqlprofile_api.version.minor_id = sizeof(::AqlProfileExtTable); + aqlprofile_api.version.step_id = HSA_AQLPROFILE_API_TABLE_STEP_VERSION; + + // Update handle of table of HSA extensions + hsa_internal_api_table_.CloneExts(&aqlprofile_api, + core::HsaApiTable::HSA_EXT_AQLPROFILE_API_TABLE_ID); + + ptr = os::GetExportAddress(lib, "Load"); + if (ptr != NULL) { + ((Load_t)ptr)(&core::hsa_internal_api_table_.hsa_api); + } + + return true; +} } // namespace core @@ -655,6 +748,57 @@ hsa_status_t hsa_ext_image_create_with_layout( image); } +hsa_status_t hsa_ven_amd_aqlprofile_error_string( + const char** str) // [out] pointer on the error string +{ + return core::Runtime::runtime_singleton_->extensions_.aqlprofile_api.hsa_ven_amd_aqlprofile_error_string_fn(str); +} + +hsa_status_t hsa_ven_amd_aqlprofile_validate_event( + hsa_agent_t agent, // HSA handle for the profiling GPU + const hsa_ven_amd_aqlprofile_event_t* event, // [in] Pointer on validated event + bool* result) // [out] True if the event valid, False otherwise +{ + return core::Runtime::runtime_singleton_->extensions_.aqlprofile_api.hsa_ven_amd_aqlprofile_validate_event_fn(agent, event, result); +} + +hsa_status_t hsa_ven_amd_aqlprofile_start( + const hsa_ven_amd_aqlprofile_profile_t* profile, // [in] profile contex object + hsa_ext_amd_aql_pm4_packet_t* aql_start_packet) // [out] profile start AQL packet +{ + return core::Runtime::runtime_singleton_->extensions_.aqlprofile_api.hsa_ven_amd_aqlprofile_start_fn(profile, aql_start_packet); +} + +hsa_status_t hsa_ven_amd_aqlprofile_stop( + const hsa_ven_amd_aqlprofile_profile_t* profile, // [in] profile contex object + hsa_ext_amd_aql_pm4_packet_t* aql_stop_packet) // [out] profile stop AQL packet +{ + return core::Runtime::runtime_singleton_->extensions_.aqlprofile_api.hsa_ven_amd_aqlprofile_stop_fn(profile, aql_stop_packet); +} + +hsa_status_t hsa_ven_amd_aqlprofile_legacy_get_pm4( + const hsa_ext_amd_aql_pm4_packet_t* aql_packet, // [in] AQL packet + void* data) // [out] PM4 packet blob +{ + return core::Runtime::runtime_singleton_->extensions_.aqlprofile_api.hsa_ven_amd_aqlprofile_legacy_get_pm4_fn(aql_packet, data); +} + +hsa_status_t hsa_ven_amd_aqlprofile_get_info( + const hsa_ven_amd_aqlprofile_profile_t* profile, // [in] profile context object + hsa_ven_amd_aqlprofile_info_type_t attribute, // [in] requested profile attribute + void* value) // [in/out] returned value +{ + return core::Runtime::runtime_singleton_->extensions_.aqlprofile_api.hsa_ven_amd_aqlprofile_get_info_fn(profile, attribute, value); +} + +hsa_status_t hsa_ven_amd_aqlprofile_iterate_data( + const hsa_ven_amd_aqlprofile_profile_t* profile, // [in] profile context object + hsa_ven_amd_aqlprofile_data_callback_t callback, // [in] callback to iterate the output data + void* data) // [in/out] data passed to the callback +{ + return core::Runtime::runtime_singleton_->extensions_.aqlprofile_api.hsa_ven_amd_aqlprofile_iterate_data_fn(profile, callback, data); +} + //---------------------------------------------------------------------------// // Stubs for internal extension functions //---------------------------------------------------------------------------// diff --git a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/runtime.cpp b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/runtime.cpp index 442fe82f52..181c4b110d 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/runtime.cpp +++ b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/runtime.cpp @@ -1038,11 +1038,15 @@ void Runtime::LoadExtensions() { "libhsa-ext-finalize64.so.1"}; static const std::string kImageLib[] = {"hsa-ext-image64.dll", "libhsa-ext-image64.so.1"}; + static const std::string kAqlProfileLib[] = {"hsa-amd-aqlprofile64.dll", + "libhsa-amd-aqlprofile64.so.1"}; #else static const std::string kFinalizerLib[] = {"hsa-ext-finalize.dll", "libhsa-ext-finalize.so.1"}; static const std::string kImageLib[] = {"hsa-ext-image.dll", "libhsa-ext-image.so.1"}; + static const std::string kAqlProfileLib[] = {"hsa-amd-aqlprofile.dll", + "libhsa-amd-aqlprofile.so.1"}; #endif // Update Hsa Api Table with handle of Image extension Apis @@ -1054,6 +1058,9 @@ void Runtime::LoadExtensions() { extensions_.LoadImage(kImageLib[os_index(os::current_os)]); hsa_api_table_.LinkExts(&extensions_.image_api, core::HsaApiTable::HSA_EXT_IMAGE_API_TABLE_ID); + + // Update Hsa Api Table with handle of AqlProfile extension Apis + extensions_.LoadAqlProfileApi(kAqlProfileLib[os_index(os::current_os)]); } void Runtime::UnloadExtensions() { extensions_.Unload(); } diff --git a/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa.h b/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa.h index f7d15ba7e5..b8ec90a667 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa.h +++ b/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa.h @@ -535,10 +535,14 @@ typedef enum { * Loader extension. */ HSA_EXTENSION_AMD_LOADER = 0x201, + /** + * AqlProfile extension. + */ + HSA_EXTENSION_AMD_AQLPROFILE = 0x202, /** * Last AMD extension. */ - HSA_AMD_LAST_EXTENSION = 0x201 + HSA_AMD_LAST_EXTENSION = 0x202 } hsa_extension_t; /** diff --git a/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_api_trace.h b/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_api_trace.h index 5ecdf7bb09..e74ec30d09 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_api_trace.h +++ b/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_api_trace.h @@ -48,10 +48,12 @@ #include "hsa_ext_image.h" #include "hsa_ext_amd.h" #include "hsa_ext_finalize.h" +#include "hsa_ven_amd_aqlprofile.h" #else #include "inc/hsa_ext_image.h" #include "inc/hsa_ext_amd.h" #include "inc/hsa_ext_finalize.h" +#include "inc/hsa_ven_amd_aqlprofile.h" #endif #include @@ -64,6 +66,7 @@ #define HSA_AMD_EXT_API_TABLE_MAJOR_VERSION 0x01 #define HSA_FINALIZER_API_TABLE_MAJOR_VERSION 0x01 #define HSA_IMAGE_API_TABLE_MAJOR_VERSION 0x01 +#define HSA_AQLPROFILE_API_TABLE_MAJOR_VERSION 0x01 // Step Ids of the Api tables exported by Hsa Core Runtime #define HSA_API_TABLE_STEP_VERSION 0x00 @@ -71,6 +74,7 @@ #define HSA_AMD_EXT_API_TABLE_STEP_VERSION 0x00 #define HSA_FINALIZER_API_TABLE_STEP_VERSION 0x00 #define HSA_IMAGE_API_TABLE_STEP_VERSION 0x00 +#define HSA_AQLPROFILE_API_TABLE_STEP_VERSION 0x00 // Min function used to copy Api Tables static inline uint32_t Min(const uint32_t a, const uint32_t b) { @@ -116,6 +120,18 @@ struct ImageExtTable { decltype(hsa_ext_image_create_with_layout)* hsa_ext_image_create_with_layout_fn; }; +// Table to export HSA AqlProfile AMD specific Extension Apis +struct AqlProfileExtTable { + ApiTableVersion version; + decltype(hsa_ven_amd_aqlprofile_error_string)* hsa_ven_amd_aqlprofile_error_string_fn; + decltype(hsa_ven_amd_aqlprofile_validate_event)* hsa_ven_amd_aqlprofile_validate_event_fn; + decltype(hsa_ven_amd_aqlprofile_start)* hsa_ven_amd_aqlprofile_start_fn; + decltype(hsa_ven_amd_aqlprofile_stop)* hsa_ven_amd_aqlprofile_stop_fn; + decltype(hsa_ven_amd_aqlprofile_legacy_get_pm4)* hsa_ven_amd_aqlprofile_legacy_get_pm4_fn; + decltype(hsa_ven_amd_aqlprofile_get_info)* hsa_ven_amd_aqlprofile_get_info_fn; + decltype(hsa_ven_amd_aqlprofile_iterate_data)* hsa_ven_amd_aqlprofile_iterate_data_fn; +}; + // Table to export AMD Extension Apis struct AmdExtTable { ApiTableVersion version; diff --git a/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_ven_amd_aqlprofile.h b/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_ven_amd_aqlprofile.h new file mode 100644 index 0000000000..784df62c2f --- /dev/null +++ b/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_ven_amd_aqlprofile.h @@ -0,0 +1,304 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2017 ADVANCED MICRO DEVICES, INC. +// +// AMD is granting you permission to use this software and documentation(if any) +// (collectively, the "Materials") pursuant to the terms and conditions of the +// Software License Agreement included with the Materials.If you do not have a +// copy of the Software License Agreement, contact your AMD representative for a +// copy. +// +// You agree that you will not reverse engineer or decompile the Materials, in +// whole or in part, except as allowed by applicable law. +// +// WARRANTY DISCLAIMER : THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND.AMD DISCLAIMS ALL WARRANTIES, EXPRESS, IMPLIED, OR STATUTORY, +// INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE, NON - INFRINGEMENT, THAT THE +// SOFTWARE WILL RUN UNINTERRUPTED OR ERROR - FREE OR WARRANTIES ARISING FROM +// CUSTOM OF TRADE OR COURSE OF USAGE.THE ENTIRE RISK ASSOCIATED WITH THE USE OF +// THE SOFTWARE IS ASSUMED BY YOU.Some jurisdictions do not allow the exclusion +// of implied warranties, so the above exclusion may not apply to You. +// +// LIMITATION OF LIABILITY AND INDEMNIFICATION : AMD AND ITS LICENSORS WILL NOT, +// UNDER ANY CIRCUMSTANCES BE LIABLE TO YOU FOR ANY PUNITIVE, DIRECT, +// INCIDENTAL, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM USE OF +// THE SOFTWARE OR THIS AGREEMENT EVEN IF AMD AND ITS LICENSORS HAVE BEEN +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.In no event shall AMD's total +// liability to You for all damages, losses, and causes of action (whether in +// contract, tort (including negligence) or otherwise) exceed the amount of $100 +// USD. You agree to defend, indemnify and hold harmless AMD and its licensors, +// and any of their directors, officers, employees, affiliates or agents from +// and against any and all loss, damage, liability and other expenses (including +// reasonable attorneys' fees), resulting from Your use of the Software or +// violation of the terms and conditions of this Agreement. +// +// U.S.GOVERNMENT RESTRICTED RIGHTS : The Materials are provided with +// "RESTRICTED RIGHTS." Use, duplication, or disclosure by the Government is +// subject to the restrictions as set forth in FAR 52.227 - 14 and DFAR252.227 - +// 7013, et seq., or its successor.Use of the Materials by the Government +// constitutes acknowledgement of AMD's proprietary rights in them. +// +// EXPORT RESTRICTIONS: The Materials may be subject to export restrictions as +// stated in the Software License Agreement. +// +//////////////////////////////////////////////////////////////////////////////// + +#ifndef OPENSRC_HSA_RUNTIME_INC_HSA_VEN_AMD_AQLPROFILE_H_ +#define OPENSRC_HSA_RUNTIME_INC_HSA_VEN_AMD_AQLPROFILE_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/////////////////////////////////////////////////////////////////////// +// Library API: +// The library provides helper methods for instantiation of +// the profile context object and for populating of the start +// and stop AQL packets. The profile object contains a profiling +// events list and needed for profiling buffers descriptors, +// a command buffer and an output data buffer. To check if there +// was an error the library methods return a status code. Also +// the library provides methods for querying required buffers +// attributes, to validate the event attributes and to get profiling +// output data. +// +// Returned status: +// hsa_status_t – HSA status codes are used from hsa.h header +// +// Supported profiling features: +// +// Supported profiling events +typedef enum { + HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_PMC, + HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_SQTT +} hsa_ven_amd_aqlprofile_event_type_t; + +// Supported performance counters (PMC) blocks +// The block ID is the same for a block instances set, for example +// each block instance from the TCC block set, TCC0, TCC1, …, TCCN +// will have the same block ID HSA_VEN_AMD_AQLPROFILE_BLOCKS_TCC. +typedef enum { + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_CB, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_CPF, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_DB, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GRBM, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GRBMSE, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_PASU, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_PASC, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SPI, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQ, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQES, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQGS, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQVS, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQPS, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQLS, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQHS, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQCS, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SX, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TA, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCA, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCC, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TD, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCP, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GDS, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_VGT, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_IA, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MC, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SRBM, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCS, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_WD, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_CPG, + HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_CPC, + HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER +} hsa_ven_amd_aqlprofile_block_name_t; + +// PMC event object structure +// ‘counter_id’ value is specified in GFXIPs perfcounter user guides +// which is the counters select value, “Performance Counters Selection” +// chapter. +typedef struct { + hsa_ven_amd_aqlprofile_block_name_t block_name; + uint32_t block_index; + uint32_t counter_id; +} hsa_ven_amd_aqlprofile_event_t; + +// Check if event is valid for the specific GPU +hsa_status_t hsa_ven_amd_aqlprofile_validate_event( + hsa_agent_t agent, // HSA handle for the profiling GPU + const hsa_ven_amd_aqlprofile_event_t* event, // [in] Pointer on validated event + bool* result); // [out] True if the event valid, False otherwise + +// Profiling parameters +// All parameters are generic and if not applicable for a specific +// profile configuration then error status will be returned. +typedef enum { + // SQTT applicable parameters + HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_COMPUTE_UNIT_TARGET, + HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_VM_ID_MASK, + HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_MASK, + HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_TOKEN_MASK, + HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_TOKEN_MASK2 +} hsa_ven_amd_aqlprofile_parameter_name_t; + +// Profile parameter object +typedef struct { + hsa_ven_amd_aqlprofile_parameter_name_t parameter_name; + uint32_t value; +} hsa_ven_amd_aqlprofile_parameter_t; + +// +// Profile context object: +// The library provides a profile object structure which contains +// the events array, a buffer for the profiling start/stop commands +// and a buffer for the output data. +// The buffers are specified by the buffer descriptors and allocated +// by the application. The buffers allocation attributes, the command +// buffer size, the PMC output buffer size as well as profiling output +// data can be get using the generic get profile info helper _get_info. +// +// Buffer descriptor +typedef struct { + void* ptr; + uint32_t size; +} hsa_ven_amd_aqlprofile_descriptor_t; + +// Profile context object structure, contains profiling events list and +// needed for profiling buffers descriptors, a command buffer and +// an output data buffer +typedef struct { + hsa_agent_t agent; // GFXIP handle + hsa_ven_amd_aqlprofile_event_type_t type; // Events type + const hsa_ven_amd_aqlprofile_event_t* events; // Events array + uint32_t event_count; // Events count + const hsa_ven_amd_aqlprofile_parameter_t* parameters; // Parameters array + uint32_t parameter_count; // Parameters count + hsa_ven_amd_aqlprofile_descriptor_t output_buffer; // Output buffer + hsa_ven_amd_aqlprofile_descriptor_t command_buffer; // PM4 commands +} hsa_ven_amd_aqlprofile_profile_t; + +// +// AQL packets populating methods: +// The helper methods to populate provided by the application START and +// STOP AQL packets which the application is required to submit before and +// after profiled GPU task packets respectively. +// +// AQL Vendor Specific packet which carries a PM4 command +typedef struct { + uint16_t header; + uint16_t pm4_command[27]; + hsa_signal_t completion_signal; +} hsa_ext_amd_aql_pm4_packet_t; + +// Method to populate the provided AQL packet with profiling start commands +// Only 'pm4_command' fields of the packet are set and the application +// is responsible to set Vendor Specific header type a completion signal +hsa_status_t hsa_ven_amd_aqlprofile_start( + const hsa_ven_amd_aqlprofile_profile_t* profile, // [in] profile contex object + hsa_ext_amd_aql_pm4_packet_t* aql_start_packet); // [out] profile start AQL packet + +// Method to populate the provided AQL packet with profiling stop commands +// Only 'pm4_command' fields of the packet are set and the application +// is responsible to set Vendor Specific header type and a completion signal +hsa_status_t hsa_ven_amd_aqlprofile_stop( + const hsa_ven_amd_aqlprofile_profile_t* profile, // [in] profile contex object + hsa_ext_amd_aql_pm4_packet_t* aql_stop_packet); // [out] profile stop AQL packet + +// Legacy devices, PM4 profiling packet size +const unsigned HSA_VEN_AMD_AQLPROFILE_LEGACY_PM4_PACKET_SIZE = 192; +// Legacy devices, converting the profiling AQL packet to PM4 packet blob +hsa_status_t hsa_ven_amd_aqlprofile_legacy_get_pm4( + const hsa_ext_amd_aql_pm4_packet_t* aql_packet, // [in] AQL packet + void* data); // [out] PM4 packet blob + +// +// Get profile info: +// Generic method for getting various profile info including profile buffers +// attributes like the command buffer size and the profiling PMC results. +// It’s implied that all counters are 64bit values. +// +// Profile generic output data: +typedef struct { + uint32_t sample_id; // PMC sample of SQTT buffer index + union { + struct { + hsa_ven_amd_aqlprofile_event_t event; // PMC event + uint64_t result; // PMC result + } pmc_data; + hsa_ven_amd_aqlprofile_descriptor_t sqtt_data; // SQTT output data descriptor + }; +} hsa_ven_amd_aqlprofile_info_data_t; + +// Profile attributes +typedef enum { + HSA_VEN_AMD_AQLPROFILE_INFO_COMMAND_BUFFER_SIZE, // get_info returns uint32_t value + HSA_VEN_AMD_AQLPROFILE_INFO_PMC_DATA_SIZE, // get_info returns uint32_t value + HSA_VEN_AMD_AQLPROFILE_INFO_PMC_DATA, // get_info returns PMC uint64_t value + // in info_data object + HSA_VEN_AMD_AQLPROFILE_INFO_SQTT_DATA // get_info returns SQTT buffer ptr/size + // in info_data object +} hsa_ven_amd_aqlprofile_info_type_t; + +// Definition of output data iterator callback +typedef hsa_status_t (*hsa_ven_amd_aqlprofile_data_callback_t)( + hsa_ven_amd_aqlprofile_info_type_t info_type, // [in] data type, PMC or SQTT data + hsa_ven_amd_aqlprofile_info_data_t* info_data, // [in] info_data object + void* callback_data); // [in/out] data passed to the callback + +// Method for getting the profile info +hsa_status_t hsa_ven_amd_aqlprofile_get_info( + const hsa_ven_amd_aqlprofile_profile_t* profile, // [in] profile context object + hsa_ven_amd_aqlprofile_info_type_t attribute, // [in] requested profile attribute + void* value); // [in/out] returned value + +// Method for iterating the events output data +hsa_status_t hsa_ven_amd_aqlprofile_iterate_data( + const hsa_ven_amd_aqlprofile_profile_t* profile, // [in] profile context object + hsa_ven_amd_aqlprofile_data_callback_t callback, // [in] callback to iterate the output data + void* data); // [in/out] data passed to the callback + +// Return error string +hsa_status_t hsa_ven_amd_aqlprofile_error_string( + const char** str); // [out] pointer on the error string + +/** + * @brief Extension version. + */ +#define hsa_ven_amd_aqlprofile 001000 + +/** + * @brief Extension function table. + */ +typedef struct hsa_ven_amd_aqlprofile_1_00_pfn_s { + hsa_status_t (*hsa_ven_amd_aqlprofile_error_string)(const char** str); + + hsa_status_t (*hsa_ven_amd_aqlprofile_validate_event)(hsa_agent_t agent, + const hsa_ven_amd_aqlprofile_event_t* event, + bool* result); + + hsa_status_t (*hsa_ven_amd_aqlprofile_start)(const hsa_ven_amd_aqlprofile_profile_t* profile, + hsa_ext_amd_aql_pm4_packet_t* aql_start_packet); + + hsa_status_t (*hsa_ven_amd_aqlprofile_stop)(const hsa_ven_amd_aqlprofile_profile_t* profile, + hsa_ext_amd_aql_pm4_packet_t* aql_start_packet); + + hsa_status_t (*hsa_ven_amd_aqlprofile_legacy_get_pm4)( + const hsa_ext_amd_aql_pm4_packet_t* aql_packet, void* data); + + hsa_status_t (*hsa_ven_amd_aqlprofile_get_info)(const hsa_ven_amd_aqlprofile_profile_t* profile, + hsa_ven_amd_aqlprofile_info_type_t attribute, + void* value); + + hsa_status_t (*hsa_ven_amd_aqlprofile_iterate_data)( + const hsa_ven_amd_aqlprofile_profile_t* profile, + hsa_ven_amd_aqlprofile_data_callback_t callback, void* data); +} hsa_ven_amd_aqlprofile_1_00_pfn_t; + +#ifdef __cplusplus +} +#endif // __cplusplus + +#endif // OPENSRC_HSA_RUNTIME_INC_HSA_VEN_AMD_AQLPROFILE_H_