From 25035b8d09df3891da454186fe50e7d0b9a4a816 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 6 Jun 2017 14:59:08 -0500 Subject: [PATCH] Adding HSA extension AMD AQL profile library, see Readme.txt Change-Id: Icbc1e0fb0185642eabbab411a2138ea030d22be8 --- runtime/hsa-ext-aql-profile/CMakeLists.txt | 28 + runtime/hsa-ext-aql-profile/Readme.txt | 40 + .../cmake_modules/exportToolFlags.cmake | 66 + .../cmake_modules/validateBldEnv.cmake | 52 + .../doc/HSA_ext_profile_api.pptx | Bin 0 -> 1114443 bytes .../doc/HSA_ext_profile_api_v1_1_0.docx | Bin 0 -> 85960 bytes .../inc/amd_aql_pm4_ib_packet.h | 67 + .../inc/hsa_ext_amd_aql_profile.h | 262 +++ .../hsa-ext-aql-profile/src/CMakeLists.txt | 72 + .../src/aqlprofile/CMakeLists.txt | 20 + .../src/aqlprofile/aql_profile.cpp | 398 ++++ .../src/aqlprofile/aql_profile.h | 23 + .../src/aqlprofile/gfx8_factory.cpp | 43 + .../src/aqlprofile/gfx8_pm4_factory.cpp | 70 + .../src/aqlprofile/gfx9_factory.cpp | 43 + .../src/aqlprofile/pm4_factory.h | 62 + .../src/aqlprofile/populate_aql.cpp | 41 + .../src/commandwriter/CMakeLists.txt | 15 + .../src/commandwriter/cmdwriter.h | 515 ++++++ .../src/commandwriter/gfx8_cmds.h | 161 ++ .../src/commandwriter/gfx8_cmdwriter.cpp | 768 ++++++++ .../src/commandwriter/gfx8_cmdwriter.h | 201 +++ .../src/commandwriter/gfx9_cmds.h | 90 + .../src/commandwriter/gfx9_cmdwriter.cpp | 743 ++++++++ .../src/commandwriter/gfx9_cmdwriter.h | 199 ++ .../src/perfcounter/CMakeLists.txt | 24 + .../src/perfcounter/ai_blockinfo.cpp | 555 ++++++ .../src/perfcounter/ai_blockinfo.h | 252 +++ .../src/perfcounter/ai_pmu.cpp | 1601 +++++++++++++++++ .../src/perfcounter/ai_pmu.h | 137 ++ .../src/perfcounter/gpu_blockinfo.h | 101 ++ .../src/perfcounter/gpu_counter.cpp | 73 + .../src/perfcounter/gpu_counter.h | 52 + .../src/perfcounter/gpu_countergroup.cpp | 215 +++ .../src/perfcounter/gpu_countergroup.h | 70 + .../src/perfcounter/gpu_enum.h | 65 + .../src/perfcounter/hsa_perf.h | 436 +++++ .../src/perfcounter/info_set.cpp | 74 + .../src/perfcounter/info_set.h | 48 + .../src/perfcounter/parameter_set.cpp | 74 + .../src/perfcounter/parameter_set.h | 75 + .../src/perfcounter/rocr_profiler.h | 254 +++ .../src/perfcounter/var_data.cpp | 48 + .../src/perfcounter/var_data.h | 65 + .../src/perfcounter/vi_blockinfo.cpp | 622 +++++++ .../src/perfcounter/vi_blockinfo.h | 230 +++ .../src/perfcounter/vi_pmu.cpp | 1569 ++++++++++++++++ .../src/perfcounter/vi_pmu.h | 141 ++ .../src/threadtrace/CMakeLists.txt | 18 + .../src/threadtrace/gfx8_thread_trace.cpp | 360 ++++ .../src/threadtrace/gfx8_thread_trace.h | 101 ++ .../src/threadtrace/gfx9_thread_trace.cpp | 356 ++++ .../src/threadtrace/gfx9_thread_trace.h | 104 ++ .../src/threadtrace/thread_trace.cpp | 105 ++ .../src/threadtrace/thread_trace.h | 104 ++ .../src/util/CMakeLists.txt | 17 + .../hsa-ext-aql-profile/test/CMakeLists.txt | 48 + .../test/binary_search/binary_search.cc | 876 +++++++++ .../binary_search/binary_search_kernels.cl | 127 ++ .../test/common/CMakeLists.txt | 15 + .../test/common/common.cpp | 45 + .../test/common/common.hpp | 27 + .../test/common/helper_funcs.cpp | 262 +++ .../test/common/helper_funcs.hpp | 141 ++ .../test/common/hsa_perf_cntrs.cpp | 155 ++ .../test/common/hsa_perf_cntrs.hpp | 110 ++ .../test/common/hsa_rsrc_factory.cpp | 476 +++++ .../test/common/hsa_rsrc_factory.hpp | 262 +++ .../test/common/hsatimer.cpp | 168 ++ .../test/common/hsatimer.h | 68 + .../hsa-ext-aql-profile/test/ctrl/test.cpp | 91 + .../hsa-ext-aql-profile/test/ctrl/test_aql.h | 87 + .../test/ctrl/test_hsa.cpp | 234 +++ .../hsa-ext-aql-profile/test/ctrl/test_hsa.h | 115 ++ .../test/ctrl/test_kernel.h | 105 ++ .../hsa-ext-aql-profile/test/ctrl/test_pgen.h | 46 + .../test/ctrl/test_pgen_pmc.h | 142 ++ .../test/ctrl/test_pgen_sqtt.h | 160 ++ .../test/ctrl/test_pmgr.cpp | 98 + .../hsa-ext-aql-profile/test/ctrl/test_pmgr.h | 57 + .../simple_convolution/simple_convolution.cl | 81 + .../simple_convolution/simple_convolution.cpp | 157 ++ .../simple_convolution/simple_convolution.h | 90 + .../simple_convolution.hsail | 154 ++ 84 files changed, 16322 insertions(+) create mode 100644 runtime/hsa-ext-aql-profile/CMakeLists.txt create mode 100644 runtime/hsa-ext-aql-profile/Readme.txt create mode 100644 runtime/hsa-ext-aql-profile/cmake_modules/exportToolFlags.cmake create mode 100644 runtime/hsa-ext-aql-profile/cmake_modules/validateBldEnv.cmake create mode 100644 runtime/hsa-ext-aql-profile/doc/HSA_ext_profile_api.pptx create mode 100644 runtime/hsa-ext-aql-profile/doc/HSA_ext_profile_api_v1_1_0.docx create mode 100644 runtime/hsa-ext-aql-profile/inc/amd_aql_pm4_ib_packet.h create mode 100644 runtime/hsa-ext-aql-profile/inc/hsa_ext_amd_aql_profile.h create mode 100644 runtime/hsa-ext-aql-profile/src/CMakeLists.txt create mode 100644 runtime/hsa-ext-aql-profile/src/aqlprofile/CMakeLists.txt create mode 100644 runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.h create mode 100644 runtime/hsa-ext-aql-profile/src/aqlprofile/gfx8_factory.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/aqlprofile/gfx8_pm4_factory.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/aqlprofile/gfx9_factory.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/aqlprofile/pm4_factory.h create mode 100644 runtime/hsa-ext-aql-profile/src/aqlprofile/populate_aql.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/commandwriter/CMakeLists.txt create mode 100644 runtime/hsa-ext-aql-profile/src/commandwriter/cmdwriter.h create mode 100644 runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmds.h create mode 100644 runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmdwriter.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmdwriter.h create mode 100644 runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmds.h create mode 100644 runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmdwriter.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmdwriter.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/CMakeLists.txt create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/ai_blockinfo.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/ai_blockinfo.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/ai_pmu.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/ai_pmu.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/gpu_blockinfo.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/gpu_counter.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/gpu_counter.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/gpu_countergroup.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/gpu_countergroup.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/gpu_enum.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/hsa_perf.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/info_set.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/info_set.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/parameter_set.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/parameter_set.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/rocr_profiler.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/var_data.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/var_data.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/vi_blockinfo.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/vi_blockinfo.h create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/vi_pmu.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/perfcounter/vi_pmu.h create mode 100644 runtime/hsa-ext-aql-profile/src/threadtrace/CMakeLists.txt create mode 100644 runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.h create mode 100644 runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.h create mode 100644 runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.cpp create mode 100644 runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.h create mode 100644 runtime/hsa-ext-aql-profile/src/util/CMakeLists.txt create mode 100644 runtime/hsa-ext-aql-profile/test/CMakeLists.txt create mode 100755 runtime/hsa-ext-aql-profile/test/binary_search/binary_search.cc create mode 100755 runtime/hsa-ext-aql-profile/test/binary_search/binary_search_kernels.cl create mode 100644 runtime/hsa-ext-aql-profile/test/common/CMakeLists.txt create mode 100644 runtime/hsa-ext-aql-profile/test/common/common.cpp create mode 100644 runtime/hsa-ext-aql-profile/test/common/common.hpp create mode 100644 runtime/hsa-ext-aql-profile/test/common/helper_funcs.cpp create mode 100644 runtime/hsa-ext-aql-profile/test/common/helper_funcs.hpp create mode 100644 runtime/hsa-ext-aql-profile/test/common/hsa_perf_cntrs.cpp create mode 100644 runtime/hsa-ext-aql-profile/test/common/hsa_perf_cntrs.hpp create mode 100644 runtime/hsa-ext-aql-profile/test/common/hsa_rsrc_factory.cpp create mode 100644 runtime/hsa-ext-aql-profile/test/common/hsa_rsrc_factory.hpp create mode 100644 runtime/hsa-ext-aql-profile/test/common/hsatimer.cpp create mode 100644 runtime/hsa-ext-aql-profile/test/common/hsatimer.h create mode 100644 runtime/hsa-ext-aql-profile/test/ctrl/test.cpp create mode 100644 runtime/hsa-ext-aql-profile/test/ctrl/test_aql.h create mode 100644 runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.cpp create mode 100644 runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.h create mode 100644 runtime/hsa-ext-aql-profile/test/ctrl/test_kernel.h create mode 100644 runtime/hsa-ext-aql-profile/test/ctrl/test_pgen.h create mode 100644 runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_pmc.h create mode 100644 runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_sqtt.h create mode 100644 runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.cpp create mode 100644 runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.h create mode 100644 runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cl create mode 100644 runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cpp create mode 100644 runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.h create mode 100644 runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.hsail diff --git a/runtime/hsa-ext-aql-profile/CMakeLists.txt b/runtime/hsa-ext-aql-profile/CMakeLists.txt new file mode 100644 index 0000000000..ceb476dca3 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/CMakeLists.txt @@ -0,0 +1,28 @@ +# +# Minimum version of cmake required +# +cmake_minimum_required ( VERSION 3.5.0 ) + +# +# Setup flag to be verbose or not +# +set ( CMAKE_VERBOSE_MAKEFILE TRUE CACHE BOOL "Verbose Output" FORCE ) + +set ( ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR} ) +set ( PROJ_DIR ${ROOT_DIR}/src ) +set ( TEST_DIR ${ROOT_DIR}/test ) + +# +# Build sources +# +include ( ${PROJ_DIR}/CMakeLists.txt ) + +# +# Build tests +# +add_subdirectory ( ${TEST_DIR} ${PROJECT_BINARY_DIR}/test ) + +# +# Style format +# +execute_process ( COMMAND sh -xc "/usr/bin/find ${ROOT_DIR} -name '*.cpp' -o -name '*.hpp' -o -name '*.h' -exec /usr/bin/clang-format -i -style=file \{\} \;" ) diff --git a/runtime/hsa-ext-aql-profile/Readme.txt b/runtime/hsa-ext-aql-profile/Readme.txt new file mode 100644 index 0000000000..d4cd2ff5df --- /dev/null +++ b/runtime/hsa-ext-aql-profile/Readme.txt @@ -0,0 +1,40 @@ +HSA extension AMD AQL profile library. +Provides AQL packets helper methods for +perfcounters (PMC) and SQ threadtraces (SQTT). + +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 + - amd_aql_pm4_ib_packet.h - AQL PM4 IB packet type + - src - AMD AQL profile library sources + - aqlprofile - AMD AQL profile library + - 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' + - util - core/utils library build based on 'hsa-runtime/core/util' + - test - the library test suite + - ctrl - Test controll + - common - Test common utils + - SimpleConvolution - Simple convolution test + +To build the library: + +$ cd ..../hsa-ext-aql-profile +$ mkdir build +$ cd build +$ cmake .. +$ make + +To run the test: + +# cd ..../hsa-ext-aql-profile/build +$ cp ../test/SimpleConvolution/gfx9_SimpleConvolution.hsaco . +$ test/SimpleConvolution + +to enable PMC profiling: +export ROCR_ENABLE_PMC=1 + +to enable SQTT profiling: +export ROCR_ENABLE_SQTT=1 diff --git a/runtime/hsa-ext-aql-profile/cmake_modules/exportToolFlags.cmake b/runtime/hsa-ext-aql-profile/cmake_modules/exportToolFlags.cmake new file mode 100644 index 0000000000..59b470a991 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/cmake_modules/exportToolFlags.cmake @@ -0,0 +1,66 @@ +# +# Compiler Preprocessor definitions. +# +add_definitions ( -D__linux__ ) +add_definitions ( -DUNIX_OS ) +add_definitions ( -DLINUX ) +add_definitions ( -D__AMD64__ ) +add_definitions ( -D__x86_64__ ) +add_definitions ( -DAMD_INTERNAL_BUILD ) +add_definitions ( -DLITTLEENDIAN_CPU=1 ) +add_definitions ( -DHSA_LARGE_MODEL= ) +add_definitions ( -DHSA_DEPRECATED= ) + +# +# Linux Compiler options +# +set ( CMAKE_CXX_FLAGS "-std=c++11") +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=return-type" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=sign-compare" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=enum-compare" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=comment " ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=pointer-arith" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-comment" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-sign-compare" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-pointer-arith" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-write-strings" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-conversion-null" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-math-errno" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fms-extensions" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmerge-all-constants" ) +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC" ) + +# +# Extend Compiler flags based on build type +# +set ( CMAKE_BUILD_TYPE ${BUILD_TYPE} ) +if ( "${CMAKE_BUILD_TYPE}" STREQUAL Debug ) + set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb" ) +endif () + +# +# Extend Compiler flags based on Processor architecture +# +if ( CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" ) + set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64 -msse -msse2" ) +elseif ( CMAKE_SYSTEM_PROCESSOR STREQUAL "x86" ) + set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32" ) +endif () + +# +# Basic Tool Chain Information +# +message ( "-------------IS64BIT: " ${IS64BIT} ) +message ( "-----------BuildType: " ${BUILD_TYPE} ) +message ( " -----------Compiler: " ${CMAKE_CXX_COMPILER} ) +message ( " ------------Version: " ${CMAKE_CXX_COMPILER_VERSION} ) +message ( " ------------ProjDir: " ${PROJ_DIR} ) +message ( " ------------TestDir: " ${PROJ_DIR} ) +message ( "------HSA-RuntimeDir: " ${HSA_RUNTIME_DIR} ) +message ( " -----------CoreUtil: " ${CORE_UTIL_DIR} ) diff --git a/runtime/hsa-ext-aql-profile/cmake_modules/validateBldEnv.cmake b/runtime/hsa-ext-aql-profile/cmake_modules/validateBldEnv.cmake new file mode 100644 index 0000000000..d38352bbbc --- /dev/null +++ b/runtime/hsa-ext-aql-profile/cmake_modules/validateBldEnv.cmake @@ -0,0 +1,52 @@ +# +# Build is not supported on Windows plaform +# +if ( WIN32 ) + message ( FATAL_ERROR "Windows build is not supported." ) +endif () + +# +# External dependencies for Rocr Header files +# +if ( NOT DEFINED ENV{ROCR_INC_DIR} ) + message ( FATAL_ERROR "ERROR: Environment variable ROCR_INC_DIR is not set" ) + return () +endif () + +# +# External dependencies for Rocr Library files +# +if ( NOT DEFINED ENV{ROCR_LIB_DIR} ) + message ( FATAL_ERROR "ERROR: Environment variable ROCR_LIB_DIR is not set" ) + return () +endif () + +# +# Process Env to determine build type +# +string ( TOLOWER "$ENV{ROCR_BLD_TYPE}" type ) +if ( "${type}" STREQUAL debug ) + set ( ISDEBUG 1 ) + set ( BUILD_TYPE "Debug" ) +else () + set ( ISDEBUG 0 ) + set ( BUILD_TYPE "Release" ) +endif () + +# +# Determine build is 32-bit or 64-bit +# @note: By default it is not set +# +if ( "$ENV{ROCR_BLD_BITS}" STREQUAL 32 ) + set ( ONLY64STR "" ) + set ( IS64BIT 0 ) +else () + set ( ONLY64STR "64" ) + set ( IS64BIT 1 ) +endif () + +# +# Build information +# +message ( "---------ROCR-HdrDir: " $ENV{ROCR_INC_DIR} ) +message ( "---------ROCR-LibDir: " $ENV{ROCR_LIB_DIR} ) diff --git a/runtime/hsa-ext-aql-profile/doc/HSA_ext_profile_api.pptx b/runtime/hsa-ext-aql-profile/doc/HSA_ext_profile_api.pptx new file mode 100644 index 0000000000000000000000000000000000000000..a3df42bba06fc81daaf76afcb3e1ef4304d77cf8 GIT binary patch literal 1114443 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⁢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

~Wq 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

9TU>+)$bl>Jdv*@+Q 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ʷUMdO>QW!L0c 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

6Qe@g z_jJZF%MmdqZ#f;t@QWbQLoWqZbL^j^qJ{E^+lPQN!!gL{CWFa<$`o++kQg8MFbdTf zWh&EWUwNO@OTP!53p)^#{_8)e6tq^ZaFI6<-9&G6rDgVHsu5aApZBdx${#vZvv%$4 zjfoyU-T+@ae&P`Nr+n<$>S8Ve{`a3^-Cc$}kP5pPT+jXJy3smdJ=0@^9!+}c{QWiT zp)Vs&6N#1?ju>W=3la@Jawmy4e_9CZwIQ_f72EgR{Uapkp%U-&c!&kAGHtC)h@>Pr za$$Ijua>R!TcD%Z5mTIpVZk|U| zIM={6_u!g9)%Rgx=hgHOG8);TOqufm5=+Xw)5@V2%}5rixyiIYKms~De%0zqoy*u@ zJTXVw0+s3USWxlPUdAKV@bMO)z+B%Fc?|d!GXp(tZ?ph4nlet^f)&n(o3y->3~ThK zU9FBm8YUb86cyy9E3JhS>yf|04l59 zftLk-v%f7y{AI=}tH)pAw&ckk~&TRXt*B}1-t3r1EKT3H(hToI3!UI>Xl z$8#%~T?*x%4OTzBTlm5MOeb@uaN4$lRE+H!*C$EYI`P=*-d99t-kP=Fk&Us5o>S~) z%rC;5VFd4izs4+zrO7RLV+{4$!f&E~#&m+8_L2r?^##j=cEELRu^OB(h_qV0jWL@TWtYo=ZP7SQF z36smMIB(CjjU(0SD4AXvxq0bP34nk`yVrODXKo*3T;$J@tCzIi$=)8}*lWr*xH8lB z3vLa{#XWj6s%r}E3rAeB&h!t^PAE<LC@ADrvP+Ha}$I*7OG9MT55yq zUzs}D(ID@tUHtZIIUv-2;(>=-kZ+t6D}fc4S~Ci2;iD}}917^ZcG!JtbPXWdFZ&2{ zvs_|^WdB+4fn0P&<0F4qr}TQ7_LPpUVUP&GfW#-qyEDjSvXbdkB_AqOAB^HKgeM zQ}bYga(szgg0x&P_AhfH2;H2K-GWD(QN~hkT(Q>=(5d@i`%*UQm_4XpR{ge3tD@(t zLA)M*-C96U(Y@~KdSO?5Ghgk;Q?hj{F=bw;2eqa-mF6HT0rLFthfYrv*0 zGKltEh+ic%m&40^inp@mOp45Ai)CZut4p5NC3%L1`{N9|+DN7Jv#j3rHGJPH9$%Zx zQvh+c@LZXtj(r`hPng4Ndi13k9Q^5Z3ETUX)6~iS<;2Mw|WQN=xuw;{@$as_DT0w&r2N zfa6mI-aHh@Inpmcaj=dyT}(AC+v&bzEHidzepcoIciG1u+U`6US|In*bH~P%;`M>i zvq5goJLAJlIz!d6FWL+t8AlIcqioa;g#Mdhh}-MAzv0NaQ<>BSX`ec>f*aj7%gm3i zR?Q5{v8>BvG`~~e4Zg10T;dg`w&cl04=`z_tA31gG5xZm>{pq6R|im}4g%XDov^as(!2*8KnJ>~)6OFC*dsNiX$AU7e^6d;BL-4WeXbGqh{P z0jm7n&_Hq8vJD7#aEX43jzbVF?hPj20AWP=Ae^H=vpU`|KMK8m6Qk0TKL+rKnZl9dC9?Z5|0Vh6Q9qz4yO%0Emf(G{hVfc1NNR*EBNO2l>cm{Gj zo*ZLRq6P8SY-_8Jz#q}=(Ppe5uR9&9+irn=!Hl1?eHmP%=K(FA(sAS|K8`SzHWw<7wo2isR1%T` zj>6H%|CMis9%cYcV}=>FL1^a0O7I_s1;Edf$8AepeG3C9d=J;$I_}=E{hu0~=H#tH zu@d}63ET<>Vz!6Kp@fzQn2#1^$Q8?KHuQqKT72>tn*Imeg?!4gB`SOF^0|Ck(R4i@ zv9!x7Z!&l1I`m!C`nFMi2WG1X)6H^f`5{5k&L_TLM32Pd&^+E*s#_6R)~EaLL2mQE zb?E`uyV-KVNPSuIE(?e_PvguTS<>(}0(Pnm@*!^y;^{yQFkk*U;=u5z4Hez|mH)?L zA_tW0m|VoDo980~7Vvg0oN)_GDksNpv}jEBcbm(mcEsUHT*RL}vHep#mXXx+gkU+y z6&K8h?nUpd$I>$bO%IwXCE}^zI~s%AzPU|ccoX&V6f7fABDlTg*@?vMmslrRqNFXjAR((m<{DnEL&wGeJc5$(oml zOJB1)Px4xHxwd&V>&bQ)C>O&iY?fOBBFy{N8`M*=8?bZM3nkN4J35S(6@R?YqyoWT zVrbsR7w*cq&mdBQR)6?qmi;TQT2uLs{{0@;8<(otA}y7@4C}btBsBCtqhGztG z1C+d@b!O4?<~aH0nsZR2z%&B020QE3d2We2id15`R*w(G(aBont2%?7&;1|WY){|` zw;LZXw9j^j@lAB>|FCTERLvQr!3NCmal2pFlt+I`^5$y0rTM|hZZ*!!>eAz;PLK&_ zn`^8W)M%^2>~IBpXL@0|M}cQeJHa2Yw&rIdBT&c6KN7~X3wlx@(!gtZ-?(VQPc{4_KAXP1i1+oaI!)PiZ(mDpL{WTqTwR%5$?7LZe#P=ivGZJ_}f#m8xiRhcgt zK-3y}LZQYaZ*;v%KHD~&uEYZ`&Q|+6{5|`@E1%n@VwzAME1So0YQ)GYaWt$snHO+2 zmGTic=LcghPR2G2#0S|!x~%j4T*W8Mky>@ocqgA@484f&0_Z2TVg>Tq zjp>p9lK@HWy1Jrbs^9!_NHZ*<;Ypv}yjxhkLiW#{Qz5RGc?#9pBt}w1ON(AFg>beU z7EJ%v!^7y@yXsd8VpD_Ylg_HB*Codn8K3K4FW%k;;fjvf+scGr_0kx5)vYzjeTRS(^6`)V3wam;QHsJ zmQ*H;J-VAp6=~zuqd1$AjX88QNCe};-?7t;Cz^l>T>Rs%*Vm^OITci_vYh}ejJtmA z6stl6+83;;i2q5K<4XCmgMjF?C%M1m-i)0Q^_HNv5u|kuW>d($OM>BleM{K`$K{rY zmu-Xu*W>!gyej2gA75HhX z^K9O;siG_gTtb^g4^G&oaQ)&pQBhz!{IHz4?CYyUt+0$ITGVj_zrT&VM7~bqPv$kp z#dr6>E)o}bqR?&>-bHrazeHq~UXmZ&;setqayiM_((zI3v)EgjhL)#6a*6dh0HdHN zOYmiegA`cWkpP4+eLfv@dm2$A-&%`9`NF9iyOM}czOZa)o-OZ7X9C(hh3QYR*;=S- z#G$uVnJeB-%Ru0z~23vvHv@be)otv7~pogQ|4A;)RHR^W0 z#!wX8w2b0!Od}3p^nUoYEnFtAHbsW_P0lNcT-K#e3NDTTG0Vyds3jTbTxlU)TOhbz z%Ii!bkfy*Fg%Opv#_H!_uKI2{P2b+~(0N`9Jr)ca4L%5h7yQThgaV#H% zJ?L?xxBQe4aG0h9^?2*3+@}ww`g<)b2OBrwV!p)Hh7i#x+N%2O+78|Of``q0YjUOb z>BE_TE@qttasNIGyLA@dgY#+%2f|-`5MM7_sKNGj<jTPwJktWu&j?Ll12cOp>R>J?zEO6mJG54;U+^#1y!qs?wKj18Cl z^$-wfcloO|?$pA_xW{m}U13oz_PY-^_Ye-wxb?*yS~>;|xA}T^uq^V8TVgOr!2|2` zyIG$Br|8X7lQ<~mhB)4NHp88uuVMy7#|&;Nfs7!=0ka@WlgbqUK|DVEvg&N`y9`jS zvOsAh#8K`-G8CJ)qm^$_WSqe6(=RK82sSYnK)*{-ICW_G#x;mcOojd`+V%pXlx0ul z&4+C4=CEd2OAKmkd0+p{A|ETaM0Jrc3X|@U$dCi_s)O^<15Zf3(TSzdbpA z>AcgJEl%uC^X&5@BgnD>etq%|IG}-Kxq+N~Qt=R$m-G49a}03bzvWxjktMCX=YCt@_^2btbJ!jqhQ(GkgW2=R}UXNxNxqoyqF${^B;Fw87Y1U{6gh+ zO`)c(AMaG)PPQF1y8?l}`68XkB`nXK=TE>v%gNu%C%OcVsY;ox-6uKsLmAA}jxBBS z-Js%8CbMlFhQ%}PQ9zD0V0Li(ApH?3gCT-8AK{o9BZr|pI$Ey{6Rn>Z->^y-da8%# zx#{Y2<_}KLMWv|SJG7F?Y|lu`m6AO_t6-$1GWUte9F~(Y6OKM21GzlId&z;61z}Wn z=3tp8EGLv*v&!}QID)o1KI%A4d*Qj}adFetKeyyXTZ2W-%FLhtmFOzj8^>c=SHBwR zaKZMJziZ^2y>Qk+^~QA{Gzy4T$yf&L3&Z2jc0~Mn-N!HW@hwS27kW_YlKjUjT$_v~ z*d&zA@!VB5&EoPkc`Q3rwT#j1#NJ7$T?#xe*vG7C8noA%LX)8nwmx+S zN&cX#k=re^PfN#OSrWVw4Q@jIwrB7?V5xvS6WXJlT z@pwlselba|_y>9Xr}WJ40lPi&NA_loQofOqJ?NONCX!v6(6*i3F}IB~uWuxLA2{jv z+p|UHNFo-y3G;4lG1l%gByk6{-q=!w=rZgS+9>Nzq6Q_s#law7ja^81uhUECCVapn`P_G57U$U#`3+R>0 zw&a%0eN1cty?V`7^{L;Hlbxe{(_C7gnN!)~9{$()P1rYnHur&T!Q}V*KS>$c6whrq zINbk`#1Uf{bbvmqz&VjPjNp*k!>ord3SJ%+Cz& z23ux5yE*%c{YBI7GhpE$d@Bi8p;~( z%YL!-qSV*4bLR+;vKtb!(hW0U^0f6wO8>d09usrdg+E+>mZ*sWA^H(52ytYIOtg%d zJVZi$6x1Kgac%&eU-CjThsn}JwOb=zEWXQjQr68%26S5Qg)p_@VD{i%DC4i4{p`|N z%;@?<_I>aF3f{3>^5YWa=1*SLHSrdVH9>frZdsjVAVNyh6AyAKX>m^CRD4_uF03{e zraa=T{hMgC^eJN2EvWWoB60EJo`J8Nm^Yd&O>S1{ChP+=r!o1gS)sAXh8E$OwOibR zC{x0kjWNgLYzEz!Ig!6t1g%b)w6jB@-T%UQ%`4WvP|}GxX@#oK>PHTvtDl(Y(lzt& z#p~k}XL0BZIweQp5oYQEI7eF5sG^Lka0pB&P?2OF8Z4SI^>}IXqS)5_L*eurL!?ed za?fqh;O=k$2({;ND>GEJ$nFNWnm>N+r+2t2IZLD7WBo=|qZBM~`1R^z`l87v$)ZKN zg~6QQzI&w>?4_vWzer!cQK)T~48sz($hQZe{$8$6Tqq8V;~$L}aNsd|;&TY*V;f7I zAXNTUBqeb$=}~EWQ12A^AMj>H>cXqTu*74;CxmMiqy>HT2~#N7j*%+ajg;{qCrW^% z4K`oM(YUVimKu~1Dg(NCv~&T#Av(KP-_zWTa9Uwmc_7_PDVATAC?U~a`M{Huv{W9( zW@o*fa$UcurR?!ZYz8Z|NO}lb~3M^Zh;Yll;G^t*3 z=|;R%SZ8#A3(vfH3@*@=5c2Zk46CU@z_L3o1c~)Di<%vMeE8P@gpR^;-UC4}YiLP? z3Yc&=AAe-Vk$+bZU}w7mR2MTLihjU^X>hKP70(B>pxa*IQq={Kp$s>BOrtpjy%%NX zYN79GV;3(Yj*;sphZ=zP8XOzVOg?ftf^)8eQOIcN*h7r*1EUxm3i)h1^4xpp!soKJ z3VhljVncgQ!KKD*oDx?TSp6yPJ|^Fd-@92Cg{nMeyp;VS$ud6BW3;=II~Jzbr^S1n z`#Siwjztxp`_XFAWW?W_(@WL~|JJL;wiF{Ag(huG%bB3Eb@O@nf@yXmFn&H5UA$hE zWd&67tC&l$kT*=?j>+k_XIub%De_z|0K^CdT528%jUZSNc9{6v9qR zU6CSTs106L->k3=PI`ma5_DxQ?8WQ>Q9*?x4wqQ3?6Hm2PGeNr3t5GmeHWwcYJKR6 zj8J#N9l=sYSp}hRGP}u{^=($=$0k;f#e_@r=KF+V8y@$&bzQ^7HV?av`uehT)}Hia zDQ|790#bUnpeKw{TbI7Z|JyVdGX8$<{n?xrsk*W7FCe;-=8~Tk&Q8kINk3!=wn*pE z{u0>QrOtNl!G6udQR>-d@L*5Bpsea)rnuWIqA`PolwJpOd7Ur$*#p0aK0Z(>^|T(b zE_KUgd%qo&RE~lyYrUH8v zJop+Ogu*AjLOsNZ(58R(RlPAL0M}#8w1z(h0yYnm3cjcT|Aq+4s6_*PPMYrFty0%y zxs)8}i}S(G8C@0m!XS2Q780HLqFi-bfF~l3hfSx9+gIE46K#RpTdQ}c%@txEw+S_p zTbIgCdvDE=qipxK5-&aOVV7_!VhqBI;`Gs0_|#+kb0p(<-p~B0C5E? zF$-4(>0iX{1qU+jZZF;73qn-J`q~b!o@bV}Ir-M~6g;UGcMZZyNd-fof{iO7vNAHy z0=dP!=7w^bvHBl6I1yIXRz+I5+P%P+3bdro2OqY&t?-X`9U{a^makW{X+d|XdTP5_*#dieQMN3INt<}xX7Cz;hNX3_F9p=w9 z&*O~4*uT|LvaNIFpJ~S!n!P9?641_}f7VZ$j&gyNPs>zmX8zlQR_5PZ<=12uLm}!u z8K7jhZ~&jC159BFt}u0({)J4?ua=~uhrUgzDN%?>|ZvVf><$|+>oEuLDo+3M*ZMi_9+#c@SR@b@{}>H47)Lo zAj@Fa>>pesueYj%#g{HI`|d0b{^CdupRLd6KX}o(Z|-_t&Iw}iO#Q>Q%DcDS-&nEX zfB@kJWbbL}lLvwU4aI{es@tPv${I%G^k%H(pN;}4qIc?OfT{h5lK``!%kb+D1x?ED z{VrsyVvH)voVn%{@BAd$2O0XTB*6E$J2jdh_2$jpDRNBf>R&r`?29 z8W1LRnWO4Mw}w&WXIf-To6g@ryE!xEzdLPTA?=&dXfEm2NiQ6ax7LLMaZW3CpxcxiWa#YI0ULZWPY>$frPJ}g^Q zQjAqeyP_B68aj~V7%9$#Wud-tD$(D)eX;2O-Gee5{Y-;ojiy# zX0{aB+42XFK(;z(zRiatsMsH2-fV2-HeiLOo>L7us!mj*bNr&S1dmSxz%t@a&3vG3;q;t<|w#rj2<%-n{hHqdQIXFnfIbD2ZX$ z?#Xx|S`F@_RZ|ByLaV9-n6$?Kh!%Um`2q!JzGuWuxr)Y<5ZOX>Bm0_ok<8J=2mcL! zP$YZuqU?uCDES~l@@*Wf5nR4me@TtXy_wwRGH@RuX~+sr`!c~}z;#;zBk?id)@v11 zyz~-3(kZ>qsy1_3sm{#4PzaXcw*A#!Ma~C7EO3fJXn|jUk>V%N5w5-4Py9$E-zobc z?oZsY98f*x$B8j+0k-yvh2FfVGW{5rTC&rZkDhK>Dlm_c#Cw;s)4bIj#f6@xU-RhM z*WUj)pN~@IK7DlfEMwyG{@$YQD!uec(B={oZ86m8;961K_IR+EPdhGDJSO6qSp@B1Um`F&YOG}@O4Z)vtEONuTw zdx!2U1ch@vOSet-k*~R{J9;V6|q#1tse0sA@@N!W30P6XyXFC;$f}`-2Z#E`{dGcfL8TJ zWy+tZx<^!}%)Ynjv;wm-jcX)&Ox-oHOX*r_WviKn|F?MtX561wMQgWabt9e18NSl= zzl&T0#x)U&G9g(&Y>TW+9_{PM)anI8pr8C7Yk~@P(n0=;F{Cjt`+Z1X7jS2p8H1f&T3x4D>B$wELa4u&Zd0 zg-YQBI9GWnq07#Y7qzYBN{{#GOXULYw(l&Mvh!_m7i!iF7~Gr6A7y~_0o47YeS<5L zou*}c!5J!U7ay~^lFqzn@2qR1amWRB`)C#C>b{~dOl-8CR2SP^AyCG7>1}b(xVnu_ zTimC!c%yrIP0K&nF9P9OWl%OJvJ=S}Z-#MMzk(06{H&#yK?Tc1Oa0CYAECZK&b{gD z_U{%Ce9gXQ7%Xr1V55VpMS5t%Uqnx!rZgFEYZg}LfRbzO*!TXsCQsP9Ey$FWT3hv> z+K{SvG9_>&*sSP*Sy?{5bL{oZ4fo)K-r*#N?(;;*$zfEHGj0G$-WIK!e^Yw*Cr+2r z6rv*qhMDsEoxWLht(A`emCN@1IaH8!8Ho^(0UhMq2*+-kD(`?5erL|#$K6Mm=lh4+ z-~IL0zWh1#wfJi$SvX7Usb~SyT)uN>PWu6Dx(T!k5O`DXtIe*%{z(0WR8TT&fUQbj ztLR3ErbYczWOHbiu|bIUcWjHlh_yB5uCb@Q*S5Xub>t@myGS3O)ab0Ko!^OMewFPP zs^8TRzKKR!mN}hJxIJ;(KEF3wIyVTJ0+-61nDaZnyCm;9lKr!;7Fq@5SU1`d^KG#` z#t8P&S~sGxwJYztzKZ<65*7_%-*cwO(Z-S?nbQQt^VVWEuj1q=bo-HHdE4l* z)%|wYag1$p`>kswaOtk=U%wW1hD;LWxK}|L;j^CX?J5gqPF^BbJpg8@HGf;!YSw6z zEFs>d_2z2}&}Hl6@T@m)gB)dH61_3$k%C=T=CaUl{KBFh?~-6y?|CmN%T0c{Pq|}Y z%PaY#s6jU5ovnRJ1IP-C_#Sb^m~S20+Sryts6LOO77|eRE+ANnAERsSYw&-G{t4zLCa&S_q zETKL*OZRsaGa*pJ%;n{7*ZqP)ZH<7IZKKcgS)(fyzmWf};Y39y?(u-kc#O2PCpjnH z*-L@;#5u|8m_FZt5MDG&xKVSa;FmT4;CWt212iMnHTNlYlQ*h)$m13jz*WryMf2s< zrZ&bdZaFLSqhYb4SW7aeWBuEwM(Y$|Y_qyzza=mgCiYsl$vL~(pI}1(FO1+OU-o>N z=;*I-6!6x-X>;$cW^c(%aDB69v)xpizZNA(Fm*;mV$0vRS6xdzf!Nb8TJ85J$R_To ztE^c8^P13@ZS0I+hNRHLybk!u|3lS#1~u7*ZMz9Y1QZYie2^vv0w`bsq=N-X0wj=x zB3(t1-g^sJ5KvkuQW8)DfgrtiR1g8_J)swo(0dj4{l4Efv-h51#(xYm&fIHV*E-MR z=t*aPn}!O2+h-pFm4z_L>`%|jzdXgKk`$47rv=$h*l|)7cba4ZnZMcSULAvjlR&F3t(3-(3;1o2v zztPz6Ywni+7@51i@V zcTz7&_6&S~nX1QSVLzfM^JD+PM0^uIkj01ECA1v(Ual-!DN}x7?c%5XIZ*CXy(-nl z7o|cU)TyO7h~oo2}_@9sLcQ)V%80VFy}&?=lN523AA(^?SiDFNG_qUktUv zW{HHmYg!nRzWDvi$6W1BQ<&d2S(jC`?|4AdZ}^f`{c3PPryrFmaXi@0{y zA4XsAtF1}0~e6;5=P-R5_t#?JwfG5(c< zcF#)JsVh}`YpO43c~oaw<@eztOIOF?FJ(sgBcr9f*PL!=E)9RN`rGuoi@0kGtiXp( zORbeUh<^XSLtGV=XVuy5DY6)C7NB*Q>ft5QTAY z`Hicl!&1YsnT*Dbp=sR!wq7aqjw!tTk2!Hz)Mpp|$nT;Y@k;oi1Rj`rE2bv@VST*- zW;HGvQ?^a_86r&OF}JD8H*dDk`^$-{trVLk z5CeJAx6FUNScWoIfL;K6A-l+1YdK@!%sq4prVGeGmoZ+nzXnI$kxSEOt+WhQ2!nb$?(WX3NqGa6lQr;LGs_n@kD(tuUW@*8-u=ocUsk{9O_&}w{P|Aj%+ zebqHnK(n{f_MmPOm*&wJ#K|A!vs(xA6E187-D7~6+T-1N%KejP&?8c;i1-^U%h~I1 ze@*T#Dav+9UU^@Mxj%8kqZh_|Pi|r!B$&c$+ux!o-d$cFiPIn_2Tsgei-|vEMgi9D z-5tMRR=EZagcWe{9ceQ#3`PX9#%UMcFyFDP za43Ofie101mj{`eSIK^xOEK~pSUjmW3S07JPzOng$CP)tr+V|i3ipE$p;&|&0}wd6|52w_rV z)v#{@SPoHG?zseRXGxBRhWy-EL*Kd>*TucfmwVIavfi{{gqx-Kn=s(KD@JP`umad6 z;{96jbouC(J_gn?(ABWdI>#Udgq%<(!-HpFx4oJ{UBx!$q*BYF7+ZFDvW0%p{gA&O zB45OEitQN7#3o`Dg>&!O4r=4b-1EQX;!~QEOx2FV8WEadH85)gyG<{J0sl61 zH9Rd6wrbn;x~%ohOa0YM>)9Tol0cAOE$7Nl=37hEIU7>vlR{rpN0hY&{E3|lpPQkL zuWtX9{dax0`KjKEtJ%At9-#UAtQkK%WK_2DgKr##ZBF!3x#j*=DE$^dbG~&U*p6e_ zKJ{tnrlI-^u=WU$=0o)N%eahslv##1L~1}>s$Zpe6&8?V{)FTm!#=ljb~#Ph z?lYuwjXGNSe&q=?`B$kbsF7t*%CpD{tYMhh*;U1P_G44L*y6PgcIpogQ_K!RKQ` z^CzeceL_t?ZR-ZK$OC$Hstr$a2&M@7JGie7pFVIvGaSf&^AR(**2rpjiSkg9Y1=GM zP$A?{3&;*tY19dZ90uf4bK)JVvW2z!!b(yoH2tMTkOl3b%Xt;HmOIi!cA)^lHJ3*KCNVM&FwCL-T%5jNP3fi zzMz-JKCObl&jrj@p|HYrty@Rfvo2-$0f1sqHa~0o^3ugS~)J14oT7uRl5u}$%^&QP)trTEIAiin0lcD6ps)HZFSP+Igs_>`29? z-~5mH8wp;OgZf~Q93*{AH~PO3Z{VpqbVA*2t~EMyEiq`E!RcsyKX=3)O~B!8@Vd%i z(wc_&QsUnqd)C)V?>g?87a$3d?mSW~&moxic`=%jQeR4swUWZ;q{KN65-+j5i1NL) zd4wYeK!^g_5&^w%g}O8;y=vWQKQTBN`(Vy~*b2V_)X&a2_}UNGT)?clsqa3NwKA(( zp5oXTEGam@Hpth8VVTARI`~Xnh|YgL!g(;SUy}B$(oW&1!8ITJjSk?W#wFzsd0QS^p(EPC@;>8pI0|(i3gb0aAGSB=9v$^qDPZbh2FKcp?6_f-@7Jk^p%7z88j&y@t-9k&w?y zGLCa*v@#!ss*3&sAvFzfEIlH4wyO(%*bZOg;yUBUhu5U@~@7L*fCt^y_*5&-HE1Pxmb!X6YZJc2!oZ&|_7B1j`Ae4ZOHJ5E-C{ z@b}-+d!^%ioOk9xiV zKImsQbQjejsRKM8Z20f@OXbjGVXfCdL}|ZixR`~5*wMlyXBKvhg^0L|d4|LCb{9?S z-ZQefm9DDHhd9QK(+o6&B*L%d(c6S42t!^)qtO-m*1f057f z_jvz6cedfWinQRzD!S8_9IJGDEOyL4WBj73e$=(a?6>o%1RXd|N8t`wq9z@3kUR&+ zuZ4X2Ederu52=a9)4e{%v+@b2+g{ilk^!pMPZIjUdRh`V4EA2BuFC6H$RkNEM8x+n z)CC4Z3#ihqNd~wktJ;#rX+8!)BqNf-EE)&#)A+2^X-uB&33M+N;3259D*bIaMbE-{ z)%>#(cN~7D^hTbO9c>^UjW!Z|7F({=-Je+F;~>^SIcf*-4qnQGQ>AdR1?d@5`!kSu z!T5ky+Er}-o=c@uzjQ2&{Bs0i=tl$^C%Qnc4?w96sYbSlEGxOuStD~TniDHuBUHeI zs4(8v=E4-xi^;Pp>b1+w1IN&_t?<$M&W|oBoyLt&+c}Xau9!te5==vCb0@*xTQ1dW zKZ9<0VU4V#w_K-l?^+xDhr7{)5=wpLR-v?X_#!8!MD>TK?H08HgI&itDNz!8J2W~x zmA^zyb0j?Si!er2=|)3ohpm_k(WojsBx>*6@-x*lUL`^=Ytd!PD`=E3@YT3)>3HD= zFl;4kY9mI=U0(^-N6I{Sp-w*EoF}6@4KI`!9^|WVy0u}i_ZbTn6G2~#gkZcco0bXm zN=?>IbI}cC0JUkUJ$x%$A><>Uo{l5pR*iaIx}u)eGSm1UmfW<78V$_U(Wp#<*}kvy z+^$lq=NUeAsp8o6Nt$mzatc-)bb2tR(HN{tU&?L>JQ^(6?;%oYWUbt941p%U>`5Od z%O=t7f$xJXjOxk0T;+_JR^VJK&35rCN&0MvMwz>s|L(L4-=zKi^;CaiGI-Z?y1??9y9=eDLHHE)8VH;qU^E_f^odjd- za;Jo>Z*_GigsU{2DH;lw^0E1?L{sp8Tfm^UDoE=YzRG1ytva7Cj$bjOeF_0;=6j{> zgml`M$yFz2Rt0fl^3J-=fV*ec$2WH>_3uki6-pm>Ihtjjfg9t^0xb-*Q%(!J>>%PP z0(c9Dx8DK5f;bUv6uel5K2w+zkYUWzgV7yFR)A6VlI+xxGsfbc4FVYw2CuR80z(aN zAj4_dEpxUEN&q>JkM6puRS0@D!+>N!Amk5^&&XDPua|o>=N`qJ;pkwA<0koi44=4I z7X``04m>riVSg&6&dXyu7TM{z?O&izOCEmn${*#C3jtOc>H`p@is0gv@Q-$$J8I zuNFmL!LL{lIR21YFc;bu{G~}|Dcd`Q1~h~r=>A^TR6xI!sg)5^^)i)q$B2Kv*HoK*}cdp{z2lZym> zXwKN!tN_dVJ&sIsf}S1vz$xGL!C^%Hv;1b_lLC4+U~|yI@V}Z}-7uHj9TaNAWE#KE zm;*rHcUR4+T((s&A6*UP3R|D*{K5Ihd9IvULtl7O zB0wT<=X3q47V)VfhHE|6tD3!zn>i4jc$Utu0jCVmt!D)XfK%#;v z6WipO0=~3L_E;?Jp*DmF*^|9F9td4b+!|U{`>Iq7;NhDAtUP6Rb+Hm#F|ew1@PG<0 zgo4SIgCO68AJnzx0kpJFKz+263^1az+ubg4EtUCjqyM)UHgk|nKEE=`7HTZrMB-j& z5zPiOqAkQbJU9MCH{oRGG@&P@vi}fCS<}V%&u;YZ^fnPNvaH#E=cf}`0+}MP zQ#`ruRddKW_Zn?o5#5lCXE2~o&*`EuH)B%*u)a;TOKpfn9Y?ykJ|jBLTH!4XPH*EnA=h_NcMs^wXcBi&ut2i>>avM}Pw z(}2=*VWLGvvmT+8T%8fq$-aOZLT*SxC~4Z_Ip!Ac%{bJw#YsTb41^?QjvXhpE4fPbwCrb99l;69!WCNDjjB(&W}BF-k0H3@6ftFv*3^{FpX6fHNzB4K@8PW z@ia$=43j(T2dn}MY`teinkHv)l2trIh@smNyf~{GVhH% zu8kdee#!7{sef0JR1b-{FDIJTAhU;6a@42&W}I-x1<9|k19L&sJBdulcxm79l%NN% zNts)4Ro?i1_qM#ZHIYtgmGu}FutPIc^yh*$W_1T>L^}*KsooKZ-#@rgnPTtr=*#NM zT3Th8B>;+%t$Z{83!T&5zFA%z{M1~p_FyVMyR#*r z0dKV7TN+%oJ>MwEWSZ6bVv7IWXQen>EEv}ZUyMyiR?UKko3G4-Is07mJYQ_DkffUM zOm)Pd#Qd9C)Qg~0%gO3qSp#3SCKn>%@$5wVLfJ~oEu;14v=Z%smF6#-mCqiC(B6Kx zS6#}{|L(5l?stf*RIIXNH%HXkv$p9lrX+8e6$nrAOkwQI5nV24V!mkqRi)WlkvHp~ z-`{xdop0GiFV>uUxpO~5q>*fpGjOvnX30xG?)A0JMDR)e_oc1JIVE&SX67u1C>H7W zOo<6|Ld)@NEXE46-cCOqO(U>afuhWQlzuLJcv?a4w}PIR!%Hoj3*M%p_?DTF#wDVP z;JLSK+A6}~O|s$pRZQFjLnnnkWUo{>EAc{x2z*E>iiCl*T?M1uzrub!a`z)q+zI6u z2hZwXHn-#ct$w^$wmI;8^f~3({<>zdNs$#zH9>D3hZ0%v^Vn5ULp1~Y@6*Rkr>7zu zTK4@DI^8^eX#Mr`2Jk{McRvyphC*m0fj%Ix1w3xE2RyHSzi!S6pXGN^mtvCVZ7PRq z_Xxd`Zdp(4@%F5?5H5yQ03JL+Yi(KbTY11BEuO&!)~5_CFs3B>NZTx6@~=(TJ6Ryd zNSUQ!`jjzs2BnD}|L1o^_!u&Yw};kPJvN={yr3)xiO%GriK>A`7i!{mR>( zna&g6uytMLGCX|;g@i!DzWqW}MJ4b}_RK++**|Tgy_&h|bn^DXKhJp_m>l7?%CnvF zZ`QDq@qa7S{~HCLE~;Zm3<}to?L0k})A+Yv*G$ewX^y?lxZ^{=8(+}m)>GSK=29V` zSiA!hoAoFwworH@_YRIwd%ewW0lBA7@mU)BbUkTa>kN^s66BwcqQiIV&V-}R{`lXJ z!F1lURa-|B6whk^gl%2-`(*%hCqebj_8`|<78$=U(CPd!TxP_xJXFdWNmf+Mh?=lr znxm?eC_N3;xhf!{nHAeba!|C}Ih%glhtw567kM=H2|nk1^YrT1|FVh6`kAu{NbYxz z&Sv2@8Eomz-5fczXN6X)r0GZ4aR^@zgP_#vyv;>&U78?SXsje@fhUp?FKB@lL*xNR zH7IfTt_Z-a^GKOF3P*A{vEEzS1ECOio`H#_T<@0a363VUwS*YEnE-0ofkh$N8AsOF z&1Ibpq87hh1pArYJu>VCdew{)us*>kd_^j#)`Vf> zxAbd06=X%~C0}#p0jDu392Gvisi0XG2J^MDR3#*i|!+AyBQ`8 z&EC7qn&P)(2~4b>lKP#>7bXTsF#-Cg?gGCZH)taIwP9TyC;i&Nj?_ zyv|j;rhY!1W4Y!}3(^eAKmR#k-+9 z;2LDNCJ`_yXlX{*{DIL41VsLWL*Sq>bGQ4dUHx@WAQ$Ye^+MY4+jkCaXBZF*N^5-W z5{n)lc~D#;r=rvXHm26{nO2m@bZe7?5j%&?b>&F1-@~_LHZ^eDZMR+{J83(y?-!n2 zcpu>rVq;Kz2qsD!kUbR?xKX@Jar3$fcYqh~`U1RPzE8ve91aZ=H7VHkCw931H?)RW zn59se<4vQoH2Cp}0DG|bMKi`?H;s?gG>YlQYr}lcUMVr6*TqPvgTLVrrEWVZoQ*+^ znSpr1m1Oexo)z=jF*M6m9JmyWqdegLNvguJ(;w0uOvYGJM&%&sSbpp*oYvI74Oz!a zOqNVZ8}C*X3&4jf0`Fva++MNxZCvMJ6FZ^e-n=&B63|SlI~EK%>xI^q))`U}?R#pW zXXbG@FF5fmmcyAv3I3~K$vey?fiwqz{+JY2bM7$Y*`%Ub~p z)}dPd>f~}nZVUYS={w4VJs2ZxA1LU{)*5(fmXi2eK|kW*Bd z%OJg$EN-ep@e+dncu_%48;Zf|2R3V)SIT^52wEb89HVk;mGk(%lJ{V_5zkv_{mI_W z`_r;M0n`_DH6igYU$pM$N^68_cPupo2gNS3M)cfqz%>0mN&gF&1WXdHHwAtDyR$|J z4gpT+{b7xgzXwM(j0Tz3jiMKrgV5sZea>hk?5D_WUQXBn8~@<#2OHvFo-_}X1*W}; zIF1Y^^fZPBWI_at+PPcinOBbQaeH%Yl@xg%)+Jb+D&E^%PIF0VfADqU@(T5LwpOl@ z4?%izsG#%FHLe&r-{~d!Jo3|RDD6rD@;E29@>k@2XGSf1Az?BhArh})t`G-*dB1kF zp4jEQFpVS;K3M2%IV~T6D=+X5M}4()*YGYIo1l$y_dCwf6e}+bis=~QolxE-iZ<{V zG9-sO^t4Hl{G80{tsjPZkJC#-npBxxT5=0rbaFUrL1FZBxOv8i*??0I|61`0H7EoF5{Q#%gf!bFEOsRhT6Fx-fm3N6eiiQ!Uaj*TEZ-#`H;S z;PM=}VoRQpG3r_X1CpdW0u?Ds(tKWuR4WTLx}- zc3-QkKOrY`I(1|#rl1s%3NcJ4NmPUOwLDOrpN*{#9y3DJW;rU(1+C4{{ z_l3Dp%{dK$oV2~wI%nFj9=AbVs!PP8{h@&Q4c9Pz0R`%F6v2MmuB*)begrkkO8uY7 zKj8*hjz7Z%*AI6_{&pDc{p$Q5F3SHo)Mv_2M)A?E4OTm+nmr4RmG`TnoR&`WhXc06 zbaMn!ex&r+HkuBLE+jJCfIZK1N%^*v5DjG@CIB2&0_UBj&7e5My9zVlIA;$+Z{-2e z#2?M%ACRoHk$cyXt%c(4WImAO&?@!zP@%el>en2O^M}mw^B5hvk9rvLFIA!9bk)pM zbAI-(yW06x>V+x{%jJp7B})JEUn5~yc3Cq^#HcRJr8Iqb-2Jn=8ki6lB?s_LZ_$0O z*&)lGVW3y}bUGT`z>#Ea$Q!=uIU0-yKHtE?IUrjP5RF%j5Ue-mbB3gbASnQ4GLL+p zR!QyqMF1x8yEj5U4D5kov8l9%GdhVb5vw7h{b5~`wyKua?KzBE*A{(dYbj%^V1rdg z7a*vXc5LV^#3e%PG?&v&s)LvB7;7<~J{w9F()_ZCrNV z{xE;%nU?kCcP#nmkIRIgrVfC4mq2X5l0NIgANMD2V8$>Y*vN69^p>QO2>tHkEy;qb z&vOfh*>CYH-g)$t&Q(8r`5y#3ysCAN!#9`2v`!b!&B<=SEvZ?!Z`4| ziXXQBheFC^eX32(uRD||Q&v_4WfS`iDLKk+zYhs&sg;Xz{Ywn+ZbJwc=|PO=4b~37 z-nQ(*T$bVZI)s9vrHM^s+k$v){j1nTeePHNAx~~)QC?&e*}HTLWe3klzoiWOd#iDt z^Y5W;i{z=8w1!EohTZ{pt7~L>BKGqaXJ{ra4q3XF!3071{_V{S^I92w$-&^xsrl?! zwaD6(gRP;9mP!3D^%?YcKX)i|iA(+-H(jf>;?_^n@|{|{>37d7<3BGn@{IE@6d!rowo&d6u#H(a)b)mP>n|f+Sf8N_tc& z6|S?bDODeA8U;6*uf1LJ3=2x#8hGm_iq%FVkz%r0KubWk8P2fD#w*Q$9F-oLuSDFl zH-hkLs~4)#q6XV2*b=SKP!{5+Z{ae+k$wuz{$kVhD$P<-8f=$ZA<9`8Q&S~j3H?+? zYMep8ysCcQHF8G=u(-;Mi~2V|eSU*Am$U%5UCH+$g|F}lhFVg-rfwaJPbl16Z1Pc? zYRJLmPx;xky!RJmx#O#YP-##2FA1EtiFzo#rkr)}GssXYR}|h(Sd>b}CO2cMbybs) z-8?7g2^41S1oj|FOCt|={|)4?*D)?C zjRr7ReBO0+AgF$A;M6Z8Sr~)4C~f9ittu!1gctq! z_j2LU?usx{tQmU~PmNl)$Px27pUG=r_OR!5 zH3ZnNgW0Fzwf`a07JQor)~7;CrZx}HY6bs0`R~upWMjyQjrC*`qeep|YH+i$ff=C| zI^*D11S2$PX`LeA64Jh|uzL**Y#O0{>8$?T4Rhm9G*gOuw*4))6GIqa>O%~tykZ4% z5(_zben+&QEDtB`rc~v4H?}mEYL@jh>Pu70$KJg5asL}sM`;hInb3^54ed;>Ubep3 z8G|WPRSFDWCEogFJTqd}x$11miarTj&I7A ztck#mRk|o_8l!FlNT|=(I9W=}8nG}b>PD9XhFkfuLe?TjOK}oRFPmgpn@uZ$wqpwje&w4V>b=zrl z-QVEm3q>Uo{qZr!zovddrw7P#9_oJ|Ycdi;Bo24B*Z;ZQK-eH;$#$TwC$&{C!S`ud4blRT3K9r(`Fuw0g}6bC4r^Hjfxp zL+G^x6<_w$1IxOt;-7^eqO3)zt;zcDv1i$tuzLii2SUp3eLm}|4$C91*-xqntIrdV zs^c@fog>sO@qDMg`c??>IrWzm#+gl_)sT^8w74h^V<@FqL?-OljWG#0fA> zI3mQBKMN5e`SrS1BDc|&3ahOB>V#MiKE(@YNzT?!_>p}|DiZ?G+HM1Ax!rQMHhjwx zJM?`;P1>J3LB;7uBVm6>xvU>N#ParE2NBUVw?WN!*{!vaQvBlB`beKfY6i-sAkvmW zmq8xE0+(IWkHnX?>q2Xo@LDm`Orh*jBn!bWTyNc*zrPeHbdb0-BmKy#RA+ygV%j(# zkGHti_4%0P1&INGnQe~4tbz+U_GtzY-jBfIDW+R!qzkuTtj>}cOH{@?^Bb^kXwFj2 z@yw=j@q8GBB`WB+CGy*DwfJ3rNe>rE&i-7N#jNPUPK`~Q7*6h`np`V#fN*Tj>SdM% z2xh+?){S34^4M+(ns9g=_CIGZ?VgxFL93vaq&Vq*F48?c^H!>N3=PPE#l7P3K_DQo zR`6z=nD97Ucg>&Gg0+9sRKShckJ`Fbv+OA1m{}8*Numn_R+63+hXL>UfGhv@c73Pm zf!rh4;Ms{u(03z^`=l8)E7A1RMu)gKJq8u2)kI+6dYn(fyhzGCSRiQkOZ8j#MsDK_ z`ogS+WCxqVnYWlbGOd>w5760gA6}Sh65ez?i$$ctDksJa=%Bua!wnVlqCC?f$(&5;jg%Zusl96hF3eo&GyXkkYy zXOY?MKcSI1SsnTk%L&p$`R}UhmYRM0A>@F>X64^9x3J1G#2bb&?28{RbiQV;>6t7v z)3DYtbG?ows5W+S>E^}~mu>3XOHX!R^U9I{Qj- zS(G$@iCz081BFoGor{t_1LK{uLLULql_v>u;Yc}Vf{WENfXfj0@-|GNjC^r_uf8`~K5A!PsJ#!g}_~W2a!eH{rhNL}3NUzp^Db1(ovEW0r=&S4I_J=QL}eF!3OLrw|48woaF4O6K@uLo*V+=#Fx&GdWa3oud~RyDJSExneE-F>{4>6l3g7F-a@_wq9cH;y7Nb}I-FNg#1fR`= zeCn{q)nPMG0l@|RnM~*m$WIg8?N(MK|8>W`6tBYIA6TY=+_OsQy=D8Nd zOs~@MTjgg?HHGFr@jHnQzDwBO7{3YmF(gAXYlIHnJdU!vN-V~%okmCqsQjV)2|R$uH)oYlQhPC;jHe-3E#9n zNSrV5|NO?7jFibA`SP)%Rea3RCX|+36P?ICz%dnEd?(FMr=mNuRa^kNw6lBXD>-yJ z@aX$ja%{$_0BpDXAa!Ap&kP)yBW9Dpq1m|qb4z%^Z0);X=LNR_kXyjU&(bi1vDnNw z4{0ynx^IiFGW>BnJ6(4DNV(N3aLCZIM_!lubwB%kkIbW(rjiH}aZOFSR24!h)C_u( zvi_S|v%J6Z<1<6uW;L#5;HqlqYM~|Q;p$Xq)J}g$&Y)27eW)xgzHDT5G&S8PzI;HL z;$t@|tPwo4C)~X0^(S$)L&Ygw(W%Vn+6cOe_Lx?=Qd*!yOulaBqRV%^O2M&;_RGG^ zspEiEkxyrGda?obez*8>L*PHnt4HV5s8ty9bkhodOexgr{|&Z13$)o^V_#_dWmZ;T zm>%;_ojDWNe^Dyv5G5gnXYfOK;mK~L#STA#!ZSiG`$nI5Qr@*Z93U=WBGN^9i#oZz zC=t0;H@WiR4-*ug&_3}+LUEYO4`vAhm?B0MZ%iwPY5!~IBEItlESS|J!~d3hhEIs&gI7{w%gzTyptWn~SXi8ZUN_-#)su00dq);*#QRY=DaoMziRm$^4{c^l2VqiJ3((JsA zS?kl@VRHsls-y9k&-^0IG$G6N?v2LBeQG8Z=9-~71?hKqekxLb$NtCaCoqeCJdviL z<<{YdYnC^%znFsEnuhBy-a!ZdVuW_fF?qRFD4XPMqhTCh&ib9b4j(R%e+Q%n2mA&G z)DFv8qy!|p=7J2ZwzR$L8BpRQhvPJhG zTElp#7HRMlUwg=ud&-$DZnNykt6-=&0WqO-6v#)q@CV)Bq0YZ=%47wS3U_BfyI4yS z7P1Lm)(9>CQ)xN%q%$@Hr+uFLIlt^bWlX<=UK*M6>1kJ&vleR~Vo5r;Er_CuxFCpY zQ$t+APdu!*5LN5y$f77yHb1o+*~j^_j0VD@Kpih|%}TvboCZ{}pKPjVT&YcIMhA55 z`|TVpmz;fYh&HCuZzdu4J$w4XzN6(X86m6|ZABB;pzpU6UC_apxZ6fcum)G9SPV0c zXPOlXheVPMvM`sLr7lgA}15 z?e7624;@AaA_AVu_VK?AXY+0uz#}EVIUOgZ*4k14`NX8?{?ATG9Yrsbo$YLS@3bgi z;l+@#SQ|F1*Mkq*;PgbVem2hiX3UFAZf8v~;-W1lOqoI55GW7Xh3r6RnKPO@Ozt6L%t^RdL1~cQ^)M2sUoY%2Bn1SEFByVswlBTX%HZvuvFT<% z8&yg<$U4CpA#UWE@n7O|{+Q+zaTT!vufj05S6kbVjM!}02NRB^K1f@=?MFk%_h1NS zod?^O{4@#!bapvkK&v4e00p9F0Chm@i1*q8Od*oMxd zPWKu7RlX*IsaPvsFo@fO2YbLUU7Ng0oln~_2mh9d>jA*I9MZj@)y z8{s7`**82;{o zm_|aBrFAoAB+*pb+i*B_-`8lF>R@Jxz9>a@b7b_Rb6tM!47iDId0#m{lv@6dG|OPH zibKofQ7f2KlD_3>_`QCPS)lbcy(grp{}LA6>|XTt`(ayqr#fwtF;0UqDFl4u??dWR z)w-7Ca8G7az;wIN4`%JHrORvNSQ1G?O-I8je3=z|82Dh`m2F%7;8nElsl?EV72Y6_ z@P2@Gdgo-OAT&%;JTodj;o2_t+$#@zCFu``^?Ta&51AnY!i+bP`~b1$+Q*5Lf>m+m zq}GS-WlHHGo))R$!-y+^Eu-tQKVck-W_ds_c;nGGKc-S|i`xb>em>}D;6;CCCBt~rd z?Y#31ueNe?b6;0cq*CliX4}JEU*xo&bp=>4_TMeCYP_;KANixnpyqgk`D`|;FECc} z9qb$)yJFWGskA%mtEt?m8fIhIHz^VF=+$vUPM4{Y2;a4mHL4I~KO9w~XZnj#Zy_Nj zU>bzI31Z8|o^%LLKdU|epjKaC>Gw;9y7swhW{cX^y}g$~b=v49Sp}7$6_@z9S`WD% z*~zX-_ANyKQ#zFB2<@>JU-jxk5*welAuX@=d5!IfXxOpDT9@4BUmInm_#p0DPFHqM zbeFu;=^pF5ZE}5i+MQP7TvhNmVS>V&PoUW^eR`(Ie?v2%S1Ubg%Kk`65cT~H^#k~? zvs+c+@MmZ9%cC{X=joGkp?k}tO93NCyDvK${r`9B2I!{$he6)C7G_*v#vE@$?c|^Q zrzbA{Ne;ionEfI_C<1dJ_GJg3gJyjpxtsWD$-d=;nQ)8ysc8v^#?TW%e`k)7{K6K@ zr;03NlN7q8XBMVY1yKL?1J&#Gc}j|sx+{gjLbyP?WK9^ z4k2%HDTXFAEsq!5Xh9SxSATG=vd9!U`<65y0qRqvd#P43Cgu*;1PEd5XDnqglcX5PCHo zLc6u<;ref*LGSJgFyj4XBP06#IT} zX4u6FI?V<6GL9>h@`Z;4oh<}QV!r`{wm*J&oTQwEOV?P;4`YS>Y=iX9w6_FfMn);p zIizUFFoo>c2SAsBLknC9%c01i9J_T}J;c=SBJ1bzqSWn5}SaVUnDMXEy+7 zTei21c+kADN1hN^G)#by^9pZ*+0NO@VEHrkKxF!bSjao8){xLDz~=v z#TJ}59YxCMcvNANA*PjMD(yuXU|t^a)51RtT4pyis)uyzf3ttwOm>syY2_C+x_|E= z;bMo}_E#fmywA~BU=OsxQw*fmZ19W*P8A&~MWB=T={oKu2~Czv3Il>6caZsrrP_g@ z*(>!S5f5YxFaB`_zvJedEuXgG^Dga;#AJHrs_SuHwndU*p zVs0!lzh+1be+ovdvJMKQKNWU%+QT`S;|a& zlt(Y?!9~IL)z^$A_r%7ZQfB%8K;}4ZNv)FTVm$wt(n3U;cdMH0MFN4^3`u&Xwjcph#kD>&G+t?XyYz%&!X~jze4)*+Sb;ixuIzf;QN5~a` z>Kxx9m27=>8tWAuB@_u1z=`%96G@m!FLhh`Yo(7-g&DrQ#cevJE2on}g$}+v)$X3R z@gs_brQ4m0w3^pH3oewcUsiASInSsz!%qE1)f#d%D)On!;k>oHw(8^)@mrDEuD9j6 zg0tRV>}8s0>zkqB^4bSgN4FaatGH1l0uw<6U%CWxb6~MZ7y(uimDO)lW_{?t>lV^Gq_ z-a6Ph((asFp9woHbc>o$Estgzw6fg|jE`~EQfcgV0cW{vm|1*3^t#|WG*pleLOHH{ z`|+$YbnitDO~07unjQ6VWhxH~H6{|2oA*-5^_Bh#w&(fI3x~@;c8a^2^PcH7nd|eS zzHKr$(9mBUBW&v{^y$6lHn0QKoX!6tg46UYkweu~?4LA-3@Yfo8EDsR#+loOqW#zK zn_F03z|cLA-i+}b4lY=0VMv8d_h+_L4!=)ClW3a3vm&rT{+T!fgItw_gNu}e_<-0Q z{g2US9!MQtq^JmGXh40sg z$Lw}JrR`UBM(0bOI*m_Hj!f0tfeU|-N2$ly8Kgnuxw7A+z6n1zT#27!^$ zTTiJ`nj4Xkz9;=@0?-~jl)s4e6{QR2(cXF)a=Wk4I7*>qd9Yl92%VobbB?p|eg4UE zS;cCh@QxL0kd)m7nS`X2R6oi$q%lh4VxeWvF%{>6Aq10LQi1X{% z#uW^~X1WOWo@WGGwq51t!hd_o$5iXlwr(+~ziWw#_Evm0@fk+E1(*2-g(imP1SEuT z{JoO4lN$*k{9r=mcv(VNn4(^arZ70v7V1xZ^I4)In1)I*6f^>Htd~&AV_B!^n54`o zeOt-i#e&ciDWs<|QCT7*p5rkErace5u^=()p@vw15W1N-619K~5dQmcpPzda{YMHL z9;}D&oAsq1R$K`-vF@!aqIGZNir<8vb%w*Hk^_S-=*?_U-x=a)U9`Xf$k}5PElSv& z-!M#<+KgI1V8b;feeR=vs{i1U_gH$~%GT1n4d0I@dRDZ*@b}zdD;E>uO*`)Xhq15~ z$)*vb z`Eu6)NF!qaN3b)N0Z3;K(FSQWBZx>W&nmA#F0Jkeybqdhyd3y zt$f;xEqTm2=~D?R08`4qMT}*c08_Tkzd-IP9H?dt@je5s!?j*4I9^*f!#_!pyA zl1z*)if8KXbH&|Km71EEpRv?#I=a2(qHwq+L8h$sf}P}!?-I-V+hgjP07|q^g2S-b zlc3GnN3gPMrP$kSPALcWLAlNtF4JZbTAc!pGu2!mMpX9P(~RYZiDNR7P02P!?ExX- z_0ul=Faxc?_q7vVD#m4;L0PCH?r%HGO65)*iW)SJLQVizPmW_uW0FHow^>gP_MD}I zG#6HX`wu{QZ(h$Zq5@wZZe0ra4q_6YucBS-$H3`S-~QdpDZxPB@PgH?0oprPg#;&% zvEV7yiT5i=N+Y_=HQw5?VysUlVMitBo_$QJfl90~$wWeZ3j5MQ|Um&wS z{Oh+b%5gDesN9&v#KkK7eha)lx-iu~9EGT{VeANu^Ij8~GZp*#fN+Qb7FAQjAZle3 z+ZXPZX67M`YtVz@>nleb-V1&TeOrd&CDN0dreBoH$h3^tzPa?ZAuBzMELG%QB~15Q zA^kz+8%p5Pqn51LoUhG|!TO}td!9R6hYUZvTR|hUuPz4vEylj8ZU2JBoSyfXn>U<& zrET02(xA?^fxFP|Hwn|_B7K3MXSld;*HJ97)PA`cw3I#2U1^c0hr4%}ZrJp2V21Ru z&bI)@)UeK+AI!u_ZkqHcKSN+(e}j9%7li?N225%f+XM{-a}J(QY$HrI$SZdri|6*s z-xQ~-`rcP)ZPx%|qq@sd4d+*HM&SiMYWzY&`Cc{0;4sl**8vdESIi`IBkONmHr#hnCyVuFVvg0n<=MaD4_Mw7BejaPNUX~couqn3;-HCFQ(dm>nbxw#D>%&m%?J18nz#CSow3qp*{#dbBS zD-guU{Z1bu3>nnm1eYioZCO#MXse}b-w_`J%)7fg<$9rmTYsg?mxE0?H|%Sn7MBk+ zOc^8RTV)S&65t$i6ytr)wy^$(sL}*Jxk57?!vdS8dT|MfC;X9JA0M}HO3RA;8W?~V zHS?!yCf?zEF^2!qq}NWYz@km2H?R9N90`4ybVB(llcncYU%XzlZ9aE((+H|k*lHeo zpX^4QX=*vqKBsKujPDGt>nU*m=Cz#X1TGW?4H*01M38suHqHab(VQQ>*Ehu)g15@7 z>pUm>((9Z@OQx#}lHJBSFPW2fbJx*33qC4dYiR-+0Ru7dM#>>el>#arGlw3>KjU%E zu|}yXsD?xSQkhirSiMiGi#R^7_j=9vZ=Y1>mEQ)F((%WKH+vjV>3O3rRs>0Opo83#-dHrfW^bkcVBX~Zoo6n0*WMWqap-!lJBO?II6%Dg)%&aG z-2>ML^AZo7O)g%c3o|@OF71^qM9dhVKoMnjNTQ;*UJ+b?o+8(p&X_y?=NVqhCnmqFl(z|iG)#o( zy=gEQTPHfgLW|| z+q8z$eFA1L<;5~1X;`yZ>-w-81TWdWQ|V0|GgHnjsuW!@Q4SNN{3F+=CKvC}&dhkBA3cNab$={3`0;Q zj254e$#HA~0ndH&68E3$&TZo#lPnSmK#KWZsIs=+Ez$b(KqB{ZC2eS9kH04DNTy{O zYftT&CI<`6N9D)XMk#L(cf%7FcQw>7x zzE!3#TTGiG{4rdQI+S!9B_vt2d>HAfFWjH1_*g2#w>0vsxYY?b2E4Eo9b8+W4k@Q? zgqG=bEas1cfyLeWR4w9$PnqX>jF2wH%(ic(lFmXGHR`*4LNVg628=>a+d7gZ&mp(E zC`*4Hi5f2zA3y?*a<+guJXQio!d;xKH&AGVhXNfS^=}p3O{HU6(_PRxSA>CTL@qF) z;pPhB=?T?)DQS^6UEonR(RnTo$O6+G7Zi0P?X}TWqZaJss=7!*1A35K07kxq>KMXLYJ0RmR-zP@98d z)lylWdG{~H2G3I|jtjS0y@klN!TBci(QT}Yi9Q=x4tx_Y_OzBC)&ip39^PkS&5xIv zWZSrhS-cdJRZ?O*u8=c2ixHlsXbJx^-Pm1KgJzizePb>JZiT8n zw@>GX#qKbw)kXeHAtiIb-n0{G?A!OgPskA)-G2yki3iR|cJakYCy zM}buBUe}<-`wSUxM~a_5)Kg`7eqaz?Q!Hm+WC{6DFzTbHrA-cp%ILLLqM@J`y18sI zVqV{0#vz293ZT2+Q<7<1(qd4DyIRJok}j6sL2(qb)B$xJ@g zyujF*#TTal#nZO^`iv_P7rQ5F2lf4|s^=%`TZf>z)vYfV)8d~^>)_ODFU-5!FZRzH zg1yf8*dMWMEf(+=t_*EOksa}*7+|JfG`}5(yQfcsWkgp+(;H4mR|ZZG-dXmTbBo`v zUh{OdksBKn_+z#|c;I<#zW>Z@tb0&DB}lctv6jS*PJca^8~y%D%&qG8&Lsd^*u39F z4lxWzKRMrt+n8JEMmsNGR;hM=D_|=>Y!>?m^-N`?qAI&#GKNUwvTXEv;oNf3$6h5f zTSjnb{I}R^q1eB{R+Fdl5mEMAr{IxzZ@6+sIK^J^UfT+phc+c!+?g&mKDaGxl0UrE zc zr!avd8feVNYQUTv#9zu~Y*Det^i|-aC-}x&h1+#d>7<^oG@tnL#4YGkUTd#?jb!}c zq)mHAQ{r_8XSh8E>Vq1t9!fB!G_6`c`lrW`H7k`XGu@uba3l6KiZTWEZ z*`-luPoEm!j4$!-Z3natloKFqmfSv?VZF9`k1`O;GwnLlQ`;J**iRM?7y_a8q}P(Z zos3->cUOzq{rx|i7{hE8xA!siQ;UrRbgaW*@A?s$UNWyhGjEU3Ke3wKMcyytL`V7T ze!Ejm*cc0ahW`8Wj!NlKrofoj&lo{v*H4qa6ZGQUzMGYWH1AwiHiN4#5_p9e~GU#jET-uLCs%)=olaI^w{$9LD zRVJQIj6$UJ)z2NjcqFRr{Ew&X|4#DVqDf{&n!BryQF?D)J>Oo2x6P%rTpHd?@PqJH zMi@2n$FdvmU8Vw=1!Qr+JX}+(ga1N(#^nvbm2c%Z^wh*HFLA(RJ|&ITyQWlqeok0S z|6~vPGek5NAfcnvtQr~SkeX+|I*3Pa<+3JWIj24e`bl%ZDc|rx`Ai0z0(qSZf9z-(=0_zo z++h{0FDsbw4$S_5Te-WFE}Z{^=dSauA~A+|D+r{i)|)eu2R1;CBDWQo*F^UvTDly{2!W1&%;jf(GV^NO*wmZs6cL$;U0u{%@}v)U8{liMrz zhN*Xg8RiOq75H%#J(05q3c|0r;N(WifaR&xyJahAqY%(|vaoNz9`!&m-Cd4JzLWa% zzH~67T)iCw{`XcQ(aGfYdf(;~Qi6rR7p7-;gjchp%*RP67_)!x1UHsx3g_=veFc zsA$Npu-za*!lYjFS<#kne>~>nfl*7|&3jugOtBdELdO-zgiJ1NZDbO){&A97aujH5r%4Rj91xtCCSBN?>;{Go)s5 z-n}UiY09-N$@e(d0&fEMG)Ht8=XMOj00hrQL2B4$X~Aeb#VMe&g28TeQ<{kV|B5Ut zu1F5fCv^r6aAPGD!1$@osy)V8#UhWb{XT?!g>|ZRuuRmRwUZsY1cebQx55;mCpj zeB;odIR(7lRK7*RP^l;QopQ79_9XWo-djI=fqH7t5NI7?OJ6f+y}4dS**z0?^Szh7 z&N>as;M2vLt|Ho_Z-6fNX^AUz#{-pBVLdB)57Nb!JH3EDxbT{0W`6`n1Ay<8%e>Z zLFC&vU6aAWHfO)j!EEmE{f-9){sYE-x4JV3uvPXr z?$6K|zXfQpZ4N5c2>EwyTbmqna5VeRp{Jw4_QJhNrD#_1BH3+rtl##r4fEPPqNF%M zotkDgK4;)GUs=$nxu%icZP$xjg*DP7jPi$ocUL>JRStJWVwY#+I9?2G6k7vNyjlMM zx3wWGe+XY{bb%Y2WwTXVZd>%P%ZumG$_<`L*4l?5pN0mx=LYBN7Tx9J6;qWv4*U3! z48LO}R__npC9qb7U%IMuH?zoa>(`ik#jTOp&Co5P9CyPZAYZoH+x>+ZZ|Z1Cy5Y-N z3M>LoFRx!w?DKI%KR{B9L~;~nDxvW+i6R=u1+LrR_Q@)3s+y> zjguV=R90yX^&LMeIrSxq#za}o%oUV3hRm`C5(ge*p)4i~Me2O7wR0B0)JC5}ldz9_ z?+y$Up?fWolCaOq%9t)+jd=El`e$kf{C)x7Z7F%^DnYRTQ4>?;GT0Ze&*uPNDJ;!4 zKdCu6Y0y_9x*p9B_A`F_GS;IYL>53a#M*ugTbUc|=fBt-xzr~e@Q?2p2sps+4_=Z6 zsB*`9e;2!Qpcwnz8X7;{ko?ToRipH}x!ZW+rDXC(_dWE&wsFhAgUJRj-odbYlxccJ zPNwYG_#p2_+euFj9;&qM9r1c_hK9lAXj84)aS}aQafJDAJ(((dw>I^hA>(jE&HgOb zru1P~pV!G^b*z-l2nB`XIxh7W9VAGjUi75=huLSB$6q`XU91{fM{Zg>?tMyAz(Dzw$8-)iLz7J{BL2z0Z4dvcv%lOmY-7mxgcoDILSI$n)iiNY5uBd#Bsk?h z(~Yw=4^!ev9q{QjrWTMmo}=grq9Ms=0IVu<6?8rnlY;}8cAZugz8HKv(&V8Q!i4%w zLeEr3vN+FD?y^s&;4saRF;?aN=wh+@wj_YL2La-^o?@t}IDky|2Dh8MLK$!OD`$Ig{+(6SXg! zi_$ex$yO-eiugPjU3qkM-Je5}45c(BiE__AN-Vs}pB zfR$)>IBTw}xFLFQNv>4@binh?ctFP;VidXF-IPO%wTsuEubtc;xJ&w-cpB+_HY^Zy zTEi)c=u&E;|Eb;50d5gsoZn#-^+;JuhaA_gx;sDtgAGCH*yHwY0dii)>0kEeJo2tj70$0TM@AdQCa>Hgq~K$dBX+UR1OC-R zgAwxyS-a_*ueSn%r}nl_qslLOUE>N&7&#L{(<XOS`KX|i+n>FdE(*G)|vCqP}4GYBPbE2$s znG>xRh@v*48V^9p7R;j4+Kw?xa7jv54~ip8mHiFM>>OUwJJqAN;YRv7LPwYC0p=Ci z-@oz}>PaD$`CH|+>|Mc458LX==`@!0K3BonW%a<~i5ANGy@5d|RcDm`PA1&`?W4HY%oLh3HNY#&%f!r8 zBksA>)}f;~D=tWM8CWyO);y8kXD+(->Wu1_A^?Ir53@fO`RsTv4;fR=d0DsCLla2| zKa9vRk#AWo11@6U(GbwUYer(oPv!Ih4wQREke)fIp zZ*Z;ef8Ma-?gm7@T9ut>5OXSWG zTZZ2H%V1#9-WwpR)<(t`DkF7chQMcAkT~AidPYC{yF$WZ*YguE%>{gb=f_c^ePM~; zj=bX&I7?SoeFSMdHmZAIG&KiD z^06l2ys5P+8T2Z}=?3XDDHg}P@hWPA%53@Jq>J!nm$jDpnB(;Nd&}rZSeGC&N}dRgD*7|tRt*z$<*hERc*ol}H~o}a0MU6=Vk^w^Y8~bE zrTj|>z4E!v!m96p!55n3f5&uPoa_Cwjr)Tc26xW7gf8Y|E-9b4{Tp#iczX&(zyND! zXTFCg%ldy|ImB(K}sDSipo-zos{U&niAqhK{Eyq_T+>-}BBm-!E2 ziPJrf^z6_$a)S~PP$f?|_!7saXR7*KT|qmQ=;m}=rAb+uA=%;-mp}qrMPg1eWvuV; zZY8!Re6MRP27K?4 zF{~%*0WCbtN2;?gyL)l4w^Y%9oSg_d@%Ofyg0VU9G} ziG3UOR5^X^2Wf%=h_a}#3ZOE@sckRieikLpcdv7G4G6!x5wl+3t=F}l1A4-2Q@Zvv z2hXu6BPP~95DL4tx|)=bpfwy5%5cS4_Jj*IEGw&yZ#T|S3|%ueHdFgFf2YXu$>gCx z(QN6{YMhki&UAazp=dW;5E zb%EM6tA!-IsBshF|KihCY}4q#3r(-m*UZg6W1aZibY``%x-edW-rs(p;yD*V9xtC{ zeIZbu%@8}$dVWTU2;$HQsOfIp3Ynvi@V;hqJhFmU#%We02%3XOlPji&$Y{sS3N?d* zo}9b2j(hSw3-U4iT?g6$YwSKvO#l-4dd(#3NWG)93wPv6;;B`gePYq$(lMU?G^GB@ zkMh+<5L9&ae*Fvc>oavUG@i=aO4U^?TLUw1x0TRFlOrPqk{YGEpK8o6Ns3$SK6Aod z1Zqx>FzBNH7}00^E1#|X|8U^{)=Y>jpX0(`smAe{{L2XArW|^m zhPoVoyq_K;m8OZy8*q$=D1Sq$e3T_X(oyb~@gZB3jz81Oi61$2)=tS!eorh{v;3*_ zQ5x{9ZUBI(btlc-XE8Yjh!qUfQ-Mq$Le4V*g&spOrjj`m6aZ8m*=6eM@7zmq?{Bs0 z%O!UQ4XrKtB2p(6Fs@Oya6duG6(g?Eg8oqrt!AZ#G&q0;GfsoVD&4xsY_RPSQkB{ zw#3s(fKO7%XV>Fs#+F{sW5a1aE6QF)Tx$U`iYs!r+&V-^2UsFDsR1Urh`OkHey05I zVa6%Xb+O>#Iuc_A9hTZ%<=0iTIw<*dmWkOXE|W)@VD1%p>Z|h#1Hk(4q)88f&@8)- z$zA0)af}?!QQ8XvkF;)xN+pr_ZA*b`zwg#NJ5oj)7N9?-tumQ7eU11`><50#5)2{* z{IE|UE1afg;wX|RQgbIwD0>vcf+vaAo5W~0K+-JgtIME{k7t82nS9pKG8r=23nR+}T~z^Y8N==#1=X^%DR*W=(8Wx2IWMX)z9gn69anBEW5es2XW z0bgxuquP(^_AJ>3H0h|GpUSEWBQ{-UOL=S9KhWT3C_%}NrON(CunlS1&;1dd(>YbK z0JgsmAsc^B$?s{zU;Ty1Y^cD;0g@TEi?}-9;Z2-hfOh9ihL-r=#qYm&)IQH33>H@D zj-LF{SL3#Aa2B7scz>oq?rdsE3;9G0W*qT#@tIrw%F3ajH|pl#S|#mdKE^$>bxX$9 zt}8FP^2huT=NaIZg+eJ(W^KZ|8h#}TmT9k0jWoP&A@o_%#KXKq|LaPQg#a=ajfpS= zFy^Ky-`JrwLK#kge-g!ov!bhyUrkV@DeqjAb}WQJ$vbLH$_Jlq6u2VfR~Pj8r^^L4GeA7)EZ5=^NuCA(wc z=!h)5QyE>=xk+x_s`MvL$1O4)dm~S7HZ%rQ3#7??uNJ+m(d?ZiV5>eJa})palP1CX z-rI4~{IrWj&F^XlBhY`=N^<^YwYM;wf%4&1d!GySu8vPUKXOKfd)Tu$JyLEE{8vN| z9;ss;oE1HH7mH_(X7iA%lh^B<95wNgrQYV+#3almbj-_z!hG__<*2BichEhdS@Wxp zDfl!0mc-^@AVx)D4v~5&(qrx_jDd$yEYhJTNQ2@6BFwfi|3-33TyY zLn#^mCH%m1#b5GWbHLJ4U( zCAu=dDDx_syL4{=?IeWQPQuGO{IT`});BmGh-HZ>r9ZeUlVaI#bMEpd2V8x1bb0z+ zES0`({D+I@ZsI%)>P>z-Jaxy?fjYTR_V2lAie$;edV9mhhd`USiyynY%z6qGZtGNe zAci2l(l&zn`TohSZY_q8x-#yKsL|$@oj4Qyg+d7PdJ$)y`Mkw)S9X`z=4UtT|agaYIXV+%2 zSP67WiLp{`dMnqH|Fr0%C!rD^m!oTSvuY%umAUu8D!&?Rl`?E| z0nk(cOocc?{<@q{_nbu&$=N49$Fa`%b5&1bRe~SzjyO()*7z>!fCOh{UT|U{3)^Zr zSkuT!9cx(TOBGFI&+eOQ0nJL}yt8>Ee62g3-T+$zUIn#+>Qbsb|Djt!lybDDBs@7g z3KS= zo%1-Zv7fF2h4&Wm*LMp11=PosJt|9BC0=4F$3VLW06in%qtb5-{;C>SE3l1>0mo)a zeVQE`yAGakSt6;s3HU0G(~d^jRB7+8ruqxqT$DacQh?#LN6XuFBe)lnSg~aal%sZF zNx==0iiwce@#j`<6*IJlPjuI%*M3o+vUQmz*d^P2`Ls_t*l}aS3GtH4AmbfCBvto{SD3d)c(jNySV;fU|BuMsaR?yRi3by zXfUvdruMb1>dVd7b7S&Ul59Av;xL9jF7CO6@h6J6%C3ZY%4yBT9%geUB%3k&WZ1|V z3xXKpY3I{EPI+msmSW&YEaY9{2x)6AEG#aUV`soLWwT%3fub*w<<=0dHzgKOIYXAJ zV2n3m1CbN-wjrXVfWbdgmC6!Bbi0mS8Mc$>?g~umCk0wvt0CNqg{C+R+#j*Q9)2-r zm=6yiiuyEo`n@5U=D5D=2QPSNXu<)Jgcg!w%HJKiJD+5Ys6AF3v?Od0k`kFXHd&gg$ zf1VkYbReJaq1rQxGzXQ!Jofq`4qO@Xf`BP$12!c-}CNhpZoRWh`CWPm8Sm6O&SQZbwG z^CXcrW)8Pz2lQMD2sr#xJ)JA)_l_9E27a<~OWMB;A30L1j7)~pJUM=g9`{E@bUin$uGo7q@oy*mCdJk^IaE?1 zvpzHOybAdZrQQ2qMJy(oo|dK9yqzBKhW^e$m99mjk4WxN%n-`b4!#0JJ*HrU0qJ`3 zWiHn*<+Ix@_+6*EVWuK%3WAys5J5kQm#S3!@$~U&e66(AkvVC!={)y)OA(qSMb;LN zMIbNEeHWVlaeyWUr9jn0c+NFh8 zap+TW^6Uo1#rgE2OXDBg+3dx?FO#!MH-*LL_Ai}XnE!>%Y6N@i?v$7cYs3eg?x(zI zv0C3NNcPKc*D(G9KiK3RZcrGKuwC4gYHgylFuiP!I3)OZF2ylv8TnCcnva;z&Y@<+2#z|RChvUnCsa+$Kj(wQ#f>ADVl6Ys}d z_MG%*{ynM7$t-=+BnvDo9X{cpst!_0&)QL{OTf)t;cnnFy-5MH(euAq^z@wTegK+r zqcWOL6MRqv?Urzhk6Ebq$Vpq+)~K6H&f93y)OTFv`JeudVaeeAo7sCg~_6j=3bC zzdvieB@b#5ri=2f3o)wlSf` z6Ht^kva;OsHfv4*#WL&E0++_Zioj}B*{IRaRN4L~Y-5N`s|jM=!6Vt?`e{r|(Y9(; znaH&AxZS@&!G{CLzZi8&!XK8=d~0yy?P3t0eZ|*kN8_s0yKg!;XR@DExQuTo0rB~{ zGS+R{DpIcN7~NtEU2CW%)*#Fv48~C7+SNeoOfB2pwbU^K5JfD>-?H4`fIyUy(nnY+ zuN3(j$8l;CBWj(N8xOL56f@+Ds4TjNfxi@StBQ@`lM^2-QJ3HcOD+>{o!kjNOPM$<6w(B^vgA8(UmW!7W2Mf-XEZw>_HSw{G&@PO>Z z=Bp&;m2BfnLO?fu`^W!FSLC?Ao7c}|LR9{3nDC4_o90&7{jlfMGPzprtvLgdUN(kM z29W{ZRY)+wjy2ECaf9WCH7ZA^x$W*_E--6M6H2h?;rvdaIP- zue}yL=c_Zj#7!7MF2~+HmWYNb%Z`B*|6pH`E{GO{9*=7b6{^QeQ_wI+)|l>P+Lxl! z3E$5p%3q0w8vLSKzP27cW@cj9f|K%T#fI&5f?5H0e?9p*<2xg%I##W^uSnDQdFY!e829-n^lG^71x(T~Cf^ z0va>@)O~9?5w0jaeXH!uXa%+e#fBV{T+==6Y<>iB{Z|n^h%n=(F@qTTR2P-IpFNaw~DC zXfB%JWw<{Uc1uTFrftBEe}=34noK{J%rW1OU|WStI|2=zi%ouZHP)b_0}Nkg%iu%7 zS2N;PP|fm%0$$2-s|)Z{99V>puMO}#p+**q9d6(5U+)lU>5^@zbD?p{o}Q@dgu*K( z6{y%o{92}7i&VSlnNR*qUVS-j0k3d!xJL!UVW5jC!{r`1__y$?>tFdg?l*+U;R?g` zRUgsd0URw6JizyscW!5WYJ`64utY@(R5h?d9(vRYJXBY{LFVG@b5NmO)RbiEIHN8( zy@zz+f)aM*IGw3XHgbzl;{j67RL&}^!vUY(|Gn^j-=QaX(Aj3iuWy<&6Myv#@@R9? zSCfREPzv(XM)v4%Y=UWgZ8+B{(Iq>^*KH9P-LzD@kqH zT|}5P_gAtfcSLe~|M>RY2d40&3i(MgS(^O&cPBcyT~sQzg537~Q}v5oVU;rbx7O2j z1JL4><(9$Eot(}>#RR$bdX6LMDBH`^ND

+H24 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
9XSi{|^m@TV+%a97U!Bb)YX<|S(t0FAm| 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

FYo+EYQad%z-skBOL?h->jzzc%&JrW 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 literal 0 HcmV?d00001 diff --git a/runtime/hsa-ext-aql-profile/doc/HSA_ext_profile_api_v1_1_0.docx b/runtime/hsa-ext-aql-profile/doc/HSA_ext_profile_api_v1_1_0.docx new file mode 100644 index 0000000000000000000000000000000000000000..35ae8579aa58c4f611992ee51377e9864ee8b159 GIT binary patch literal 85960 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 literal 0 HcmV?d00001 diff --git a/runtime/hsa-ext-aql-profile/inc/amd_aql_pm4_ib_packet.h b/runtime/hsa-ext-aql-profile/inc/amd_aql_pm4_ib_packet.h new file mode 100644 index 0000000000..bd364593b3 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/inc/amd_aql_pm4_ib_packet.h @@ -0,0 +1,67 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 _AMD_AQL_PM4_IB_PACKET_H_ +#define _AMD_AQL_PM4_IB_PACKET_H_ + +// Value of 'pm4_ib_format' field of amd_aql_pm4_ib_packet_t packet +const static uint32_t AMD_AQL_PM4_IB_FORMAT = 1; +// Value of 'dw_count_remain' field of amd_aql_pm4_ib_packet_t packet +const static uint32_t AMD_AQL_PM4_IB_DW_COUNT_REMAIN = 10; +// Size of 'reserved' array of amd_aql_pm4_ib_packet_t packet +const static uint32_t AMD_AQL_PM4_IB_RESERVED_COUNT = 8; + +// AQL Vendor Specific Packet which carry PM4 IB command +typedef struct { + uint16_t header; + uint16_t pm4_ib_format; + uint32_t pm4_ib_command[4]; + uint32_t dw_count_remain; + uint32_t reserved[AMD_AQL_PM4_IB_RESERVED_COUNT]; + hsa_signal_t completion_signal; +} amd_aql_pm4_ib_packet_t; + +#endif // _AMD_AQL_PM4_IB_H_ diff --git a/runtime/hsa-ext-aql-profile/inc/hsa_ext_amd_aql_profile.h b/runtime/hsa-ext-aql-profile/inc/hsa_ext_amd_aql_profile.h new file mode 100644 index 0000000000..478b3cf1fb --- /dev/null +++ b/runtime/hsa-ext-aql-profile/inc/hsa_ext_amd_aql_profile.h @@ -0,0 +1,262 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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_SQGS, + HSA_EXT_AQL_PROFILE_BLOCK_SQVS, + HSA_EXT_AQL_PROFILE_BLOCK_SQPS, + 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_TCS, + HSA_EXT_AQL_PROFILE_BLOCK_WD, + 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 PM4 profiling packet size +const unsigned HSA_EXT_AQL_PROFILE_LEGACY_PM4_PACKET_SIZE = 64; +// Converting of the profiling AQL packet to PM4 packet, GFX8 support +hsa_status_t hsa_ext_amd_aql_profile_legacy_get_pm4( + const hsa_ext_amd_aql_pm4_packet_t* aql_packet, // AQL packet + void* pm4); // 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/runtime/hsa-ext-aql-profile/src/CMakeLists.txt b/runtime/hsa-ext-aql-profile/src/CMakeLists.txt new file mode 100644 index 0000000000..0c17919ed7 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/CMakeLists.txt @@ -0,0 +1,72 @@ +# +# Minimum version of cmake required +# +cmake_minimum_required ( VERSION 3.5.0 ) + +# +# Setup flag to be verbose or not +# +set ( CMAKE_VERBOSE_MAKEFILE TRUE CACHE BOOL "Verbose Output" FORCE ) + +# +# Set name for the project +# @note: Must come before adding any sub-directories +# +set ( TARGET_NAME "aqlprofile" ) +project ( ${TARGET_NAME} ) + +if ( NOT DEFINED PROJ_DIR ) + set ( PROJ_DIR ${CMAKE_CURRENT_SOURCE_DIR} ) + set ( ROOT_DIR ${PROJ_DIR}/.. ) +endif () + +set ( API_DIR ${ROOT_DIR}/inc ) +set ( HSA_RUNTIME_DIR ${PROJ_DIR}/../../.. ) +set ( HSA_RUNTIME_OSC_DIR ${HSA_RUNTIME_DIR}/opensrc/hsa-runtime ) +set ( CORE_UTIL_DIR ${HSA_RUNTIME_OSC_DIR}/core/util ) +include_directories ( ${ROOT_DIR} ) + +# +# Validate required build environment is setup correctly +# +include ( ${ROOT_DIR}/cmake_modules/validateBldEnv.cmake ) + +# +# Setup tool chain flags - preprocessor, compiler and linker +# +include ( ${ROOT_DIR}/cmake_modules/exportToolFlags.cmake ) + +# +# Set Name for Utils library and build it as a +# static library to be linked with others +# +set ( UTIL_LIB "util${ONLY64STR}" ) +add_subdirectory ( ${PROJ_DIR}/util "${PROJECT_BINARY_DIR}/util" ) + +# +# Set Name for Cmdwriter library and build it as a +# static library to be linked with others +# +set ( CMDWRITER_LIB "commandwriter${ONLY64STR}" ) +add_subdirectory ( ${PROJ_DIR}/commandwriter "${PROJECT_BINARY_DIR}/commandwriter" ) + +# +# Set Name for ThreadTrace library and build it as a +# static library to be linked with others +# +set ( SQTT_LIB "sqtt${ONLY64STR}" ) +add_subdirectory ( ${PROJ_DIR}/threadtrace "${PROJECT_BINARY_DIR}/threadtrace" ) + +# +# Set Name for Profiler library and build it as a +# static library to be linked with others +# +set ( PMC_LIB "pmc${ONLY64STR}" ) +add_subdirectory ( ${PROJ_DIR}/perfcounter "${PROJECT_BINARY_DIR}/perfcounter" ) + +# +# Build the library and link it with other static +# libraries that have been built in this regard +# +set ( TARGET_LIB "${TARGET_NAME}${ONLY64STR}" ) +add_subdirectory ( ${PROJ_DIR}/${TARGET_NAME} "${PROJECT_BINARY_DIR}/${TARGET_NAME}" ) diff --git a/runtime/hsa-ext-aql-profile/src/aqlprofile/CMakeLists.txt b/runtime/hsa-ext-aql-profile/src/aqlprofile/CMakeLists.txt new file mode 100644 index 0000000000..7bb981c8ae --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/aqlprofile/CMakeLists.txt @@ -0,0 +1,20 @@ +# +# Source files for Rocr Service Manager +# +set ( LIB_SRC aql_profile.cpp populate_aql.cpp gfx8_factory.cpp gfx9_factory.cpp ) + +# +# Header files include path(s). +# +include_directories ( $ENV{ROCR_INC_DIR} ) +include_directories ( ${PROJ_DIR}/perfcounter ) +include_directories ( ${PROJ_DIR}/threadtrace ) +include_directories ( ${PROJ_DIR}/commandwriter ) +include_directories ( ${API_DIR} ) + +# +# Build Service Manager as a dynamic Library object +# +set ( LIB_LIST ${PMC_LIB} ${SQTT_LIB} ${CMDWRITER_LIB} ${UTIL_LIB} ) +add_library ( ${TARGET_LIB} SHARED ${LIB_SRC} ) +target_link_libraries( ${TARGET_LIB} ${LIB_LIST} c stdc++ dl pthread rt ) diff --git a/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.cpp b/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.cpp new file mode 100644 index 0000000000..f06fb161b3 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.cpp @@ -0,0 +1,398 @@ +#include + +#include "aql_profile.h" +#include "pm4_factory.h" +#include "cmdwriter.h" // commandwriter +#include "hsa_perf.h" // perfcounter +#include "thread_trace.h" // threadtrace +#include "gpu_enum.h" +#include "gpu_blockinfo.h" + +#define PUBLIC_API __attribute__((visibility("default"))) + +namespace aql_profile { + +// Command buffer partitioning manager +// Supports Pre/Post commands partitioning +// and postfix control partition +class CommandBufferMgr { + const static uint32_t align_size = 0x100; + const static uint32_t align_mask = align_size - 1; + + struct info_t { + uint32_t precmds_size; + uint32_t postcmds_size; + }; + + descriptor_t buffer; + uint32_t postfix_size; + info_t* info; + + uint32_t align(const uint32_t& size) { return (size + align_mask) & ~align_mask; } + + public: + CommandBufferMgr(const profile_t* profile) + : buffer(profile->command_buffer), postfix_size(0), info(NULL) { + info = (info_t*)setPostfix(sizeof(info_t)); + } + + uint32_t getSize() { return buffer.size; } + + void* setPostfix(const uint32_t& size) { + if (size > postfix_size) { + const uint32_t delta = size - postfix_size; + postfix_size = size; + buffer.size -= (delta < buffer.size) ? delta : buffer.size; + } + 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; + return suc; + } + + uint32_t getPostOffset() { return align(info->precmds_size); } + + bool checkTotalSize(const uint32_t& size) { + bool suc = (size <= buffer.size); + if (suc) suc = (size >= info->precmds_size); + if (suc) { + info->postcmds_size = size - info->precmds_size; + suc = ((getPostOffset() + info->postcmds_size) <= buffer.size); + } + return suc; + } + + descriptor_t getPreDescr() { + descriptor_t descr; + descr.ptr = buffer.ptr; + descr.size = info->precmds_size; + return descr; + } + + descriptor_t getPostDescr() { + descriptor_t descr; + descr.ptr = buffer.ptr + getPostOffset(); + descr.size = info->postcmds_size; + return descr; + } +}; + +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, + void* callback_data) { + hsa_status_t status = HSA_STATUS_SUCCESS; + hsa_ext_amd_aql_profile_info_data_t* passed_data = + reinterpret_cast(callback_data); + + if (info_type == HSA_EXT_AQL_PROFILE_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; + } else if (passed_data->sample_id == info_data->sample_id) { + passed_data->pmc_data.result = info_data->pmc_data.result; + status = HSA_STATUS_INFO_BREAK; + } + } + } + + return status; +} + +struct sqtt_ctrl_t { + uint32_t status; + uint32_t counter; + 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, + void* callback_data) { + hsa_status_t status = HSA_STATUS_SUCCESS; + hsa_ext_amd_aql_profile_info_data_t* passed_data = + reinterpret_cast(callback_data); + + if (info_type == HSA_EXT_AQL_PROFILE_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; + } + } + + return status; +} + +} // 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) { + 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::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; + + pmcMgr->setPmcDataBuff((uint8_t*)profile->output_buffer.ptr, profile->output_buffer.size); + + for (const hsa_ext_amd_aql_profile_event_t* p = profile->events; + p < profile->events + profile->event_count; ++p) { + pm4_profile::CounterBlock* block = + pmcMgr->getCounterBlockById(pm4_factory->getBlockId(p)); + if (block == NULL) return HSA_STATUS_ERROR; + + pm4_profile::Counter* counter = block->createCounter(); + if (counter == NULL) return HSA_STATUS_ERROR; + + counter->setParameter(HSA_EXT_TOOLS_COUNTER_PARAMETER_EVENT_INDEX, sizeof(uint32_t), + &(p->counter_id)); + counter->setEnable(true); + } + + // Generate start commands + pmcMgr->begin(&commands, cmdWriter); + cmdBufMgr.setPreSize(commands.Size()); + // Generate stop commands + pmcMgr->end(&commands, cmdWriter); + } else if (profile->type == HSA_EXT_AQL_PROFILE_EVENT_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; + p < (profile->parameters + profile->parameter_count); ++p) { + switch (p->parameter_name) { + case HSA_EXT_AQL_PROFILE_PARAM_COMPUTE_UNIT_TARGET: + sqtt_config.threadTraceTargetCu = p->value; + break; + case HSA_EXT_AQL_PROFILE_PARAM_VM_ID_MASK: + sqtt_config.threadTraceVmIdMask = p->value; + break; + case HSA_EXT_AQL_PROFILE_PARAM_MASK: + sqtt_config.threadTraceMask = p->value; + break; + case HSA_EXT_AQL_PROFILE_PARAM_TOKEN_MASK: + sqtt_config.threadTraceTokenMask = p->value; + break; + case HSA_EXT_AQL_PROFILE_PARAM_TOKEN_MASK2: + sqtt_config.threadTraceTokenMask2 = p->value; + break; + default: + return HSA_STATUS_ERROR; + } + } + } + sqttMgr->Init(&sqtt_config); + + sqttMgr->setSqttDataBuff((uint8_t*)profile->output_buffer.ptr, profile->output_buffer.size); + + 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 + sqttMgr->BeginSession(&commands, cmdWriter); + cmdBufMgr.setPreSize(commands.Size()); + // Generate stop commands + sqttMgr->StopSession(&commands, cmdWriter); + } else + return HSA_STATUS_ERROR; + + if (!cmdBufMgr.checkTotalSize(commands.Size())) return HSA_STATUS_ERROR; + + const aql_profile::descriptor_t pre_descr = cmdBufMgr.getPreDescr(); + const aql_profile::descriptor_t post_descr = cmdBufMgr.getPostDescr(); + memcpy(pre_descr.ptr, commands.Base(), pre_descr.size); + memcpy(post_descr.ptr, commands.Base() + pre_descr.size, post_descr.size); + // Populate start aql packet + aql_profile::populateAql(pre_descr.ptr, pre_descr.size, cmdWriter, aql_start_packet); + + return HSA_STATUS_SUCCESS; +} + +// 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::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 + aql_profile::populateAql(post_descr.ptr, post_descr.size, cmdWriter, aql_stop_packet); + + return HSA_STATUS_SUCCESS; +} + +// Converting of the profiling AQL packet to PM4 packet, GFX8 support +PUBLIC_API hsa_status_t hsa_ext_amd_aql_profile_legacy_get_pm4( + const aql_profile::packet_t* aql_packet, void* pm4) { + return HSA_STATUS_ERROR; +} + +// 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_status_t status = HSA_STATUS_SUCCESS; + + switch (attribute) { + case HSA_EXT_AQL_PROFILE_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: + *(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); + break; + case HSA_EXT_AQL_PROFILE_INFO_SQTT_DATA: + status = hsa_ext_amd_aql_profile_iterate_data(profile, aql_profile::default_sqttdata_callback, + value); + break; + default: + status = HSA_STATUS_ERROR_INVALID_ARGUMENT; + } + + return status; +} + +// 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_status_t status = HSA_STATUS_SUCCESS; + 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) { + 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; + + for (const hsa_ext_amd_aql_profile_event_t* p = profile->events; + p < (profile->events + profile->event_count); ++p) { + pm4_profile::CounterBlock* block = + pmcMgr->getCounterBlockById(pm4_factory->getBlockId(p)); + if (block == NULL) return HSA_STATUS_ERROR; + if (!block->getInfo(pm4_profile::GPU_BLK_INFO_CONTROL_METHOD, info_size, &info_data)) { + return HSA_STATUS_ERROR; + } + const pm4_profile::CntlMethod method = + static_cast(*(static_cast(info_data))); + // A perfcounter data sample per ShaderEngine + const uint32_t block_samples_count = (method == pm4_profile::CntlMethodBySe || + method == pm4_profile::CntlMethodBySeAndInstance) + ? pmcMgr->getNumSe() + : 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; + + hsa_ext_amd_aql_profile_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); + if (status == HSA_STATUS_INFO_BREAK) { + status = HSA_STATUS_SUCCESS; + break; + } + if (status != HSA_STATUS_SUCCESS) break; + ++sample_index; + } + } + } else if (profile->type == HSA_EXT_AQL_PROFILE_EVENT_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 + 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; + + 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) { + return HSA_STATUS_ERROR; + } + // SQTT output buffer and capacity per ShaderEngine + void* sample_ptr = profile->output_buffer.ptr; + const uint32_t sample_capacity = profile->output_buffer.size / se_number; + // The samples sizes are returned in the control buffer + for (int i = 0; i < se_number; ++i) { + // WPTR specifies the index in thread trace buffer where next token will be + // 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; + 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); + if (status == HSA_STATUS_INFO_BREAK) { + status = HSA_STATUS_SUCCESS; + break; + } + if (status != HSA_STATUS_SUCCESS) break; + + sample_ptr += sample_capacity; + } + } else { + status = HSA_STATUS_ERROR; + } + + return status; +} +} diff --git a/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.h b/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.h new file mode 100644 index 0000000000..b51d754001 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/aqlprofile/aql_profile.h @@ -0,0 +1,23 @@ +#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(void* cmdBuffer, uint32_t cmdSz, pm4_profile::CommandWriter* cmdWriter, + packet_t* aqlPkt); +} + +#endif // _AQL_PROFILE_H_ diff --git a/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx8_factory.cpp b/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx8_factory.cpp new file mode 100644 index 0000000000..8327134478 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx8_factory.cpp @@ -0,0 +1,43 @@ +#include "pm4_factory.h" +// Commandwriter includes +#include "gfx8_cmdwriter.h" +// PMC includes +#include "vi_pmu.h" +// SQTT includes +#include "gfx8_thread_trace.h" + +namespace aql_profile { + +// GFX9 block ID mapping table +uint32_t Gfx8Factory::block_id_table[HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER] = { + pm4_profile::kHsaViCounterBlockIdCb0, pm4_profile::kHsaViCounterBlockIdCpf, + pm4_profile::kHsaViCounterBlockIdDb0, pm4_profile::kHsaViCounterBlockIdGrbm, + pm4_profile::kHsaViCounterBlockIdGrbmSe, pm4_profile::kHsaViCounterBlockIdPaSu, + pm4_profile::kHsaViCounterBlockIdPaSc, pm4_profile::kHsaViCounterBlockIdSpi, + pm4_profile::kHsaViCounterBlockIdSq, pm4_profile::kHsaViCounterBlockIdSqGs, + pm4_profile::kHsaViCounterBlockIdSqVs, pm4_profile::kHsaViCounterBlockIdSqPs, + pm4_profile::kHsaViCounterBlockIdSqHs, pm4_profile::kHsaViCounterBlockIdSqCs, + pm4_profile::kHsaViCounterBlockIdSx, pm4_profile::kHsaViCounterBlockIdTa0, + pm4_profile::kHsaViCounterBlockIdTca0, pm4_profile::kHsaViCounterBlockIdTcc0, + pm4_profile::kHsaViCounterBlockIdTd0, pm4_profile::kHsaViCounterBlockIdTcp0, + pm4_profile::kHsaViCounterBlockIdGds, pm4_profile::kHsaViCounterBlockIdVgt, + pm4_profile::kHsaViCounterBlockIdIa, pm4_profile::kHsaViCounterBlockIdMc, + pm4_profile::kHsaViCounterBlockIdTcs, pm4_profile::kHsaViCounterBlockIdWd}; + +pm4_profile::CommandWriter * Gfx8Factory::getCommandWriter() { + return new pm4_profile::gfx8::Gfx8CmdWriter(false, true); +} + +pm4_profile::Pmu * Gfx8Factory::getPmcMgr() { + return new pm4_profile::ViPmu(); +} + +pm4_profile::ThreadTrace * Gfx8Factory::getSqttMgr() { + return new pm4_profile::Gfx8ThreadTrace(); +} + +uint32_t Gfx8Factory::getBlockId(const event_t* event) { + return block_id_table[event->block_name] + event->block_index; +} + +} // aql_profile diff --git a/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx8_pm4_factory.cpp b/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx8_pm4_factory.cpp new file mode 100644 index 0000000000..3bba202f54 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx8_pm4_factory.cpp @@ -0,0 +1,70 @@ +#include "pm4_factory.h" +// Commandwriter includes +#include "gfx8_cmdwriter.h" +#include "gfx9_cmdwriter.h" +// PMC includes +#include "vi_pmu.h" +#include "ai_pmu.h" +// SQTT includes +#include "gfx8_thread_trace.h" +#include "gfx9_thread_trace.h" + +namespace aql_profile { + +// GFX8 block ID mapping table +uint32_t gfx8_block_id_table[HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER] = { + pm4_profile::kHsaViCounterBlockIdCb0, pm4_profile::kHsaViCounterBlockIdCpf, + pm4_profile::kHsaViCounterBlockIdDb0, pm4_profile::kHsaViCounterBlockIdGrbm, + pm4_profile::kHsaViCounterBlockIdGrbmSe, pm4_profile::kHsaViCounterBlockIdPaSu, + pm4_profile::kHsaViCounterBlockIdPaSc, pm4_profile::kHsaViCounterBlockIdSpi, + pm4_profile::kHsaViCounterBlockIdSq, pm4_profile::kHsaViCounterBlockIdSqGs, + pm4_profile::kHsaViCounterBlockIdSqVs, pm4_profile::kHsaViCounterBlockIdSqPs, + pm4_profile::kHsaViCounterBlockIdSqHs, pm4_profile::kHsaViCounterBlockIdSqCs, + pm4_profile::kHsaViCounterBlockIdSx, pm4_profile::kHsaViCounterBlockIdTa0, + pm4_profile::kHsaViCounterBlockIdTca0, pm4_profile::kHsaViCounterBlockIdTcc0, + pm4_profile::kHsaViCounterBlockIdTd0, pm4_profile::kHsaViCounterBlockIdTcp0, + pm4_profile::kHsaViCounterBlockIdGds, pm4_profile::kHsaViCounterBlockIdVgt, + pm4_profile::kHsaViCounterBlockIdIa, pm4_profile::kHsaViCounterBlockIdMc, + pm4_profile::kHsaViCounterBlockIdTcs, pm4_profile::kHsaViCounterBlockIdWd}; + +// GFX9 block ID mapping table +uint32_t gfx9_block_id_table[HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER] = { + pm4_profile::kHsaAiCounterBlockIdCb0, pm4_profile::kHsaAiCounterBlockIdCpf, + pm4_profile::kHsaAiCounterBlockIdDb0, pm4_profile::kHsaAiCounterBlockIdGrbm, + pm4_profile::kHsaAiCounterBlockIdGrbmSe, pm4_profile::kHsaAiCounterBlockIdPaSu, + pm4_profile::kHsaAiCounterBlockIdPaSc, pm4_profile::kHsaAiCounterBlockIdSpi, + pm4_profile::kHsaAiCounterBlockIdSq, pm4_profile::kHsaAiCounterBlockIdSqGs, + pm4_profile::kHsaAiCounterBlockIdSqVs, pm4_profile::kHsaAiCounterBlockIdSqPs, + pm4_profile::kHsaAiCounterBlockIdSqHs, pm4_profile::kHsaAiCounterBlockIdSqCs, + pm4_profile::kHsaAiCounterBlockIdSx, pm4_profile::kHsaAiCounterBlockIdTa0, + pm4_profile::kHsaAiCounterBlockIdTca0, pm4_profile::kHsaAiCounterBlockIdTcc0, + pm4_profile::kHsaAiCounterBlockIdTd0, pm4_profile::kHsaAiCounterBlockIdTcp0, + pm4_profile::kHsaAiCounterBlockIdGds, pm4_profile::kHsaAiCounterBlockIdVgt, + pm4_profile::kHsaAiCounterBlockIdIa, pm4_profile::kHsaAiCounterBlockIdMc, + pm4_profile::kHsaAiCounterBlockIdTcs, pm4_profile::kHsaAiCounterBlockIdWd}; + +pm4_profile::CommandWriter * Pm4Factory::getCommandWriter() { + return (is_gfx9 == true) ? + new pm4_profile::gfx9::Gfx9CmdWriter(false, true) : + new pm4_profile::gfx8::Gfx8CmdWriter(false, true); +} + +pm4_profile::Pmu * Pm4Factory::getPmcMgr() { + return (is_gfx9 == true) ? + new pm4_profile::AiPmu() : + new pm4_profile::ViPmu(); +} + +pm4_profile::ThreadTrace * Pm4Factory::getSqttMgr() { + return (is_gfx9 == true) ? + new pm4_profile::Gfx9ThreadTrace() : + new pm4_profile::Gfx8ThreadTrace(); +} + +uint32_t Pm4Factory::getBlockId(const event_t* event) { + return (is_gfx9 == true) ? + gfx9_block_id_table[event->block_name] + event->block_index : + gfx8_block_id_table[event->block_name] + event->block_index : +} + +} // aql_profile diff --git a/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx9_factory.cpp b/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx9_factory.cpp new file mode 100644 index 0000000000..6909eb3d63 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/aqlprofile/gfx9_factory.cpp @@ -0,0 +1,43 @@ +#include "pm4_factory.h" +// Commandwriter includes +#include "gfx9_cmdwriter.h" +// PMC includes +#include "ai_pmu.h" +// SQTT includes +#include "gfx9_thread_trace.h" + +namespace aql_profile { + +// GFX9 block ID mapping table +uint32_t Gfx9Factory::block_id_table[HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER] = { + pm4_profile::kHsaAiCounterBlockIdCb0, pm4_profile::kHsaAiCounterBlockIdCpf, + pm4_profile::kHsaAiCounterBlockIdDb0, pm4_profile::kHsaAiCounterBlockIdGrbm, + pm4_profile::kHsaAiCounterBlockIdGrbmSe, pm4_profile::kHsaAiCounterBlockIdPaSu, + pm4_profile::kHsaAiCounterBlockIdPaSc, pm4_profile::kHsaAiCounterBlockIdSpi, + pm4_profile::kHsaAiCounterBlockIdSq, pm4_profile::kHsaAiCounterBlockIdSqGs, + pm4_profile::kHsaAiCounterBlockIdSqVs, pm4_profile::kHsaAiCounterBlockIdSqPs, + pm4_profile::kHsaAiCounterBlockIdSqHs, pm4_profile::kHsaAiCounterBlockIdSqCs, + pm4_profile::kHsaAiCounterBlockIdSx, pm4_profile::kHsaAiCounterBlockIdTa0, + pm4_profile::kHsaAiCounterBlockIdTca0, pm4_profile::kHsaAiCounterBlockIdTcc0, + pm4_profile::kHsaAiCounterBlockIdTd0, pm4_profile::kHsaAiCounterBlockIdTcp0, + pm4_profile::kHsaAiCounterBlockIdGds, pm4_profile::kHsaAiCounterBlockIdVgt, + pm4_profile::kHsaAiCounterBlockIdIa, pm4_profile::kHsaAiCounterBlockIdMc, + pm4_profile::kHsaAiCounterBlockIdTcs, pm4_profile::kHsaAiCounterBlockIdWd}; + +pm4_profile::CommandWriter * Gfx9Factory::getCommandWriter() { + return new pm4_profile::gfx9::Gfx9CmdWriter(false, true); +} + +pm4_profile::Pmu * Gfx9Factory::getPmcMgr() { + return new pm4_profile::AiPmu(); +} + +pm4_profile::ThreadTrace * Gfx9Factory::getSqttMgr() { + return new pm4_profile::Gfx9ThreadTrace(); +} + +uint32_t Gfx9Factory::getBlockId(const event_t* event) { + return block_id_table[event->block_name] + event->block_index; +} + +} // aql_profile diff --git a/runtime/hsa-ext-aql-profile/src/aqlprofile/pm4_factory.h b/runtime/hsa-ext-aql-profile/src/aqlprofile/pm4_factory.h new file mode 100644 index 0000000000..53889f9033 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/aqlprofile/pm4_factory.h @@ -0,0 +1,62 @@ +#ifndef _PM4_FACTORY_H_ +#define _PM4_FACTORY_H_ + +#include +#include + +#include "aql_profile.h" + +namespace pm4_profile { +class CommandWriter; +class Pmu; +class ThreadTrace; +} + +namespace aql_profile { + +class Pm4Factory { + public: + 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; + virtual uint32_t getBlockId(const event_t* event) = 0; +}; + +class Gfx8Factory : public Pm4Factory { + public: + pm4_profile::CommandWriter* getCommandWriter(); + pm4_profile::Pmu* getPmcMgr(); + pm4_profile::ThreadTrace* getSqttMgr(); + uint32_t getBlockId(const event_t* event); + + private: + static uint32_t block_id_table[HSA_EXT_AQL_PROFILE_BLOCKS_NUMBER]; +}; + +class Gfx9Factory : public Pm4Factory { + public: + pm4_profile::CommandWriter* getCommandWriter(); + pm4_profile::Pmu* getPmcMgr(); + pm4_profile::ThreadTrace* getSqttMgr(); + uint32_t getBlockId(const event_t* event); + + 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, "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/runtime/hsa-ext-aql-profile/src/aqlprofile/populate_aql.cpp b/runtime/hsa-ext-aql-profile/src/aqlprofile/populate_aql.cpp new file mode 100644 index 0000000000..aa3da9f463 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/aqlprofile/populate_aql.cpp @@ -0,0 +1,41 @@ +#include +#include + +#include "aql_profile.h" +#include "cmdwriter.h" +#include "amd_aql_pm4_ib_packet.h" + +namespace aql_profile { + +void populateAql(uint32_t* ib_packet, packet_t* aql_packet) { + // Populate relevant fields of Aql pkt + // Size of IB pkt is four DWords + // Header and completion sinal are not set + amd_aql_pm4_ib_packet_t* aql_pm4_ib = reinterpret_cast(aql_packet); + aql_pm4_ib->pm4_ib_format = AMD_AQL_PM4_IB_FORMAT; + aql_pm4_ib->pm4_ib_command[0] = ib_packet[0]; + aql_pm4_ib->pm4_ib_command[1] = ib_packet[1]; + aql_pm4_ib->pm4_ib_command[2] = ib_packet[2]; + aql_pm4_ib->pm4_ib_command[3] = ib_packet[3]; + aql_pm4_ib->dw_count_remain = AMD_AQL_PM4_IB_DW_COUNT_REMAIN; + for (int i = 0; i < AMD_AQL_PM4_IB_RESERVED_COUNT; ++i) { + aql_pm4_ib->reserved[i] = 0; + } + + uint32_t* words = (uint32_t*)aql_packet; + std::clog << std::setw(40) << std::left << "AQL 'IB' size(16)" + << ":"; + for (int idx = 0; idx < 16; idx++) { + std::clog << " " << std::hex << std::setw(8) << std::setfill('0') << words[idx]; + } + std::clog << std::setfill(' ') << std::endl; +} + +void populateAql(void* cmd_buffer, uint32_t cmd_size, + pm4_profile::CommandWriter* cmd_writer, packet_t* ppt_packet) { + pm4_profile::DefaultCmdBuf ib_buffer; + cmd_writer->BuildIndirectBufferCmd(&ib_buffer, cmd_buffer, (size_t)cmd_size); + uint32_t* ib_cmds = (uint32_t*)ib_buffer.Base(); + populateAql(ib_cmds, ppt_packet); +} +} diff --git a/runtime/hsa-ext-aql-profile/src/commandwriter/CMakeLists.txt b/runtime/hsa-ext-aql-profile/src/commandwriter/CMakeLists.txt new file mode 100644 index 0000000000..0e127d718c --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/commandwriter/CMakeLists.txt @@ -0,0 +1,15 @@ +# +# Source files for Rocr Cmdwriter +# +set ( CmdWriterSrcs gfx8_cmdwriter.cpp ) +set ( CmdWriterSrcs ${CmdWriterSrcs} gfx9_cmdwriter.cpp ) + +# +# Header files include path(s). +# +include_directories ( $ENV{ROCR_INC_DIR} ) + +# +# Build Cmdwriter as a Static Library object +# +add_library ( ${CMDWRITER_LIB} STATIC ${CmdWriterSrcs} ) diff --git a/runtime/hsa-ext-aql-profile/src/commandwriter/cmdwriter.h b/runtime/hsa-ext-aql-profile/src/commandwriter/cmdwriter.h new file mode 100644 index 0000000000..20554d81a3 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/commandwriter/cmdwriter.h @@ -0,0 +1,515 @@ +// cmdwriter.h +// Header file for CommandWriter and CmdBuf interfaces + +#ifndef _CMDWRITER_H_ +#define _CMDWRITER_H_ + +#include +#include +#include +#include + +namespace pm4_profile { + +// User defined options for flusing cache +typedef struct FlushCacheOptions_ { + bool l1, l2; + bool icache, kcache; + bool l1_vol, l2_vol, kcache_vol; + FlushCacheOptions_() { + l1 = l2 = icache = kcache = false; + l1_vol = l2_vol = kcache_vol = false; + }; +} FlushCacheOptions; + +/// @brief Interface to build a list of Gpu commands into a byte +/// buffer. Classes implementing this interface are used to translate +/// various Gpu commands as byte stream. +/// +/// @note: The Api does not require implementations to be thread safe. +/// Users are therefore required to be access in a serialized manner. +class CmdBuf { + public: + /// Default destructor. + virtual ~CmdBuf() {} + + /// @brief Resets the command buffer object. All of the commands + /// previously packed into the buffer are lost i.e. the number of + /// bytes in command stream is reset. + /// + /// @note: This convenience Api is provided to allow reuse of the + /// command buffer object. + /// + /// @return bool true if successful, false otherwise. + virtual bool Reset(void) = 0; + + /// @brief Appends input command into a buffer that could + /// be queried for its size and other properties. The append + /// does not verify the contents. + /// + /// @param cmd Buffer containing one or more instances of Gpu commands + /// + /// @param size size of the Gpu commands in bytes. + /// + /// @return void + virtual void AppendCommand(const void* cmd, uint32_t size) = 0; + + /// @brief Returns the total size (in bytes) of the accumulated commands. + /// + /// @return size_t size of Gpu commands in bytes + virtual size_t Size() const = 0; + + private: + /// Indexes the command buffer by dwords. Allows accessing constants + /// in an assembled command buffer. + virtual uint32_t& operator[](size_t index) = 0; + + friend class CommandWriter; +}; + +/// @brief Implements the interface CmdBuf and thus can be used to +/// translate various Gpu commands as byte stream. +/// +/// @note: The Api does not require implementations to be thread safe. +/// Users are therefore required to be access in a serialized manner. +class DefaultCmdBuf : public CmdBuf { + public: + /// @brief Append the command into the underlying buffer + /// + /// @param cmd Buffer containing one or more instances of Gpu commands + /// + /// @param size Size of Gpu command(s) in bytes + /// + /// @retur void + virtual void AppendCommand(const void* cmd, uint32_t size) { + memcpy(ReserveCmdbufSpace(size), cmd, size); + } + + /// @brief Resets the Gpu command buffer + bool Reset() { + cmdbuf_.clear(); + return true; + } + + /// Size of Gpu commands in bytes in the underlying buffer + size_t Size() const { return cmdbuf_.size() * sizeof(StorageType); } + + /// Address of the start of accumulated commands. + const void* Base() const { return &cmdbuf_[0]; } + + private: + /// @brief Returns reference to the value of Gpu command buffer + /// at specified index + /// + /// @param index Specifies the buffer index whose value is needed + /// + /// @return uint32_t & Reference of the value being returned + uint32_t& operator[](size_t index) { return cmdbuf_[index]; } + + /// @brief Increase Gpu command buffer by specified size + /// + /// @param size Size in bytes by which command buffer should + /// be resized. + /// + /// @return void * Pointer into the buffer where the next + /// command can be written + void* ReserveCmdbufSpace(std::size_t size) { + const size_t len = cmdbuf_.size(); + cmdbuf_.resize(len + size / sizeof(StorageType)); + return &cmdbuf_[len]; + } + + /// @brief Defines Gpu command buffer as a vector of StorageType + typedef uint32_t StorageType; + std::vector cmdbuf_; +}; + +/// @brief Specifies the public interface of CommandWriter for use by +/// clients to build Gpu command streams. +class CommandWriter { + public: + /// @brief These enums specify the operation to perform in the packet + /// generated by BuildAtomicPacket. The commenting for each enum uses + /// the arguments to the function BuildAtomicPacket to express the + /// resulting operation. + enum AtomicType { + + /// *destination = *destination + 1; + kAtomicTypeIncrement, + + /// *destination = *destination - 1; + kAtomicTypeDecrement, + + /// if (*destination == compare) *destination = value; + kAtomicTypeCompareAndSwap, + + /// while (*destination != compare); + /// *destination = value; + kAtomicTypeBlockingCompareAndSwap, + + /// *destination = *destination + value; + kAtomicAdd, + + /// *destination = *destination - value; + kAtomicSubtract, + + /// *destination = value; + kAtomicSwap + }; + + /// @brief These enums specify the VGT EVENT TYPE to issue and wait for. + /// Command Processor (CP) uses these events to communicate with SPI to + /// learn about outstanding waves and determine kernel completion. + enum VgtEventType { + + /// Enable Performance Counters + kPerfCntrsStart, + + /// Disable Performance Counters + kPerfCntrsStop, + + /// Read Performance Counters + kPerfCntrsSample, + + /// Enable a Thread Trace session + kThrdTraceStart, + + /// Disable a Thread Trace session + kThrdTraceStop, + + /// Enable flushing of thread trace buffers + kThrdTraceFlush, + + /// Enables resetting of BASE register to its last value + /// including flushing of thread trace buffers. This could + /// be used to toggle between two buffers so as to allow + /// collection of large token data + kThrdTraceFinish + }; + + /// @brief Returns the Dword that encodes a No-Op for the CP + /// + /// @return uint32_t Dword that can be used to populate a Pm4 + /// command queue. + /// + virtual uint32_t GetNoOpCmd() = 0; + + /// @brief Build an instance of Barrier command and copy it into + /// the input commmand buffer + /// + /// @param cmdbuf Pointer to command buffer which is updated with + /// an instance of Barrier command. + /// + /// @return void + virtual void BuildBarrierCommand(CmdBuf* cmdbuf) = 0; + + /// @brief Builds the Gpu command to reference indirectly a stream + /// of other Gpu commands. The launch command is then copied into + /// the command buffer parameter. + /// + /// @param cmdBuf command buffer to be appended with launch command + /// + /// @param cmd_addr Address of command buffer carrying command stream + /// + /// @param cmd_size Size of dispatch command stream in bytes + /// + /// @return void + virtual void BuildIndirectBufferCmd(CmdBuf* cmdbuf, const void* cmd_addr, + std::size_t cmd_size) = 0; + + /// @brief Build a Gpu command that triggers an event whose type + /// is specified by input parameter. It then copies it into the input + /// command buffer + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// + /// @param event Id of Event to be triggered by Gpu + /// + /// @return void + virtual void BuildWriteEventPacket(CmdBuf* cmdbuf, uint32_t event) = 0; + + /// @bried Builds a Gpu command to wait until condition is realized + /// + /// @param cmdbuf command buffer to be appended with launch command + /// + /// @param mem_space if the address is in memory or is a register offset + /// + /// @param wait_addr address to wait on + /// + /// @param func_eq true means equal, false means not-equal + /// + /// @param mask_val Mask to apply on value from addr in comparison + /// + /// @param wait_val value to apply for the func given above + virtual void BuildWaitRegMemCommand(CmdBuf* cmdbuf, bool mem_space, uint64_t wait_addr, + bool func_eq, uint32_t mask_val, uint32_t wait_val) = 0; + + virtual void BuildUpdateHostAddress(CmdBuf* cmdbuf, uint64_t* addr, int64_t value) = 0; + + /// @brief Build CP command to program a Gpu register + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// @param addr Register to be programmed + /// @param value Value to write into register + /// + /// @return void + virtual void BuildWriteUConfigRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value) = 0; + + /// @brief Build and copy WriteShReg command + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// + /// @param addr Offset of the register + /// + /// @param value Value to write into register + /// + /// @return void + virtual void BuildWriteShRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value) = 0; + + /// @brief Builds a Gpu command to flush Gpu caches and write a + /// user defined value at a configurable location that is Gpu + /// accessible. + /// + /// @param cmdBuf Command buffer to be appended with bottom of pipe + /// notification command + /// + /// @param write_addr Address into which Gpu should write + /// + /// @param write_val Value to write into user provided address + /// + /// @param interrupt True if Gpu should raise an interrupt upon writing + /// the user value + /// + /// @return void + virtual void BuildBOPNotifyCmd(CmdBuf* cmdbuf, const void* write_addr, uint32_t write_val, + bool intrpt) = 0; + + + /// @brief Build a Gpu command that copies data from a specified + /// source to destination + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// + /// @param reg_to_mem flag to indicate if values are being read from a + /// Register or a memory location + /// + /// @param src_addr_lo Low 32-bit Source address of the data to read from + /// + /// @param src_addr_hi High 32-bit Source address of the data to read from + /// + /// @param dst_addr Destination address for the data to be written to + /// + /// @param size Size of the data to be written + /// + /// @param wait True if Gpu command should confirm the write operation + /// operation has completed successfully + /// + /// @return void + /// + /// @NOTE Change interface to use void* for Src and void* for Dest + virtual void BuildCopyDataPacket(CmdBuf* cmdbuf, uint32_t src_sel, uint32_t src_addr_lo, + uint32_t src_addr_hi, uint32_t* dst_addr, uint32_t size, + bool wait) = 0; + + /// @brief Build and copy a WaitIdle Gpu command into command buffer + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// + /// @return void + virtual void BuildWriteWaitIdlePacket(CmdBuf* cmdbuf) = 0; + + // Will issue a VGT event including a cache flush later on + virtual void BuildVgtEventPacket(CmdBuf* cmdbuf, uint32_t vgtEvent) = 0; + + /// @brief Build and copy a WriteRegister Gpu command into command buffer + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// + /// @param addr Register into which to write + /// + /// @param value Value to write into register + /// + /// @return void + virtual void BuildWriteRegisterPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value) = 0; + + /// @brief Build and copy a Gpu command to query the status of a + /// WriteEvent into command buffer + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// + /// @param event Id of Event whose status is to be queried + /// + /// @param addr Address to update the status of WriteEvent operation + /// + /// @return void + virtual void BuildWriteEventQueryPacket(CmdBuf* cmdBuf, uint32_t event, uint32_t* addr) = 0; + + /// @brief Builds and copies a Gpu comamnd to peform user specified + /// operation atomically. The various atomic operations on integers + /// that are supported include: increment, decrement, add, subtract, + /// compare-and-swap and swap. The operation to perform is specified + /// by the enum AtomicType. + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// + /// @param atomic_op Id of the atomic operation to perform + /// + /// @param addr Pointer to the memory block where atomic operation + /// would be performed + /// + /// @param value New value to write if atomic operation can be performed + /// + /// @param compare Value to compare if atomic operation is a compare-and-swap + /// + /// @return void + virtual void BuildAtomicPacket(CmdBuf* cmdbuf, AtomicType atomic_op, volatile uint32_t* addr, + uint32_t value = 0, uint32_t compare = 0) = 0; + + /// @brief Builds and copies a Gpu comamnd to peform user specified + /// operation atomically. The various atomic operations on integers + /// that are supported include: increment, decrement, add, subtract, + /// compare-and-swap and swap. The operation to perform is specified + /// by the enum AtomicType. + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// + /// @param atomic_op Id of the atomic operation to perform + /// + /// @param addr Pointer to the memory block where atomic operation + /// would be performed + /// + /// @param value New value to write if atomic operation can be performed + /// + /// @param compare Value to compare if atomic operation is a compare-and-swap + /// + /// @return void + virtual void BuildAtomicPacket64(CmdBuf* cmdbuf, AtomicType atomic_op, volatile uint64_t* addr, + uint64_t value = 0, uint64_t compare = 0) = 0; + + /// @brief Returns the size of an atomic packet + /// + /// @return size_t Size of atomic packet + virtual size_t SizeOfAtomicPacket() const = 0; + + /// @brief Build and copy a Gpu command that will tell command processor + /// to conditionally execute or skip the next sequence of packets. + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// + /// @param signal Pointer to an integer that tells the command processor + /// whether to skip or execute the next block of packets. If it is set + /// to 0 the following packets will be skipped, else it will execute the + /// following packets + /// + /// @param count The number of dwords in the following packet stream + /// that will be conditionally executed + /// + /// @return void + virtual void BuildConditionalExecute(CmdBuf* cmdbuf, uint32_t* signal, uint16_t count) = 0; + + /// @brief Builds a CP command to write user specified value + /// at a user specified address. The command is then copied + /// into the command buffer for submission to a device queue. + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// + /// @param write_addr Address into which CP will write the user + /// specified value + /// + /// @param write_value Value to write into the user specified address + /// + /// @return void + virtual void BuildWriteDataCommand(CmdBuf* cmdbuf, uint32_t* write_addr, + uint32_t write_value) = 0; + + /// @brief Builds a CP command to write user specified value + /// at a user specified address. The command is then copied + /// into the command buffer for submission to a device queue. + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// + /// @param write_addr Address into which CP will write the user + /// specified value + /// + /// @param write_value Value to write into the user specified address + /// + /// @return void + virtual void BuildWriteData64Command(CmdBuf* cmdbuf, uint64_t* write_addr, + uint64_t write_value) = 0; + + /// Writes into input buffer Gpu commands to flush its cache. It is + /// necessary that the buffer provided for flush commands is large + /// enough to accommodate the full set of commands. It should be at + /// least 512 bytes. + /// + /// @param tsCmdBuf Buffer to write commands to. + /// @param writeAddr Registered address into which GPU should write + /// a user provided value upon executing the flush commands. + /// @param writeVal User provided value written by GPU at user provided + /// address, upon executing the flush commands. + /// + /// @return void + virtual void BuildFlushCacheCmd(CmdBuf* cmdbuf, FlushCacheOptions* options, uint32_t* writeAddr, + uint32_t writeVal) = 0; + + /// @brief Builds Gpu command to copy data from source to destination + /// buffer using DMA engine. + /// + /// @param cmdbuf Buffer updated with Gpu copy command + /// @param srcAddr Address of source buffer address + /// @param dstAddr Address of destination buffer address + /// @param copySize Size of data to copy in bytes + /// @param waitForCompletion if command should wait for copying to complete + virtual void BuildDmaDataPacket(CmdBuf* cmdbuf, uint32_t* srcAddrLo, uint32_t* dstAddr, + uint32_t copySize, bool waitForCompletion) = 0; + + /// @brief Release resources used by CommandWriter + virtual ~CommandWriter(){}; + + protected: + /// @brief Return the reference to a value in the command buffer + uint32_t& IndexBuffer(CmdBuf* cmdbuf, uint32_t index) { return (*cmdbuf)[index]; } +}; + +/// @brief Returns the Rounded value per input rounding factor +inline uint32_t RoundUp(uint32_t u, uint32_t r) { return ((u + (r - 1)) & ~(r - 1)); } + +/// @brief Returns the lower 32-bits of a value +inline uint32_t Low32(uint64_t u) { return (u & 0xFFFFFFFFUL); } + +/// @brief Returns the upper 32-bits of a value +inline uint32_t High32(uint64_t u) { return (u >> 32); } + +/// @brief Returns the lower 32-bits of an address +inline uint32_t Ptr48Low32(const void* p) { + uintptr_t ptr = reinterpret_cast(p); + assert((ptr & 0xFFFFFFFFFF00ULL) == ptr); + return (uint32_t)((ptr & 0xFFFFFFFFFFULL) >> 8); +} + +/// @brief Returns the upper 8-bits of an address +inline uint8_t Ptr48High8(const void* p) { + uintptr_t ptr = reinterpret_cast(p); + return (uint8_t)((ptr & 0xFF0000000000ULL) >> 40); +} + +/// @brief Returns the lower 32-bits of an address +inline uint32_t PtrLow32(const void* p) { + return static_cast(reinterpret_cast(p)); +} + +/// @brief Returns the upper 32-bits of an address +inline uint32_t PtrHigh32(const void* p) { + uint32_t hi_32 = 0; +#ifdef HSA_LARGE_MODEL + hi_32 = static_cast(reinterpret_cast(p) >> 32); + static_assert(sizeof(void*) == 8, "HSA_LARGE_MODEL is not set properly here!"); +#else + static_assert(sizeof(void*) == 4, "HSA_LARGE_MODEL is not set properly here!"); +#endif + return hi_32; +} + +} // pm4_profile + +#endif // _CMDWRITER_H_ diff --git a/runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmds.h b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmds.h new file mode 100644 index 0000000000..2db962c03b --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmds.h @@ -0,0 +1,161 @@ +#ifndef _GFX8_CMDS_H_ +#define _GFX8_CMDS_H_ + +#include "gfxip/gfx8/si_ci_vi_merged_enum.h" +#include "gfxip/gfx8/si_ci_vi_merged_mask.h" +#include "gfxip/gfx8/si_ci_vi_merged_offset.h" +#include "gfxip/gfx8/si_ci_vi_merged_registers.h" +#include "gfxip/gfx8/si_ci_vi_merged_typedef.h" +#include "gfxip/gfx8/si_ci_vi_merged_pm4_it_opcodes.h" +#include "gfxip/gfx8/si_pm4defs.h" + +namespace pm4_profile { + +namespace gfx8 { + +// Desc: Defines the Gpu command to dispatch a kernel. It embeds +// various Gpu hardware specific data structures for initialization +// and configuration before a dispatch begins to run +struct DispatchTemplate { + // Desc: Structure used to initialize the group dimensions + // of a kernel dispatch and if performance counters are enabled + struct DispatchDimensionRegs { + PM4CMDSETDATA cmd_set_data; + regCOMPUTE_START_X compute_start_x; + regCOMPUTE_START_Y compute_start_y; + regCOMPUTE_START_Z compute_start_z; + regCOMPUTE_NUM_THREAD_X compute_num_thread_x; + regCOMPUTE_NUM_THREAD_Y compute_num_thread_y; + regCOMPUTE_NUM_THREAD_Z compute_num_thread_z; + regCOMPUTE_PIPELINESTAT_ENABLE__CI__VI compute_pipelinestat_enable; + } dimension_regs; + + // Desc: Structure used to initialize kernel Isa, trap + // handler, trap handler buffer, number of SGPR and VGPR + // registers needed, amount of Group memory and LDS needed, + // Rounding mode for Floating point numbers, etc. + struct DispatchProgramRegs { + PM4CMDSETDATA cmd_set_data; + regCOMPUTE_PGM_LO compute_pgm_lo; + regCOMPUTE_PGM_HI compute_pgm_hi; + regCOMPUTE_TBA_LO compute_tba_lo; + regCOMPUTE_TBA_HI compute_tba_hi; + regCOMPUTE_TMA_LO compute_tma_lo; + regCOMPUTE_TMA_HI compute_tma_hi; + regCOMPUTE_PGM_RSRC1 compute_pgm_rsrc1; + regCOMPUTE_PGM_RSRC2 compute_pgm_rsrc2; + } program_regs; + + // Desc: Structure used to initialize parameters related to + // thread management i.e. number of waves to issue and number + // of Compute Units to use + struct DispatchResourceRegs { + PM4CMDSETDATA cmd_set_data; + regCOMPUTE_RESOURCE_LIMITS compute_resource_limits; + regCOMPUTE_STATIC_THREAD_MGMT_SE0 compute_static_thread_mgmt_se0; + regCOMPUTE_STATIC_THREAD_MGMT_SE1 compute_static_thread_mgmt_se1; + regCOMPUTE_TMPRING_SIZE compute_tmpring_size; + regCOMPUTE_STATIC_THREAD_MGMT_SE2__CI__VI compute_static_thread_mgmt_se2; + regCOMPUTE_STATIC_THREAD_MGMT_SE3__CI__VI compute_static_thread_mgmt_se3; + regCOMPUTE_RESTART_X__CI__VI compute_restart_x; + regCOMPUTE_RESTART_Y__CI__VI compute_restart_y; + regCOMPUTE_RESTART_Z__CI__VI compute_restart_z; + regCOMPUTE_THREAD_TRACE_ENABLE__CI__VI compute_thread_trace_enable; + } resource_regs; + + // Desc: Structure used to pass handles of the Aql dispatch + // packet, Aql queue, Kernel argument address block, Scratch + // buffer + struct DispatchComputeUserDataRegs { + PM4CMDSETDATA cmd_set_data; + uint32_t compute_user_data[16]; + } compute_user_data_regs; + + // Desc: Structure used to configure Cache flush policy + // and dimensions of total work size + PM4CMDDISPATCHDIRECT dispatch_direct; +}; + +// Desc: Structure used to issue a Gpu Barrier command +struct BarrierTemplate { + PM4CMDEVENTWRITE event_write; +}; + +// Desc: Structure used to configure the flushing +// of various caches - instruction, constants, L1 +// and L2 +struct AcquireMemTemplate { + PM4CMDACQUIREMEM acquire_mem; +}; + +// Desc: Structure used to reference another Gpu command +// indirectly. Generally used to reference a list of Gpu +// commands (dispatch cmds) indirectly +struct LaunchTemplate { + PM4CMDINDIRECTBUFFER indirect_buffer; +}; + +// Desc: Structure used to determine the end of +// a kernel including cache flushes and writing to +// a user configurable memory location +struct EndofKernelNotifyTemplate { + PM4CMDRELEASEMEM release_mem; +}; + +// Desc: Strucuture used to perform various atomic +// operations - add, subtract, increment, etc +struct AtomicTemplate { + PM4CMDATOMIC atomic; +}; + +// Desc: Structure used to conditionalize the execution +// of a Gpu command stream +struct ConditionalExecuteTemplate { + PM4CMDCONDEXEC_CI conditional; +}; + +// Desc: PM4 command to write a 32-bit value into a memory +// location accessible to Gpu +struct WriteDataTemplate { + PM4CMDWRITEDATA write_data; + uint32_t write_data_value; +}; + +// Desc: PM4 command to write a 64-bit value into a memory +// location accessible to Gpu +struct WriteData64Template { + PM4CMDWRITEDATA write_data; + uint64_t write_data_value; +}; + +// Desc: PM4 command to wait for a certain event before proceeding +// to process another command on the queue +struct WaitRegMemTemplate { + PM4CMDWAITREGMEM wait_reg_mem; +}; + +// Desc: Initializer for commands that set shader registers +template void GenerateSetShRegHeader(T* pm4, uint32_t reg_addr) { + pm4->cmd_set_data.header.u32All = + PM4_TYPE_3_HDR(IT_SET_SH_REG, sizeof(T) / sizeof(uint32_t), ShaderCompute, 0); + pm4->cmd_set_data.regOffset = reg_addr - PERSISTENT_SPACE_START; +} + +// Desc: Initializer for various Gpu command headers +template void GenerateCmdHeader(T* pm4, IT_OpCodeType op_code) { + pm4->header.u32All = PM4_TYPE_3_HDR(op_code, sizeof(T) / sizeof(uint32_t), ShaderCompute, 0); +} + +// Desc: Initializer for commands that set configuration registers +template void GenerateSetConfigRegHeader(T* pm4, uint32_t reg_addr) { + pm4->cmd_set_data.header.u32All = + PM4_TYPE_3_HDR(IT_SET_CONFIG_REG, sizeof(T) / sizeof(uint32_t), ShaderCompute, 0); + pm4->cmd_set_data.regOffset = reg_addr - CONFIG_SPACE_START; +} + + +} // gfx8 + +} // pm4_profile + +#endif // _GFX8_CMDS_H_ diff --git a/runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmdwriter.cpp b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmdwriter.cpp new file mode 100644 index 0000000000..1dbe1183e2 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmdwriter.cpp @@ -0,0 +1,768 @@ +#include +#include +#include +#include + +#include "gfx8_cmdwriter.h" +#include "gfxip/gfx8/gfx8_utils.h" + +// RELEASE MEM DST SEL Definitions +#define RELEASE_MEM_DST_SEL_MEMORY_CONTROLLER 0 +#define RELEASE_MEM_DST_SEL_TC_L2 1 + +// RELEASE MEM CACHE POLICY Definitions +#define RELEASE_MEM_CACHE_POLICY_LRU 0 +#define RELEASE_MEM_CACHE_POLICY_STREAM 1 +#define RELEASE_MEM_CACHE_POLICY_BYPASS 2 + +template +static void PrintPm4Packet(const T& command, const char* name) { +#if ! defined(NDEBUG) + uint32_t * cmd = (uint32_t*)&command; + uint32_t size = sizeof(command) / sizeof(uint32_t); + std::ostringstream oss; + oss << "'" << name << "' size(" << std::dec << size << ")"; + std::clog << std::setw(40) << std::left << oss.str() << ":"; + for (uint32_t idx = 0; idx < size; idx++) { + std::clog << " " << std::hex << std::setw(8) << std::setfill('0') << cmd[idx]; + } + std::clog << std::setfill(' ') << std::endl; +#endif +} + +#define APPEND_COMMAND_WRAPPER(cmdbuf, command) \ + PrintPm4Packet(command, __FUNCTION__); \ + AppendCommand(cmdbuf, command); + +namespace pm4_profile { +namespace gfx8 { + +template void Gfx8CmdWriter::AppendCommand(CmdBuf* cmdbuf, const T& command) { + cmdbuf->AppendCommand(&command, sizeof(command)); +} + +void Gfx8CmdWriter::InitializeAtomicTemplate() { + memset(&atomic_template_.atomic, 0, sizeof(atomic_template_)); + GenerateCmdHeader(&atomic_template_.atomic, IT_ATOMIC_MEM__CI); + + if (atc_support_) { + const uint32_t kAtcShift = 24; + atomic_template_.atomic.ordinal2 |= 1 << kAtcShift; + } +} + +void Gfx8CmdWriter::InitializeConditionalTemplate() { + memset(&conditional_template_.conditional, 0, sizeof(conditional_template_)); + gfx8::GenerateCmdHeader(&conditional_template_.conditional, IT_COND_EXEC); + + if (atc_support_) { + const uint32_t kAtcShift = 24; + conditional_template_.conditional.ordinal4 |= 1 << kAtcShift; + } +} + +void Gfx8CmdWriter::InitializeLaunchTemplate() { + memset(&launch_template_, 0, sizeof(launch_template_)); + + GenerateCmdHeader(&launch_template_.indirect_buffer, IT_INDIRECT_BUFFER); + launch_template_.indirect_buffer.CI.valid = true; +} + +void Gfx8CmdWriter::InitializeWriteDataTemplate() { + // Set the header of write data command + memset(&write_data_template_, 0, sizeof(write_data_template_)); + + // Initialize the header of command packet + PM4CMDWRITEDATA* command = &(write_data_template_.write_data); + uint32_t cmd_size = sizeof(write_data_template_) / sizeof(uint32_t); + command->ordinal1 = PM4_TYPE_3_HDR(IT_WRITE_DATA, cmd_size, ShaderCompute, 0); + + // Set the ATC bit of command template - specifies if the address + // belongs to system memory + write_data_template_.write_data.atc__CI = (atc_support_) ? 1 : 0; + + // Set the bit to confirm the write operation and cache policy + write_data_template_.write_data.wrConfirm = 1; + write_data_template_.write_data.cachePolicy__CI = WRITE_DATA_CACHE_POLICY_BYPASS; + + // Specify the module that will execute the write data command + write_data_template_.write_data.engineSel = WRITE_DATA_ENGINE_ME; + + // Specify the class to which the write destination belongs + write_data_template_.write_data.dstSel = WRITE_DATA_DST_SEL_MEMORY_ASYNC; +} + +void Gfx8CmdWriter::InitializeWriteData64Template() { + // Set the header of write data command + memset(&write_data64_template_, 0, sizeof(write_data64_template_)); + + // Initialize the header of command packet + PM4CMDWRITEDATA* command = &(write_data64_template_.write_data); + uint32_t cmd_size = sizeof(write_data64_template_) / sizeof(uint32_t); + command->ordinal1 = PM4_TYPE_3_HDR(IT_WRITE_DATA, cmd_size, ShaderCompute, 0); + + // Set the ATC bit of command template - specifies if the address + // belongs to system memory + write_data64_template_.write_data.atc__CI = (atc_support_) ? 1 : 0; + + // Set the bit to confirm the write operation and cache policy + write_data64_template_.write_data.wrConfirm = 1; + write_data64_template_.write_data.cachePolicy__CI = WRITE_DATA_CACHE_POLICY_BYPASS; + + // Specify the module that will execute the write data command + write_data64_template_.write_data.engineSel = WRITE_DATA_ENGINE_ME; + + // Specify the class to which the write destination belongs + // write_data64_template_.write_data.dstSel = WRITE_DATA_DST_SEL_TCL2; + // TODO: For Hawaii bring up only. + write_data64_template_.write_data.dstSel = WRITE_DATA_DST_SEL_MEMORY_ASYNC; +} + +void Gfx8CmdWriter::InitializeBarrierTemplate() { + memset(&pending_dispatch_template_, 0, sizeof(pending_dispatch_template_)); + + gfx8::GenerateCmdHeader(&pending_dispatch_template_.event_write, IT_EVENT_WRITE); + pending_dispatch_template_.event_write.eventType = CS_PARTIAL_FLUSH; + pending_dispatch_template_.event_write.eventIndex = EventTypeToIndexTable[CS_PARTIAL_FLUSH]; +} + +void Gfx8CmdWriter::InitializeAcquireMemTemplate() { + memset(&invalidate_cache_template_, 0, sizeof(invalidate_cache_template_)); + + gfx8::GenerateCmdHeader(&invalidate_cache_template_.acquire_mem, IT_ACQUIRE_MEM__CI__VI); + invalidate_cache_template_.acquire_mem.cpCoherBase.u32All = 0x00; + invalidate_cache_template_.acquire_mem.cpCoherBaseHi.u32All = 0x00; + invalidate_cache_template_.acquire_mem.cpCoherSize.u32All = 0xFFFFFFFF; + invalidate_cache_template_.acquire_mem.cpCoherSizeHi.u32All = 0xFF; + invalidate_cache_template_.acquire_mem.pollInterval = 0; +} + +void Gfx8CmdWriter::InitializeWaitRegMemTemplate() { + memset(&wait_reg_mem_template_, 0, sizeof(wait_reg_mem_template_)); + + gfx8::GenerateCmdHeader(&wait_reg_mem_template_.wait_reg_mem, IT_WAIT_REG_MEM); + wait_reg_mem_template_.wait_reg_mem.atc__CI = (atc_support_) ? 1 : 0; + wait_reg_mem_template_.wait_reg_mem.cachePolicy__CI = 2; // bypass + wait_reg_mem_template_.wait_reg_mem.pollInterval = 0; + wait_reg_mem_template_.wait_reg_mem.engine = WAIT_REG_MEM_ENGINE_ME; +} + +Gfx8CmdWriter::Gfx8CmdWriter(bool atc_support, bool pcie_atomic_support) { + // Initialize various state variables related to + // atomic operations and atc support + pcie_atomic_support_ = pcie_atomic_support; + atc_support_ = atc_support; + + InitializeLaunchTemplate(); + InitializeAtomicTemplate(); + InitializeConditionalTemplate(); + InitializeWriteDataTemplate(); + InitializeWriteData64Template(); + InitializeBarrierTemplate(); + InitializeAcquireMemTemplate(); + InitializeWaitRegMemTemplate(); +} + +void Gfx8CmdWriter::BuildWaitRegMemCommand(CmdBuf* cmdbuf, bool mem_space, uint64_t wait_addr, + bool func_eq, uint32_t mask_val, uint32_t wait_val) { + gfx8::WaitRegMemTemplate wait_cmd = wait_reg_mem_template_; + + // Apply the space to which addr belongs + if (mem_space) { + wait_cmd.wait_reg_mem.memSpace = WAIT_REG_MEM_SPACE_MEMORY; + } else { + wait_cmd.wait_reg_mem.memSpace = WAIT_REG_MEM_SPACE_REGISTER; + } + + // Apply the function - equal / not equal desired by user + if (func_eq) { + wait_cmd.wait_reg_mem.function = WAIT_REG_MEM_FUNC_EQUAL; + } else { + wait_cmd.wait_reg_mem.function = WAIT_REG_MEM_FUNC_NOT_EQUAL; + } + + // Apply the mask on value at address/register + wait_cmd.wait_reg_mem.mask = mask_val; + + // Value to use in applying equal / not equal function + wait_cmd.wait_reg_mem.reference = wait_val; + + // Update upper 32 bit address if addr is not a register + if (mem_space) { + assert(!(wait_addr & 0x3) && "WaitRegMem address must be 4 byte aligned"); + } + wait_cmd.wait_reg_mem.pollAddressLo = Low32(wait_addr); + if (mem_space) { + wait_cmd.wait_reg_mem.pollAddressHi = High32(wait_addr); + } + + APPEND_COMMAND_WRAPPER(cmdbuf, wait_cmd); +} + +void Gfx8CmdWriter::BuildUpdateHostAddress(CmdBuf* cmdbuf, uint64_t* addr, int64_t value) { + // If Atomics are supported, use it + if (pcie_atomic_support_) { + BuildAtomicPacket64(cmdbuf, CommandWriter::AtomicType::kAtomicSwap, (volatile uint64_t*)addr, + value); + return; + } + + BuildWriteData64Command(cmdbuf, addr, value); + return; +} + +void Gfx8CmdWriter::BuildIndirectBufferCmd(CmdBuf* cmdbuf, const void* cmd_addr, + std::size_t cmd_size) { + gfx8::LaunchTemplate launch = launch_template_; + + launch.indirect_buffer.ibBaseLo = PtrLow32(cmd_addr); + launch.indirect_buffer.ibBaseHi = PtrHigh32(cmd_addr); + launch.indirect_buffer.CI.ibSize = cmd_size / sizeof(uint32_t); + + APPEND_COMMAND_WRAPPER(cmdbuf, launch); +} + +void Gfx8CmdWriter::BuildBOPNotifyCmd(CmdBuf* cmdbuf, const void* write_addr, uint32_t write_val, + bool interrupt) { + // Initialize the command including its header + gfx8::EndofKernelNotifyTemplate eopCmd; + memset(&eopCmd, 0, sizeof(eopCmd)); + gfx8::GenerateCmdHeader(&eopCmd.release_mem, IT_RELEASE_MEM__CI__VI); + + // Program CP to wait until following event is notified by SPI + eopCmd.release_mem.eventType = BOTTOM_OF_PIPE_TS; + eopCmd.release_mem.eventIndex = EventTypeToIndexTable[BOTTOM_OF_PIPE_TS]; + + // Program CP to perform various cache operations + // which complete before Write operation commences + eopCmd.release_mem.atc = atc_support_; + eopCmd.release_mem.l2Invlidate = true; + eopCmd.release_mem.l2WriteBack = true; + + // Set destination as Memory with Write bypassing Cache + eopCmd.release_mem.cachePolicy = RELEASE_MEM_CACHE_POLICY_BYPASS; + eopCmd.release_mem.dstSel = RELEASE_MEM_DST_SEL_MEMORY_CONTROLLER; + + // Program CP to write user specified value to user specified address + eopCmd.release_mem.ordinal4 = Low32(uint64_t(write_addr)); + eopCmd.release_mem.addrHi = High32(uint64_t(write_addr)); + eopCmd.release_mem.dataLo = Low32(write_val); + eopCmd.release_mem.dataHi = High32(write_val); + eopCmd.release_mem.dataSel = EVENTWRITEEOP_DATA_SEL_SEND_DATA32; + + // Determine if host will poll or wait for interrupt + eopCmd.release_mem.intSel = + (interrupt == false) ? EVENTWRITEEOP_INT_SEL_NONE : EVENTWRITEEOP_INT_SEL_SEND_INT_ON_CONFIRM; + + APPEND_COMMAND_WRAPPER(cmdbuf, eopCmd); +} + + +void Gfx8CmdWriter::BuildBarrierFenceCommands(CmdBuf* cmdbuf) { + gfx8::AcquireMemTemplate invalidate_src_caches = invalidate_cache_template_; + + // wbINVL2 by default writes-back and invalidates both L1 and L2 + invalidate_src_caches.acquire_mem.coherCntl = + CP_COHER_CNTL__TC_ACTION_ENA_MASK | CP_COHER_CNTL__TC_WB_ACTION_ENA_MASK__CI__VI; + + APPEND_COMMAND_WRAPPER(cmdbuf, invalidate_src_caches); +} + +// PM4 packet for profilers +#define PM4_PACKET3 (0xC0000000) +#define PM4_PACKET3_CMD_SHIFT 8 +#define PM4_PACKET3_COUNT_SHIFT 16 + +#define PACKET3(cmd, count) \ + (PM4_PACKET3 | (((count)-1) << PM4_PACKET3_COUNT_SHIFT) | ((cmd) << PM4_PACKET3_CMD_SHIFT)) + +// Structure to store the event PM4 packet +typedef struct WriteRegPacket_ { uint32_t item[3]; } WriteRegPacket; + +typedef struct WriteEventPacket_ { uint32_t item[7]; } WriteEventPacket; + +void Gfx8CmdWriter::BuildWriteEventPacket(CmdBuf* cmdbuf, uint32_t event) { + + PM4CMDEVENTWRITE cp_event_initiator; + cp_event_initiator.ordinal1 = PACKET3(IT_EVENT_WRITE, 1); + cp_event_initiator.ordinal2 = 0; + + VGT_EVENT_TYPE eventType = Reserved_0x00; + switch (event) { + case kPerfCntrsStart: + eventType = PERFCOUNTER_START; + break; + case kPerfCntrsStop: + eventType = PERFCOUNTER_STOP; + break; + case kPerfCntrsSample: + eventType = PERFCOUNTER_SAMPLE; + break; + default: + assert(false && "Illegal VGT Event Id"); + } + + cp_event_initiator.eventType = eventType; + cp_event_initiator.eventIndex = EventTypeToIndexTable[eventType]; + + APPEND_COMMAND_WRAPPER(cmdbuf, cp_event_initiator); + + return; +} + +void Gfx8CmdWriter::BuildWriteUnshadowRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value) { + WriteRegPacket packet; + packet.item[0] = (PM4_TYPE_3_HDR(IT_SET_UCONFIG_REG__CI__VI, 1 + PM4_CMD_SET_CONFIG_REG_DWORDS, + ShaderGraphics, 0)); + packet.item[1] = (addr - UCONFIG_SPACE_START__CI__VI); + packet.item[2] = value; + + APPEND_COMMAND_WRAPPER(cmdbuf, packet); + + return; +} + +void Gfx8CmdWriter::BuildWriteUConfigRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value) { + WriteRegPacket packet; + packet.item[0] = (PM4_TYPE_3_HDR(IT_SET_UCONFIG_REG__CI__VI, 1 + PM4_CMD_SET_CONFIG_REG_DWORDS, + ShaderCompute, 0)); + packet.item[1] = (addr - UCONFIG_SPACE_START__CI__VI); + packet.item[2] = value; + + APPEND_COMMAND_WRAPPER(cmdbuf, packet); + + return; +} + +void Gfx8CmdWriter::BuildWriteShRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value) { + WriteRegPacket packet; + packet.item[0] = (PM4_TYPE_3_HDR(IT_SET_SH_REG, 1 + PM4_CMD_SET_SH_REG_DWORDS, ShaderCompute, 0)); + packet.item[1] = (addr - PERSISTENT_SPACE_START); + packet.item[2] = value; + + APPEND_COMMAND_WRAPPER(cmdbuf, packet); + + return; +} + +void Gfx8CmdWriter::BuildCopyDataPacket(CmdBuf* cmdbuf, uint32_t src_sel, uint32_t src_addr_lo, + uint32_t src_addr_hi, uint32_t* dst_addr, uint32_t size, + bool wait) { + PM4CMDCOPYDATA cmd_data; + memset(&cmd_data, 0, sizeof(PM4CMDCOPYDATA)); + + cmd_data.header.u32All = PACKET3(IT_COPY_DATA, 5); + + cmd_data.srcAtc__CI = atc_support_; + cmd_data.srcCachePolicy__CI = COPY_DATA_SRC_CACHE_POLICY_BYPASS; + cmd_data.srcSel = src_sel; + + cmd_data.dstAtc__CI = atc_support_; + cmd_data.dstSel = COPY_DATA_SEL_DST_ASYNC_MEMORY; + cmd_data.dstCachePolicy__CI = COPY_DATA_DST_CACHE_POLICY_BYPASS; + + uint32_t dst_addr_lo, dst_addr_hi; + + dst_addr_lo = PtrLow32(dst_addr); + dst_addr_hi = PtrHigh32(dst_addr); + + cmd_data.srcAddressLo = src_addr_lo; + cmd_data.srcAddressHi = src_addr_hi; + cmd_data.dstAddressLo = dst_addr_lo; + cmd_data.dstAddressHi = dst_addr_hi; + + cmd_data.countSel = size; + cmd_data.wrConfirm = wait; + cmd_data.engineSel = COPY_DATA_ENGINE_ME; + + APPEND_COMMAND_WRAPPER(cmdbuf, cmd_data); + + return; +} + +void Gfx8CmdWriter::BuildCacheFlushPacket(CmdBuf* cmdbuf) { + WriteEventPacket packet; + packet.item[0] = PACKET3(IT_ACQUIRE_MEM__CI__VI, 6); + packet.item[1] = 0x28C00000; + packet.item[2] = 0xFFFFFFFF; + packet.item[3] = 0; + packet.item[4] = 0; + packet.item[5] = 0; + packet.item[6] = 0x00000004; + + APPEND_COMMAND_WRAPPER(cmdbuf, packet); +} + +void Gfx8CmdWriter::BuildWriteWaitIdlePacket(CmdBuf* cmdbuf) { + BuildBarrierCommand(cmdbuf); + BuildCacheFlushPacket(cmdbuf); + return; +} + +// Will issue a VGT event including a cache flush later on +void Gfx8CmdWriter::BuildVgtEventPacket(CmdBuf* cmdbuf, uint32_t vgtEvent) { + PM4CMDEVENTWRITE cp_event_initiator; + + cp_event_initiator.ordinal1 = PACKET3(IT_EVENT_WRITE, 1); + cp_event_initiator.ordinal2 = 0; + + VGT_EVENT_TYPE eventType = Reserved_0x00; + switch (vgtEvent) { + case kPerfCntrsStart: + eventType = PERFCOUNTER_START; + break; + case kPerfCntrsStop: + eventType = PERFCOUNTER_STOP; + break; + case kPerfCntrsSample: + eventType = PERFCOUNTER_SAMPLE; + break; + case kThrdTraceStart: + eventType = THREAD_TRACE_START; + break; + case kThrdTraceStop: + eventType = THREAD_TRACE_STOP; + break; + case kThrdTraceFlush: + eventType = THREAD_TRACE_FLUSH; + break; + case kThrdTraceFinish: + eventType = THREAD_TRACE_FINISH; + break; + default: + assert(false && "Illegal VGT Event Id"); + } + + cp_event_initiator.eventType = eventType; + cp_event_initiator.eventIndex = EventTypeToIndexTable[eventType]; + + APPEND_COMMAND_WRAPPER(cmdbuf, cp_event_initiator); + + // Check If I should be issuing a cache flush operation as well + // test and remove it + BuildCacheFlushPacket(cmdbuf); + return; +} + +void Gfx8CmdWriter::BuildWriteRegisterPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value) { + WriteRegPacket packet; + packet.item[0] = + (PM4_TYPE_3_HDR(IT_SET_CONFIG_REG, 1 + PM4_CMD_SET_CONFIG_REG_DWORDS, ShaderGraphics, 0)); + packet.item[1] = addr - CONFIG_SPACE_START; + packet.item[2] = value; + + APPEND_COMMAND_WRAPPER(cmdbuf, packet); + + return; +} + +void Gfx8CmdWriter::BuildWriteEventQueryPacket(CmdBuf* cmdbuf, uint32_t event, uint32_t* addr) { + PM4CMDEVENTWRITEQUERY cp_event_initiator; + cp_event_initiator.ordinal1 = PACKET3(IT_EVENT_WRITE, 3); + cp_event_initiator.ordinal2 = 0; + + // Update switch statements you want to support + VGT_EVENT_TYPE eventType = Reserved_0x00; + switch (event) { + default: + assert(false && "Illegal VGT Event Id"); + } + + cp_event_initiator.eventType = eventType; + cp_event_initiator.eventIndex = EventTypeToIndexTable[eventType]; + + // set the address + uint32_t addrLo = PtrLow32(addr); + uint32_t addrHi = PtrHigh32(addr); + ((addrLo & 0x7) != 0) ? assert(false) : assert(true); + + cp_event_initiator.ordinal3 = 0; + cp_event_initiator.ordinal4 = 0; + cp_event_initiator.addressLo = addrLo; + cp_event_initiator.addressHi = addrHi; + + APPEND_COMMAND_WRAPPER(cmdbuf, cp_event_initiator); + + return; +} + +void Gfx8CmdWriter::BuildBarrierCommand(CmdBuf* cmdBuf) { + APPEND_COMMAND_WRAPPER(cmdBuf, pending_dispatch_template_); +} + +void Gfx8CmdWriter::WriteUserData(uint32_t* dst_addr, uint32_t count, const void* src_addr) { + memcpy(dst_addr, src_addr, count * sizeof(uint32_t)); +} + + +void Gfx8CmdWriter::BuildAtomicPacket(CmdBuf* cmdbuf, AtomicType atomic_op, + volatile uint32_t* addr, uint32_t value, + uint32_t compare) { + gfx8::AtomicTemplate atomic = atomic_template_; + + // make sure the destination adddress is aligned + uint32_t address_low = PtrLow32((void*)addr); + uint32_t address_high = PtrHigh32((void*)addr); + assert(!(address_low & 0x7) && "destination address must be 8 byte aligned"); + + atomic.atomic.addressLo = address_low; + atomic.atomic.addressHi = address_high; + + switch (atomic_op) { + case CommandWriter::kAtomicTypeIncrement: { + atomic.atomic.atomOp = TC_OP_ATOMIC_ADD_RTN_32; + atomic.atomic.srcDataLo = 1; + break; + } + case CommandWriter::kAtomicTypeDecrement: { + atomic.atomic.atomOp = TC_OP_ATOMIC_SUB_RTN_32; + atomic.atomic.srcDataLo = 1; + break; + } + case CommandWriter::kAtomicTypeCompareAndSwap: { + atomic.atomic.atomOp = TC_OP_ATOMIC_CMPSWAP_RTN_32; + atomic.atomic.srcDataLo = value; + atomic.atomic.cmpDataLo = compare; + break; + } + case CommandWriter::kAtomicTypeBlockingCompareAndSwap: { + atomic.atomic.atomOp = TC_OP_ATOMIC_CMPSWAP_RTN_32; + atomic.atomic.srcDataLo = value; + atomic.atomic.cmpDataLo = compare; + atomic.atomic.command = 1; + atomic.atomic.loopInterval = 128; + break; + } + case CommandWriter::kAtomicAdd: { + atomic.atomic.atomOp = TC_OP_ATOMIC_ADD_RTN_32; + atomic.atomic.srcDataLo = value; + break; + } + case CommandWriter::kAtomicSubtract: { + atomic.atomic.atomOp = TC_OP_ATOMIC_SUB_RTN_32; + atomic.atomic.srcDataLo = value; + break; + } + case CommandWriter::kAtomicSwap: { + atomic.atomic.atomOp = TC_OP_ATOMIC_SWAP_RTN_32; + atomic.atomic.srcDataLo = value; + break; + } + } + + APPEND_COMMAND_WRAPPER(cmdbuf, atomic); +} + +void Gfx8CmdWriter::BuildAtomicPacket64(CmdBuf* cmdbuf, AtomicType atomic_op, + volatile uint64_t* addr, uint64_t value, + uint64_t compare) { + AtomicTemplate atomic = atomic_template_; + + // make sure the destination adddress is aligned + uint32_t address_low = PtrLow32((void*)addr); + uint32_t address_high = PtrHigh32((void*)addr); + assert(!(address_low & 0x7) && "destination address must be 8 byte aligned"); + + atomic.atomic.addressLo = address_low; + atomic.atomic.addressHi = address_high; + + atomic.atomic.atc = (atc_support_) ? 1 : 0; + atomic.atomic.cachePolicy = 2; + + switch (atomic_op) { + case CommandWriter::kAtomicTypeIncrement: { + atomic.atomic.atomOp = TC_OP_ATOMIC_ADD_RTN_64; + atomic.atomic.srcDataLo = 1; + break; + } + case CommandWriter::kAtomicTypeDecrement: { + atomic.atomic.atomOp = TC_OP_ATOMIC_SUB_RTN_64; + atomic.atomic.srcDataLo = 1; + break; + } + case CommandWriter::kAtomicTypeCompareAndSwap: { + atomic.atomic.atomOp = TC_OP_ATOMIC_CMPSWAP_RTN_64; + atomic.atomic.srcDataLo = Low32(value); + atomic.atomic.srcDataHi = High32(value); + atomic.atomic.cmpDataLo = Low32(compare); + atomic.atomic.cmpDataHi = High32(compare); + break; + } + case CommandWriter::kAtomicTypeBlockingCompareAndSwap: { + atomic.atomic.atomOp = TC_OP_ATOMIC_CMPSWAP_RTN_64; + atomic.atomic.srcDataLo = Low32(value); + atomic.atomic.srcDataHi = High32(value); + atomic.atomic.cmpDataLo = Low32(compare); + atomic.atomic.cmpDataHi = High32(compare); + atomic.atomic.command = 1; + atomic.atomic.loopInterval = 128; + break; + } + case CommandWriter::kAtomicAdd: { + atomic.atomic.atomOp = TC_OP_ATOMIC_ADD_RTN_64; + atomic.atomic.srcDataLo = Low32(value); + atomic.atomic.srcDataHi = High32(value); + break; + } + case CommandWriter::kAtomicSubtract: { + atomic.atomic.atomOp = TC_OP_ATOMIC_SUB_RTN_64; + atomic.atomic.srcDataLo = Low32(value); + atomic.atomic.srcDataHi = High32(value); + break; + } + case CommandWriter::kAtomicSwap: { + atomic.atomic.atomOp = TC_OP_ATOMIC_SWAP_RTN_64; + atomic.atomic.srcDataLo = Low32(value); + atomic.atomic.srcDataHi = High32(value); + break; + } + } + + APPEND_COMMAND_WRAPPER(cmdbuf, atomic); +} + +size_t Gfx8CmdWriter::SizeOfAtomicPacket() const { + return sizeof(AtomicTemplate) / sizeof(uint32_t); +} + +void Gfx8CmdWriter::BuildConditionalExecute(CmdBuf* cmdbuf, uint32_t* signal, uint16_t count) { + ConditionalExecuteTemplate conditional = conditional_template_; + + uint32_t address_low = PtrLow32(signal); + uint32_t address_high = PtrHigh32(signal); + assert(!(address_low & 0x7) && "destination address must be 8 byte aligned"); + + conditional.conditional.boolAddrLo = address_low; + conditional.conditional.boolAddrHi = address_high; + conditional.conditional.execCount = count; + + APPEND_COMMAND_WRAPPER(cmdbuf, conditional); +} + +void Gfx8CmdWriter::BuildWriteDataCommand(CmdBuf* cmdbuf, uint32_t* write_addr, + uint32_t write_value) { + // Copy the initialize command packet + gfx8::WriteDataTemplate command = write_data_template_; + + // Encode the user specified value to write + command.write_data_value = write_value; + + // Encode the user specified address to write to + command.write_data.dstAddrLo = PtrLow32(write_addr); + command.write_data.dstAddrHi = PtrHigh32(write_addr); + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, command); +} + +void Gfx8CmdWriter::BuildWriteData64Command(CmdBuf* cmdbuf, uint64_t* write_addr, + uint64_t write_value) { + // Copy the initialize command packet + gfx8::WriteData64Template command = write_data64_template_; + + // Encode the user specified value to write + command.write_data_value = write_value; + + // Encode the user specified address to write to + command.write_data.dstAddrLo = PtrLow32(write_addr); + command.write_data.dstAddrHi = PtrHigh32(write_addr); + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, command); +} + +void Gfx8CmdWriter::BuildFlushCacheCmd(CmdBuf* cmdbuf, FlushCacheOptions* options, + uint32_t* writeAddr, uint32_t writeVal) { + PM4CMDACQUIREMEM flushCmd; + memset(&flushCmd, 0, sizeof(flushCmd)); + + // Verify write back address is valid. Note that this address is NOT + // used on CI. But to have a same interface as that on SI, we keep + // the address argument in this function. Thus, this check always pass + // no matter the address is NULL or not. + (writeAddr == NULL) ? assert(true) : assert(true); + + // Initialize the command header + gfx8::GenerateCmdHeader(&flushCmd, IT_ACQUIRE_MEM__CI__VI); + + // Specify the base address of memory being synchronized. + // The starting address is indicated as follows: bits [0-48]. + flushCmd.cpCoherBase.u32All = 0; + flushCmd.cpCoherBaseHi.u32All = 0; + + // Specify the size of memory being synchronized. It is indicated + // as follows: + // COHER_SIZE_256B_MASK = 0xffffffffL + // COHER_SIZE_HI_256B_MASK__CI__VI = 0x000000ffL + flushCmd.cpCoherSize.u32All = CP_COHER_SIZE__COHER_SIZE_256B_MASK; + flushCmd.cpCoherSizeHi.u32All = CP_COHER_SIZE_HI__COHER_SIZE_HI_256B_MASK__CI__VI; + + // Periodicity of polling - interval to wait from the time + // of unsuccessful polling result is returned and a new + // poll is issued + flushCmd.pollInterval = 0x04; + + // Program Coherence Control Register. Initialize L2 Cache flush + // for Non-Coherent memory blocks + uint32_t coher_cntl = 0; + + coher_cntl |= (options->l1) ? CP_COHER_CNTL__TCL1_ACTION_ENA_MASK : 0; + coher_cntl |= (options->l2) + ? (CP_COHER_CNTL__TC_ACTION_ENA_MASK | CP_COHER_CNTL__TC_WB_ACTION_ENA_MASK__CI__VI) + : 0; + coher_cntl |= (options->icache) ? CP_COHER_CNTL__SH_ICACHE_ACTION_ENA_MASK : 0; + coher_cntl |= (options->kcache) ? CP_COHER_CNTL__SH_KCACHE_ACTION_ENA_MASK : 0; + flushCmd.coherCntl = coher_cntl; + + // Copy AcquireMem command buffer stream + APPEND_COMMAND_WRAPPER(cmdbuf, flushCmd); + return; +} + +void Gfx8CmdWriter::BuildDmaDataPacket(CmdBuf* cmdbuf, uint32_t* srcAddr, uint32_t* dstAddr, + uint32_t copySize, bool waitForConfirm) { + PM4CMDDMADATA cmdDmaData; + memset(&cmdDmaData, 0, sizeof(PM4CMDDMADATA)); + cmdDmaData.header.u32All = + (PM4_TYPE_3_HDR(IT_DMA_DATA__CI__VI, PM4_CMD_DMA_DATA_DWORDS, ShaderCompute, 0)); + + // Id of Micro Engine + cmdDmaData.engine = 0; + + // Specify attributes of source buffer such as its + // location, ATC property, Cache policy and Volatile + // A value of 1 for cache policy means to Stream + cmdDmaData.srcSel = 0; + cmdDmaData.srcATC = atc_support_; + cmdDmaData.srcCachePolicy = 1; + cmdDmaData.srcVolatile = 0; + + // Specify attributes of destination buffer such as + // its location, ATC property, Cache policy and Volatile + // A value of 1 for cache policy means to Stream + cmdDmaData.dstSel = 0; + cmdDmaData.dstATC = atc_support_; + cmdDmaData.dstCachePolicy = 1; + cmdDmaData.dstVolatile = 0; + + // Specify the source and destination addr + cmdDmaData.srcAddrHi = PtrHigh32(srcAddr); + cmdDmaData.srcAddrLoOrData = PtrLow32(srcAddr); + cmdDmaData.dstAddrLo = PtrLow32(dstAddr); + cmdDmaData.dstAddrHi = PtrHigh32(dstAddr); + + // Number of bytes to copy. The command restricts + // the size to be (2 MB - 1) - 21 Bits + assert(copySize < 0x1FFFFF); + cmdDmaData.command.byteCount = copySize; + + // Indicate that DMA Cmd should wait if its source + // is the destination of a previous DMA Cmd + cmdDmaData.command.rawWait = waitForConfirm; + + APPEND_COMMAND_WRAPPER(cmdbuf, cmdDmaData); + return; +} + +} // gfx8 +} // pm4_profile diff --git a/runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmdwriter.h b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmdwriter.h new file mode 100644 index 0000000000..9e14c1ab29 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx8_cmdwriter.h @@ -0,0 +1,201 @@ +#ifndef _GFX8_CMDWRITER_H_ +#define _GFX8_CMDWRITER_H_ + +#include "cmdwriter.h" +#include "gfx8_cmds.h" + +namespace pm4_profile { + +namespace gfx8 { + +/// @brief class Gfx8CmdWriter implements the virtual class CommandWriter +/// for Sea Islands (CI) and VI chipset +class Gfx8CmdWriter : public CommandWriter { + public: + Gfx8CmdWriter(bool atc_support, bool pcie_atomic_support); + + /// @brief Dword specifying NOOP command for SI/CI/VI chipsets. The macro + /// populates the NOOP command which is 32-bits wide. The second parameter, + /// the COUNT field of NOOP command, specifies the number of Dwords to skip. + /// To skip ZERO Dwords the value should be set to 0x3FFF. Since the macro + /// decrements the second parameter by TWO, an artifact of its definition, + /// the value is incremented by TWO to 0x4001 (0x3FFF + 2). + /// + inline uint32_t GetNoOpCmd() { + static const uint32_t nopCmd = PM4_TYPE_3_HDR(IT_NOP, 0x4001, ShaderCompute, 0); + return nopCmd; + } + + void BuildBarrierCommand(CmdBuf* cmdBuf); + + void BuildIndirectBufferCmd(CmdBuf* cmdbuf, const void* cmd_addr, std::size_t cmd_size); + + void BuildBOPNotifyCmd(CmdBuf* cmdbuf, const void* write_addr, uint32_t write_val, + bool interrupt); + + void BuildBarrierFenceCommands(CmdBuf* cmdbuf); + + void BuildWriteEventPacket(CmdBuf* cmdbuf, uint32_t event); + + void BuildWaitRegMemCommand(CmdBuf* cmdbuf, bool mem_space, uint64_t wait_addr, bool func_eq, + uint32_t mask_val, uint32_t wait_val); + + void BuildWriteUnshadowRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value); + + /// @brief Build CP command to program a Gpu register + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// @param addr Register to be programmed + /// @param value Value to write into register + /// + /// @return void + void BuildWriteUConfigRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value); + + void BuildWriteShRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value); + + void BuildCopyDataPacket(CmdBuf* cmdbuf, uint32_t src_sel, uint32_t src_addr_lo, + uint32_t src_addr_hi, uint32_t* dst_addr, uint32_t size, bool wait); + + void BuildWriteWaitIdlePacket(CmdBuf* cmdbuf); + + // Will issue a VGT event including a cache flush later on + void BuildVgtEventPacket(CmdBuf* cmdbuf, uint32_t vgtEvent); + + void BuildWriteRegisterPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value); + + void BuildWriteEventQueryPacket(CmdBuf* cmdbuf, uint32_t event, uint32_t* addr); + + void BuildAtomicPacket(CmdBuf* cmdbuf, AtomicType atomic_op, volatile uint32_t* addr, + uint32_t value, uint32_t compare); + + void BuildAtomicPacket64(CmdBuf* cmdbuf, AtomicType atomic_op, volatile uint64_t* addr, + uint64_t value = 0, uint64_t compare = 0); + + size_t SizeOfAtomicPacket() const; + + void BuildConditionalExecute(CmdBuf* cmdbuf, uint32_t* signal, uint16_t count); + + void BuildWriteDataCommand(CmdBuf* cmdbuf, uint32_t* write_addr, uint32_t write_value); + + void BuildWriteData64Command(CmdBuf* cmdbuf, uint64_t* write_addr, uint64_t write_value); + + void BuildCacheFlushPacket(CmdBuf* cmdbuf); + + /// Writes into input buffer Gpu commands to flush its cache. It is + /// necessary that the buffer provided for flush commands is large + /// enough to accommodate the full set of commands. It should be at + /// least 512 bytes. + /// + /// @param tsCmdBuf Buffer to write commands to. + /// @param writeAddr Registered address into which GPU should write + /// a user provided value upon executing the flush commands. + /// @param writeVal User provided value written by GPU at user provided + /// address, upon executing the flush commands. + /// + /// @return void + void BuildFlushCacheCmd(CmdBuf* cmdBuf, FlushCacheOptions* options, uint32_t* writeAddr, + uint32_t writeVal); + + /// Builds Gpu command to copy data from source to destination buffer + /// using DMA engine. + /// + /// @param cmdbuf Buffer updated with Gpu copy command + /// @param srcAddr Address of source buffer address + /// @param dstAddr Address of destination buffer address + /// @param copySize Size of data to copy in bytes + /// @param waitForCompletion if command should wait for copying to complete + void BuildDmaDataPacket(CmdBuf* cmdBuf, uint32_t* srcAddr, uint32_t* dstAddr, uint32_t copySize, + bool waitForCompletion); + + protected: + /// @brief Copies data from source buffer to destination buffer + /// + /// @param dst_addr Address of destination buffer data + /// + /// @count Size of data to copy in 32-bit words + /// + /// @param src_addr Address of buffer containing source data + /// + /// @return void + virtual void WriteUserData(uint32_t* dst_addr, uint32_t count, const void* src_addr); + + /// @brief Append an instance of Gpu command into input command buffer stream. + /// + /// @param cmdbuf CommandWriter object appended with anohter Gpu command + /// + /// @param cmd Gpu command to be appended into command buffer + /// + /// @return void + template void AppendCommand(CmdBuf* cmdbuf, const T& cmd); + + private: + /// @brief Initializes a Gpu command which can be used to + /// reference a Gpu command stream indirectly + void InitializeLaunchTemplate(); + + /// @brief Initializes a Gpu command to perform atomic operations + //// + void InitializeAtomicTemplate(); + + /// @brief Initializes a Gpu command to allow conditional execution + /// of a Gpu command stream + void InitializeConditionalTemplate(); + + /// @brief Initializes a Gpu command to let command processor + /// wait for some update before letting other commands to be + /// processed + void InitializeWaitRegMemTemplate(); + + /// @brief Initializes the template for Barrier command. + /// Applications can use Barrier command to ensure their + /// command is executed only after all other commands have + /// completed their execution. + void InitializeBarrierTemplate(); + + void BuildUpdateHostAddress(CmdBuf* cmdbuf, uint64_t* addr, int64_t value); + + /// @brief Initializes Acquire Memory command template. Users + /// can submit this command to invalidate Gpu caches - L1 and + /// or L2. + void InitializeAcquireMemTemplate(); + + /// @brief Initializes an instance of Write Data command + /// for use by an application + void InitializeWriteDataTemplate(); + void InitializeWriteData64Template(); + + /// @brief Instance of Gpu command to reference dispatch commands + LaunchTemplate launch_template_; + + /// @brief Instance of Gpu command to use in performing atomic operations + AtomicTemplate atomic_template_; + + /// @brief Instance of Gpu command to use in conditional execution + /// of a command stream + ConditionalExecuteTemplate conditional_template_; + + /// @brief Instance of Pm4 command WRITE_DATA + WriteDataTemplate write_data_template_; + WriteData64Template write_data64_template_; + + /// @brief Instance of Pm4 command EVENT_WRITE + BarrierTemplate pending_dispatch_template_; + + /// @brief Instance of Pm4 command ACQUIRE_MEM + AcquireMemTemplate invalidate_cache_template_; + + /// @brief Instance of Pm4 command WAIT_REG_MEM + WaitRegMemTemplate wait_reg_mem_template_; + + /// @brief ATC support. + bool atc_support_; + + /// @brief PCIe atomic support. + bool pcie_atomic_support_; +}; + +} // gfx8 + +} // pm4_profile + +#endif // _GFX8_CMDWRITER_H_ diff --git a/runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmds.h b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmds.h new file mode 100644 index 0000000000..5dac4f07d1 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmds.h @@ -0,0 +1,90 @@ +#ifndef _GFX9_CMDS_H_ +#define _GFX9_CMDS_H_ + +#include "gfxip/gfx9/gfx9_utils.h" +#include "gfxip/gfx9/gfx9_enum.h" +#include "gfxip/gfx9/gfx9_mask.h" +#include "gfxip/gfx9/gfx9_offset.h" +#include "gfxip/gfx9/gfx9_typedef.h" +#include "gfxip/gfx9/gfx9_registers.h" +#include "gfxip/gfx9/gfx9_pm4_it_opcodes.h" +#include "gfxip/gfx9/f32_mec_pm4_packets_vg10.h" +#include "gfxip/gfx9/f32_pfp_pm4_packets_vg10.h" + +namespace pm4_profile { + +namespace gfx9 { + +/// @brief Initializer for commands that set shader registers +template void GenerateSetShRegHeader(T* pm4, uint32_t reg_addr) { + pm4->cmd_set_data.header.u32All = PM4_TYPE3_HDR(IT_SET_SH_REG, sizeof(T) / sizeof(uint32_t)); + pm4->cmd_set_data.bitfields2.reg_offset = reg_addr - PERSISTENT_SPACE_START; +} + +// @brief Initializer for various Gpu command headers +template void GenerateCmdHeader(T* pm4, IT_OpCodeType op_code) { + pm4->header.u32All = PM4_TYPE3_HDR(op_code, sizeof(T) / sizeof(uint32_t)); +} + +// @brief Initializer for commands that set configuration registers +template void GenerateSetConfigRegHeader(T* pm4, uint32_t reg_addr) { + pm4->cmd_set_data.header.u32All = PM4_TYPE3_HDR(IT_SET_CONFIG_REG, sizeof(T) / sizeof(uint32_t)); + pm4->cmd_set_data.bitfields2.reg_offset = reg_addr - CONFIG_SPACE_START; +} + +/// @brief Structure used to issue a Gpu Barrier command +struct BarrierTemplate { + PM4MEC_EVENT_WRITE event_write; +}; + +/// @brief Structure used to configure the flushing of +/// various caches - instruction, constants, L1 and L2 +struct AcquireMemTemplate { + PM4MEC_ACQUIRE_MEM acquire_mem; +}; + +/// @brief Structure used to reference another Gpu command +/// indirectly. Generally used to reference a list of Gpu +/// commands (dispatch cmds) indirectly +struct LaunchTemplate { + PM4MEC_INDIRECT_BUFFER indirect_buffer; +}; + +/// @brief Structure used to determine the end of +/// a kernel including cache flushes and writing to +/// a user configurable memory location +struct EndofKernelNotifyTemplate { + PM4MEC_RELEASE_MEM release_mem; +}; + +// Desc: Strucuture used to perform various atomic +// operations - add, subtract, increment, etc +struct AtomicTemplate { + PM4MEC_ATOMIC_MEM atomic; +}; + +/// @brief PM4 command to write a 32-bit value into a memory +/// location accessible to Gpu +struct WriteDataTemplate { + PM4MEC_WRITE_DATA write_data; + uint32_t write_data_value; +}; + +/// @brief PM4 command to write a 64-bit value into a memory +/// location accessible to Gpu +struct WriteData64Template { + PM4MEC_WRITE_DATA write_data; + uint64_t write_data_value; +}; + +/// @brief PM4 command to wait for a certain event before proceeding +/// to process another command on the queue +struct WaitRegMemTemplate { + PM4MEC_WAIT_REG_MEM wait_reg_mem; +}; + +} // gfx9 + +} // pm4_profile + +#endif // _GFX9_CMDS_H_ diff --git a/runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmdwriter.cpp b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmdwriter.cpp new file mode 100644 index 0000000000..32ec820b17 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmdwriter.cpp @@ -0,0 +1,743 @@ +#include +#include +#include +#include + +#include "gfx9_cmdwriter.h" + +template +static void PrintPm4Packet(const T& command, const char* name) { +#if ! defined(NDEBUG) + uint32_t * cmd = (uint32_t*)&command; + uint32_t size = sizeof(command) / sizeof(uint32_t); + std::ostringstream oss; + oss << "'" << name << "' size(" << std::dec << size << ")"; + std::clog << std::setw(40) << std::left << oss.str() << ":"; + for (uint32_t idx = 0; idx < size; idx++) { + std::clog << " " << std::hex << std::setw(8) << std::setfill('0') << cmd[idx]; + } + std::clog << std::setfill(' ') << std::endl; +#endif +} + +#define APPEND_COMMAND_WRAPPER(cmdbuf, command) \ + PrintPm4Packet(command, __FUNCTION__); \ + AppendCommand(cmdbuf, command); + +namespace pm4_profile { +namespace gfx9 { + +template void Gfx9CmdWriter::AppendCommand(CmdBuf* cmdbuf, const T& command) { + cmdbuf->AppendCommand(&command, sizeof(command)); +} + +void Gfx9CmdWriter::InitializeLaunchTemplate() { + memset(&launch_template_, 0, sizeof(launch_template_)); + GenerateCmdHeader(&launch_template_.indirect_buffer, IT_INDIRECT_BUFFER); +} + +void Gfx9CmdWriter::InitializeAtomicTemplate() { + memset(&atomic_template_.atomic, 0, sizeof(atomic_template_)); + GenerateCmdHeader(&atomic_template_.atomic, IT_ATOMIC_MEM); + + // Specify the micro engine and cache policies + PM4MEC_ATOMIC_MEM* atomicCmd = &atomic_template_.atomic; + atomicCmd->bitfields2.cache_policy = cache_policy__mec_atomic_mem__stream; +} + +void Gfx9CmdWriter::InitializeBarrierTemplate() { + memset(&pending_dispatch_template_, 0, sizeof(pending_dispatch_template_)); + GenerateCmdHeader(&pending_dispatch_template_.event_write, IT_EVENT_WRITE); + + MEC_EVENT_WRITE_event_index_enum index; + index = event_index__mec_event_write__cs_partial_flush; + pending_dispatch_template_.event_write.bitfields2.event_index = index; + pending_dispatch_template_.event_write.bitfields2.event_type = CS_PARTIAL_FLUSH; +} + +void Gfx9CmdWriter::InitializeAcquireMemTemplate() { + memset(&invalidate_cache_template_, 0, sizeof(invalidate_cache_template_)); + GenerateCmdHeader(&invalidate_cache_template_.acquire_mem, IT_ACQUIRE_MEM); + + // Specify the CP module which will process this packet + PM4MEC_ACQUIRE_MEM* acquire_mem = &invalidate_cache_template_.acquire_mem; + + // Specify the size of memory to invalidate. Size is + // specified in terms of 256 byte chunks. A coher_size + // of 0xFFFFFFFF actually specified 0xFFFFFFFF00 (40 bits) + // of memory. The field coher_size_hi specifies memory from + // bits 40-64 for a total of 256 TB. + acquire_mem->coher_size = 0xFFFFFFFF; + acquire_mem->bitfields4.coher_size_hi = 0xFFFFFF; + + // Specify the address of memory to invalidate. The + // address must be 256 byte aligned. + acquire_mem->coher_base_lo = 0x00; + acquire_mem->bitfields6.coher_base_hi = 0x00; + + // Specify the poll interval for determing if operation is complete + acquire_mem->bitfields7.poll_interval = 0x04; +} + +void Gfx9CmdWriter::InitializeWaitRegMemTemplate() { + memset(&wait_reg_mem_template_, 0, sizeof(wait_reg_mem_template_)); + GenerateCmdHeader(&wait_reg_mem_template_.wait_reg_mem, IT_WAIT_REG_MEM); + + PM4MEC_WAIT_REG_MEM* wait_reg_mem = &wait_reg_mem_template_.wait_reg_mem; + + wait_reg_mem->bitfields7.poll_interval = 0x04; + wait_reg_mem->bitfields2.operation = operation__mec_wait_reg_mem__wait_reg_mem; +} + +void Gfx9CmdWriter::InitializeWriteDataTemplate(PM4MEC_WRITE_DATA* write_data, bool bit32) { + // Initialize the header of command packet by adjusting the + // size of payload - one 32bit DWord or two 32bit DWords + uint32_t cmd_size = (bit32) ? 1 : 2; + memset(write_data, 0, sizeof(PM4MEC_WRITE_DATA)); + cmd_size = cmd_size + (sizeof(PM4MEC_WRITE_DATA) / sizeof(uint32_t)); + write_data->ordinal1 = PM4_TYPE3_HDR(IT_WRITE_DATA, cmd_size); + + // Set the bit to confirm the write operation and cache policy + write_data->bitfields2.wr_confirm = wr_confirm__mec_write_data__wait_for_write_confirmation; + write_data->bitfields2.cache_policy = cache_policy__mec_write_data__stream; + + // Specify the command to increment address if writing more than one DWord + write_data->bitfields2.addr_incr = addr_incr__mec_write_data__increment_address; + + // Specify the class to which the write destination belongs + write_data->bitfields2.dst_sel = dst_sel__mec_write_data__memory; +} + +void Gfx9CmdWriter::InitializeWriteDataTemplate() { + InitializeWriteDataTemplate(&write_data_template_.write_data, true); +} + +void Gfx9CmdWriter::InitializeWriteData64Template() { + InitializeWriteDataTemplate(&write_data64_template_.write_data, false); +} + +void Gfx9CmdWriter::InitializeConditionalTemplate() { + /* + memset(&conditional_template_.conditional, 0, sizeof(conditional_template_)); + GenerateCmdHeader(&conditional_template_.conditional, IT_COND_EXEC); + + if (atc_support_) { + const uint32_t kAtcShift = 24; + conditional_template_.conditional.ordinal4 |= 1 << kAtcShift; + } + */ +} + +void Gfx9CmdWriter::InitializeEndOfKernelNotifyTemplate() { + memset(¬ify_template_, 0, sizeof(notify_template_)); + GenerateCmdHeader(¬ify_template_.release_mem, IT_RELEASE_MEM); + + // Set the event type to be bottom of pipe and cache policy + PM4MEC_RELEASE_MEM* rel_mem; + rel_mem = ¬ify_template_.release_mem; + rel_mem->bitfields2.event_type = BOTTOM_OF_PIPE_TS; + rel_mem->bitfields2.cache_policy = cache_policy__mec_release_mem__stream; + rel_mem->bitfields2.event_index = event_index__mec_release_mem__end_of_pipe; + + // Specify the attributes of source and destinations of data + rel_mem->bitfields3.int_sel = int_sel__mec_release_mem__none; + rel_mem->bitfields3.data_sel = data_sel__mec_release_mem__none; + rel_mem->bitfields3.dst_sel = dst_sel__mec_release_mem__memory_controller; +} + +Gfx9CmdWriter::Gfx9CmdWriter(bool atc_support, bool pcie_atomic_support) { + // Initialize various state variables related to + // atomic operations and atc support + this->atc_support_ = atc_support; + this->pcie_atomic_support_ = pcie_atomic_support; + + // Initialize various command templates + InitializeLaunchTemplate(); + InitializeAtomicTemplate(); + InitializeBarrierTemplate(); + InitializeAcquireMemTemplate(); + InitializeWaitRegMemTemplate(); + InitializeWriteDataTemplate(); + InitializeWriteData64Template(); + InitializeConditionalTemplate(); + InitializeEndOfKernelNotifyTemplate(); +} + +void Gfx9CmdWriter::BuildIndirectBufferCmd(CmdBuf* cmdbuf, const void* cmd_addr, + std::size_t cmd_size) { + // Verify the address is 4-byte aligned + uint64_t addr = uintptr_t(cmd_addr); + assert(!(addr & 0x3) && "IndirectBuffer address must be 4 byte aligned"); + + // Specify the address of indirect buffer encoding cmd stream + LaunchTemplate launch = launch_template_; + + launch.indirect_buffer.bitfields2.ib_base_lo = (PtrLow32(cmd_addr) >> 2); + launch.indirect_buffer.ib_base_hi = PtrHigh32(cmd_addr); + + // Specify the size of indirect buffer and cache policy to set + // upon executing the cmds of indirect buffer + launch.indirect_buffer.bitfields4.priv = 0; + launch.indirect_buffer.bitfields4.valid = 1; + launch.indirect_buffer.bitfields4.ib_size = cmd_size / sizeof(uint32_t); + launch.indirect_buffer.bitfields4.cache_policy = cache_policy__mec_indirect_buffer__stream; + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, launch); +} + +void Gfx9CmdWriter::BuildAtomicPacket(CmdBuf* cmdbuf, AtomicType atomic_op, volatile uint32_t* addr, + uint32_t value, uint32_t compare) { + AtomicTemplate atomicTemplate = atomic_template_; + PM4MEC_ATOMIC_MEM* atomicCmd = &atomicTemplate.atomic; + + // make sure the destination adddress is aligned + uint32_t address_low = PtrLow32((void*)addr); + uint32_t address_high = PtrHigh32((void*)addr); + assert(!(address_low & 0x7) && "destination address must be 8 byte aligned"); + atomicCmd->addr_lo = address_low; + atomicCmd->addr_hi = address_high; + + switch (atomic_op) { + case CommandWriter::kAtomicTypeIncrement: + assert(!(value != 0x01) && "Atomic Increment value should be 1"); + case CommandWriter::kAtomicAdd: + atomicCmd->src_data_lo = value; + atomicCmd->bitfields2.atomic = TC_OP_ATOMIC_ADD_RTN_32; + break; + case CommandWriter::kAtomicTypeDecrement: + assert(!(value != 0x01) && "Atomic Decrement value should be 1"); + case CommandWriter::kAtomicSubtract: + atomicCmd->src_data_lo = value; + atomicCmd->bitfields2.atomic = TC_OP_ATOMIC_SUB_RTN_32; + break; + case CommandWriter::kAtomicTypeBlockingCompareAndSwap: + atomicCmd->bitfields9.loop_interval = 128; + atomicCmd->bitfields2.command = command__mec_atomic_mem__loop_until_compare_satisfied; + case CommandWriter::kAtomicTypeCompareAndSwap: + atomicCmd->src_data_lo = value; + atomicCmd->cmp_data_lo = compare; + atomicCmd->bitfields2.atomic = TC_OP_ATOMIC_CMPSWAP_RTN_32; + break; + case CommandWriter::kAtomicSwap: + atomicCmd->src_data_lo = value; + atomicCmd->bitfields2.atomic = TC_OP_ATOMIC_SWAP_RTN_32; + break; + default: + assert((false) && "Atomic operation id is invalid"); + } + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, atomicTemplate); +} + +void Gfx9CmdWriter::BuildAtomicPacket64(CmdBuf* cmdbuf, AtomicType atomic_op, + volatile uint64_t* addr, uint64_t value, uint64_t compare) { + AtomicTemplate atomicTemplate = atomic_template_; + PM4MEC_ATOMIC_MEM* atomicCmd = &atomicTemplate.atomic; + + // make sure the destination adddress is aligned + uint32_t address_low = PtrLow32((void*)addr); + uint32_t address_high = PtrHigh32((void*)addr); + assert(!(address_low & 0x7) && "destination address must be 8 byte aligned"); + atomicCmd->addr_lo = address_low; + atomicCmd->addr_hi = address_high; + + switch (atomic_op) { + case CommandWriter::kAtomicTypeIncrement: + assert(!(value != 0x01) && "Atomic Increment value should be 1"); + case CommandWriter::kAtomicAdd: + atomicCmd->src_data_lo = Low32(value); + atomicCmd->src_data_hi = High32(value); + atomicCmd->bitfields2.atomic = TC_OP_ATOMIC_ADD_RTN_64; + break; + case CommandWriter::kAtomicTypeDecrement: + assert(!(value != 0x01) && "Atomic Decrement value should be 1"); + case CommandWriter::kAtomicSubtract: + atomicCmd->src_data_lo = Low32(value); + atomicCmd->src_data_hi = High32(value); + atomicCmd->bitfields2.atomic = TC_OP_ATOMIC_SUB_RTN_64; + break; + case CommandWriter::kAtomicTypeBlockingCompareAndSwap: + atomicCmd->bitfields9.loop_interval = 128; + atomicCmd->bitfields2.command = command__mec_atomic_mem__loop_until_compare_satisfied; + case CommandWriter::kAtomicTypeCompareAndSwap: + atomicCmd->src_data_lo = Low32(value); + atomicCmd->src_data_hi = High32(value); + atomicCmd->cmp_data_lo = Low32(compare); + atomicCmd->cmp_data_hi = High32(compare); + atomicCmd->bitfields2.atomic = TC_OP_ATOMIC_CMPSWAP_RTN_64; + break; + case CommandWriter::kAtomicSwap: + atomicCmd->src_data_lo = Low32(value); + atomicCmd->src_data_hi = High32(value); + atomicCmd->bitfields2.atomic = TC_OP_ATOMIC_SWAP_RTN_64; + break; + default: + assert((false) && "Atomic operation id is invalid"); + } + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, atomicTemplate); +} + +void Gfx9CmdWriter::BuildBarrierCommand(CmdBuf* cmdBuf) { + APPEND_COMMAND_WRAPPER(cmdBuf, pending_dispatch_template_); +} + +void Gfx9CmdWriter::BuildWriteDataCommand(CmdBuf* cmdbuf, uint32_t* write_addr, + uint32_t write_value) { + // Copy the initialized command packet and its payload + WriteDataTemplate command = write_data_template_; + + // Encode the user specified address to write to + uint64_t addr = uintptr_t(write_addr); + assert(!(addr & 0x3) && "WriteData address must be 4 byte aligned"); + + // Specify the value to write + command.write_data_value = write_value; + + // Test Code to see if this makes a difference + command.write_data.dst_mem_addr_hi = PtrHigh32(write_addr); + command.write_data.bitfields3c.dst_mem_addr_lo = (PtrLow32(write_addr) >> 2); + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, command); +} + +void Gfx9CmdWriter::BuildWriteData64Command(CmdBuf* cmdbuf, uint64_t* write_addr, + uint64_t write_value) { + // Copy the initialized command packet and its payload + WriteData64Template command = write_data64_template_; + + // Encode the user specified address to write to + uint64_t addr = uintptr_t(write_addr); + assert(!(addr & 0x3) && "WriteData address must be 4 byte aligned"); + + command.write_data.bitfields3c.dst_mem_addr_lo = (PtrLow32(write_addr) >> 2); + command.write_data.dst_mem_addr_hi = PtrHigh32(write_addr); + + // Specify the value to write + command.write_data_value = write_value; + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, command); +} + +void Gfx9CmdWriter::BuildWaitRegMemCommand(CmdBuf* cmdbuf, bool mem_space, uint64_t wait_addr, + bool func_eq, uint32_t mask_val, uint32_t wait_val) { + WaitRegMemTemplate wait_cmd = wait_reg_mem_template_; + + // Apply the space to which addr belongs + if (mem_space) { + wait_cmd.wait_reg_mem.bitfields2.mem_space = mem_space__mec_wait_reg_mem__memory_space; + } else { + wait_cmd.wait_reg_mem.bitfields2.mem_space = mem_space__mec_wait_reg_mem__register_space; + } + + // Apply the function - equal / not equal desired by user + if (func_eq) { + wait_cmd.wait_reg_mem.bitfields2.function = + function__mec_wait_reg_mem__equal_to_the_reference_value; + } else { + wait_cmd.wait_reg_mem.bitfields2.function = + function__mec_wait_reg_mem__not_equal_reference_value; + } + + // Value to use in applying equal / not equal function + wait_cmd.wait_reg_mem.reference = wait_val; + + // Apply the mask on value at address/register + wait_cmd.wait_reg_mem.mask = mask_val; + + // The address to poll should be DWord (4 byte) aligned + // Update upper 32 bit address if addr is not a register + if (mem_space) { + assert(!(wait_addr & 0x3) && "WaitRegMem address must be 4 byte aligned"); + } + wait_cmd.wait_reg_mem.bitfields3a.mem_poll_addr_lo = (Low32(wait_addr) >> 2); + if (mem_space) { + wait_cmd.wait_reg_mem.mem_poll_addr_hi = High32(wait_addr); + } + + // Append the command to cmd stream + APPEND_COMMAND_WRAPPER(cmdbuf, wait_cmd); +} + +void Gfx9CmdWriter::BuildConditionalExecute(CmdBuf* cmdbuf, uint32_t* signal, uint16_t count) { + assert(false && "BuildConditionalExecute method is not implemented"); + /* + ConditionalExecuteTemplate conditional = conditional_template_; + + uint32_t address_low = PtrLow32(signal); + uint32_t address_high = PtrHigh32(signal); + assert(!(address_low & 0x7) && "destination address must be 8 byte aligned"); + + conditional.conditional.boolAddrLo = address_low; + conditional.conditional.boolAddrHi = address_high; + conditional.conditional.execCount = count; + + APPEND_COMMAND_WRAPPER(cmdbuf, conditional); + */ +} + +void Gfx9CmdWriter::BuildUpdateHostAddress(CmdBuf* cmdbuf, uint64_t* addr, int64_t value) { + // If Atomics are supported, use it + if (pcie_atomic_support_) { + BuildAtomicPacket64(cmdbuf, CommandWriter::AtomicType::kAtomicSwap, (volatile uint64_t*)addr, + value); + return; + } + + BuildWriteData64Command(cmdbuf, addr, value); + return; +} + +void Gfx9CmdWriter::BuildBOPNotifyCmd(CmdBuf* cmdbuf, const void* write_addr, uint32_t write_value, + bool interrupt) { + // Initialize the command including its header + EndofKernelNotifyTemplate eop = notify_template_; + PM4MEC_RELEASE_MEM* rel_mem = &eop.release_mem; + + // Program CP to perform various cache operations + // before issuing the write operation commences + rel_mem->bitfields2.tc_action_ena = true; + rel_mem->bitfields2.tc_wb_action_ena = true; + + // Update cmd to write a user specified 32-bit value + rel_mem->data_lo = write_value; + rel_mem->bitfields3.data_sel = data_sel__mec_release_mem__send_32_bit_low; + + // Update cmd with user specified address to write to + rel_mem->address_hi = High32(uint64_t(write_addr)); + rel_mem->bitfields4b.address_lo_64b = (Low32(uint64_t(write_addr) >> 3)); + + // Update cmd to issue interrupt if user has requested it + if (interrupt) { + rel_mem->bitfields3.int_sel = int_sel__mec_release_mem__send_interrupt_after_write_confirm; + } + + // Serialize the command as stream of Dwords + APPEND_COMMAND_WRAPPER(cmdbuf, eop); +} + +void Gfx9CmdWriter::BuildBarrierFenceCommands(CmdBuf* cmdbuf) { + // TODO: temporarily remove the check because some OpenCL tests + // (test_buffers, test_relationals) are failing. + // if (using_cc_memory_policy_) + // return; + AcquireMemTemplate invalidate_src_caches = invalidate_cache_template_; + + // wbINVL2 by default writes-back and invalidates both L1 and L2 + invalidate_src_caches.acquire_mem.bitfields2.coher_cntl = CP_COHER_CNTL__TC_ACTION_ENA_MASK; + invalidate_src_caches.acquire_mem.bitfields2.coher_cntl |= CP_COHER_CNTL__TC_WB_ACTION_ENA_MASK; + + APPEND_COMMAND_WRAPPER(cmdbuf, invalidate_src_caches); +} + +/* +// PM4 packet for profilers +#define PM4_PACKET3 (0xC0000000) +#define PM4_PACKET3_CMD_SHIFT 8 +#define PM4_PACKET3_COUNT_SHIFT 16 + +#define PACKET3(cmd, count) \ + (PM4_PACKET3 | (((count)-1) << PM4_PACKET3_COUNT_SHIFT) | \ + ((cmd) << PM4_PACKET3_CMD_SHIFT)) +*/ + +// Structure to store the event PM4 packet +typedef struct WriteRegPacket_ { uint32_t item[3]; } WriteRegPacket; + +void Gfx9CmdWriter::BuildWriteEventPacket(CmdBuf* cmdbuf, uint32_t event) { + PM4MEC_EVENT_WRITE cp_event_initiator; + memset(&cp_event_initiator, 0, sizeof(PM4MEC_EVENT_WRITE)); + cp_event_initiator.ordinal1 = + PM4_TYPE3_HDR(IT_EVENT_WRITE, (sizeof(PM4MEC_EVENT_WRITE) / sizeof(uint32_t))); + cp_event_initiator.ordinal2 = 0; + + VGT_EVENT_TYPE eventType = Reserved_0x00; + switch (event) { + case kPerfCntrsStart: + eventType = PERFCOUNTER_START; + break; + case kPerfCntrsStop: + eventType = PERFCOUNTER_STOP; + break; + case kPerfCntrsSample: + eventType = PERFCOUNTER_SAMPLE; + break; + default: + assert(false && "Illegal VGT Event Id"); + } + + MEC_EVENT_WRITE_event_index_enum index; + index = event_index__mec_event_write__other; + cp_event_initiator.bitfields2.event_index = index; + cp_event_initiator.bitfields2.event_type = eventType; + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, cp_event_initiator); +} + +void Gfx9CmdWriter::BuildWriteUnshadowRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value) { + WriteRegPacket packet; + packet.item[0] = + PM4_TYPE3_HDR(IT_SET_UCONFIG_REG, (1 + sizeof(PM4MEC_SET_CONFIG_REG) / sizeof(uint32_t))); + packet.item[1] = (addr - UCONFIG_SPACE_START); + packet.item[2] = value; + + APPEND_COMMAND_WRAPPER(cmdbuf, packet); +} + +void Gfx9CmdWriter::BuildWriteUConfigRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value) { + WriteRegPacket packet; + packet.item[0] = + PM4_TYPE3_HDR(IT_SET_UCONFIG_REG, (1 + sizeof(PM4MEC_SET_CONFIG_REG) / sizeof(uint32_t))); + packet.item[1] = (addr - UCONFIG_SPACE_START); + packet.item[2] = value; + + APPEND_COMMAND_WRAPPER(cmdbuf, packet); +} + +void Gfx9CmdWriter::BuildWriteShRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value) { + WriteRegPacket packet; + packet.item[0] = + PM4_TYPE3_HDR(IT_SET_SH_REG, (1 + sizeof(PM4MEC_SET_CONFIG_REG) / sizeof(uint32_t))); + packet.item[1] = (addr - PERSISTENT_SPACE_START); + packet.item[2] = value; + + APPEND_COMMAND_WRAPPER(cmdbuf, packet); +} + +void Gfx9CmdWriter::BuildCopyDataPacket(CmdBuf* cmdbuf, uint32_t src_sel, uint32_t src_addr_lo, + uint32_t src_addr_hi, uint32_t* dst_addr, uint32_t size, + bool wait) { + PM4MEC_COPY_DATA cmd_data; + memset(&cmd_data, 0, sizeof(PM4MEC_COPY_DATA)); + cmd_data.ordinal1 = PM4_TYPE3_HDR(IT_COPY_DATA, (sizeof(PM4MEC_COPY_DATA) / sizeof(uint32_t))); + + MEC_COPY_DATA_src_sel_enum data_src = src_sel__mec_copy_data__memory; + switch (src_sel) { + case 0: + data_src = src_sel__mec_copy_data__mem_mapped_register; + break; + case 4: + data_src = src_sel__mec_copy_data__perfcounters; + break; + default: + assert(false && "CopyData Illegal value for source of data"); + break; + } + cmd_data.bitfields2.src_sel = data_src; + cmd_data.bitfields2.src_cache_policy = src_cache_policy__mec_copy_data__stream; + + cmd_data.bitfields2.dst_sel = dst_sel__mec_copy_data__memory; + cmd_data.bitfields2.dst_cache_policy = dst_cache_policy__mec_copy_data__stream; + + cmd_data.bitfields2.wr_confirm = (MEC_COPY_DATA_wr_confirm_enum)wait; + cmd_data.bitfields2.count_sel = (size == 0) ? count_sel__mec_copy_data__32_bits_of_data + : count_sel__mec_copy_data__64_bits_of_data; + + // Specify the source register offset + cmd_data.bitfields3a.src_reg_offset = src_addr_lo; + + // Specify the destination memory address + cmd_data.dst_addr_hi = PtrHigh32(dst_addr); + if (size == 0) { + cmd_data.bitfields5b.dst_32b_addr_lo = (PtrLow32(dst_addr) >> 2); + } else { + cmd_data.bitfields5c.dst_64b_addr_lo = (PtrLow32(dst_addr) >> 3); + } + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, cmd_data); +} + +void Gfx9CmdWriter::BuildCacheFlushPacket(CmdBuf* cmdbuf) { + // Initialize the command header + PM4MEC_ACQUIRE_MEM cache_flush = invalidate_cache_template_.acquire_mem; + + // Program Coherence Control Register. Initialize L2 Cache flush + // for Non-Coherent memory blocks + uint32_t coher_cntl = 0; + + coher_cntl |= CP_COHER_CNTL__TC_ACTION_ENA_MASK; + coher_cntl |= CP_COHER_CNTL__TCL1_ACTION_ENA_MASK; + coher_cntl |= CP_COHER_CNTL__TC_WB_ACTION_ENA_MASK; + coher_cntl |= CP_COHER_CNTL__SH_ICACHE_ACTION_ENA_MASK; + coher_cntl |= CP_COHER_CNTL__SH_KCACHE_ACTION_ENA_MASK; + cache_flush.bitfields2.coher_cntl = coher_cntl; + + // Copy AcquireMem command buffer stream + APPEND_COMMAND_WRAPPER(cmdbuf, cache_flush); +} + +void Gfx9CmdWriter::BuildWriteWaitIdlePacket(CmdBuf* cmdbuf) { + BuildBarrierCommand(cmdbuf); + BuildCacheFlushPacket(cmdbuf); +} + +// Will issue a VGT event including a cache flush later on +void Gfx9CmdWriter::BuildVgtEventPacket(CmdBuf* cmdbuf, uint32_t vgtEvent) { + PM4MEC_EVENT_WRITE cp_event_initiator; + memset(&cp_event_initiator, 0, sizeof(PM4MEC_EVENT_WRITE)); + cp_event_initiator.ordinal1 = + PM4_TYPE3_HDR(IT_EVENT_WRITE, (sizeof(PM4MEC_EVENT_WRITE) / sizeof(uint32_t))); + cp_event_initiator.ordinal2 = 0; + + VGT_EVENT_TYPE eventType = Reserved_0x00; + switch (vgtEvent) { + case kPerfCntrsStart: + eventType = PERFCOUNTER_START; + break; + case kPerfCntrsStop: + eventType = PERFCOUNTER_STOP; + break; + case kPerfCntrsSample: + eventType = PERFCOUNTER_SAMPLE; + break; + case kThrdTraceStart: + eventType = THREAD_TRACE_START; + break; + case kThrdTraceStop: + eventType = THREAD_TRACE_STOP; + break; + case kThrdTraceFlush: + eventType = THREAD_TRACE_FLUSH; + break; + case kThrdTraceFinish: + eventType = THREAD_TRACE_FINISH; + break; + default: + assert(false && "Illegal VGT Event Id"); + } + + MEC_EVENT_WRITE_event_index_enum index; + index = event_index__mec_event_write__other; + cp_event_initiator.bitfields2.event_index = index; + cp_event_initiator.bitfields2.event_type = eventType; + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, cp_event_initiator); + + // Check If I should be issuing a cache flush operation as well + // test and remove it + BuildCacheFlushPacket(cmdbuf); +} + +void Gfx9CmdWriter::BuildWriteRegisterPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value) { + /* + WriteRegPacket packet; + packet.item[0] = (PM4_TYPE3_HDR( + IT_SET_CONFIG_REG, 1 + PM4_CMD_SET_CONFIG_REG_DWORDS, ShaderGraphics, 0)); + packet.item[1] = addr - CONFIG_SPACE_START; + packet.item[2] = value; + + APPEND_COMMAND_WRAPPER(cmdbuf, packet); + + return; + */ +} + +void Gfx9CmdWriter::BuildWriteEventQueryPacket(CmdBuf* cmdbuf, uint32_t event, uint32_t* addr) { + PM4MEC_EVENT_WRITE_QUERY cp_event_initiator; + memset(&cp_event_initiator, 0, sizeof(PM4MEC_EVENT_WRITE_QUERY)); + cp_event_initiator.ordinal1 = + PM4_TYPE3_HDR(IT_EVENT_WRITE, (sizeof(PM4MEC_EVENT_WRITE_QUERY) / sizeof(uint32_t))); + cp_event_initiator.ordinal2 = 0; + + // Update switch statements you want to support + VGT_EVENT_TYPE eventType = Reserved_0x00; + switch (event) { + default: + assert(false && "Illegal VGT Event Id"); + } + + MEC_EVENT_WRITE_event_index_enum index; + cp_event_initiator.bitfields2.event_type = eventType; + index = (MEC_EVENT_WRITE_event_index_enum)EventTypeToIndexTable[eventType]; + cp_event_initiator.bitfields2.event_index = index; + + // set the address + uint32_t addrLo = PtrLow32(addr); + uint32_t addrHi = PtrHigh32(addr); + ((addrLo & 0x7) != 0) ? assert(false) : assert(true); + + cp_event_initiator.address_hi = addrHi; + cp_event_initiator.bitfields3.address_lo = (addrLo >> 3); + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, cp_event_initiator); +} + +size_t Gfx9CmdWriter::SizeOfAtomicPacket() const { + return sizeof(AtomicTemplate) / sizeof(uint32_t); +} + +void Gfx9CmdWriter::BuildFlushCacheCmd(CmdBuf* cmdbuf, FlushCacheOptions* options, + uint32_t* writeAddr, uint32_t writeVal) { + PM4MEC_ACQUIRE_MEM cache_flush = invalidate_cache_template_.acquire_mem; + + // Verify write back address is valid. Note that this address is NOT + // used on CI. But to have a same interface as that on SI, we keep + // the address argument in this function. Thus, this check always pass + // no matter the address is NULL or not. + (writeAddr == NULL) ? assert(true) : assert(true); + + // Program Coherence Control Register. Initialize L2 Cache flush + // for Non-Coherent memory blocks + uint32_t coher_cntl = 0; + coher_cntl |= (options->l1) ? CP_COHER_CNTL__TCL1_ACTION_ENA_MASK : 0; + coher_cntl |= (options->l2) + ? (CP_COHER_CNTL__TC_ACTION_ENA_MASK | CP_COHER_CNTL__TC_WB_ACTION_ENA_MASK) + : 0; + coher_cntl |= (options->icache) ? CP_COHER_CNTL__SH_ICACHE_ACTION_ENA_MASK : 0; + coher_cntl |= (options->kcache) ? CP_COHER_CNTL__SH_KCACHE_ACTION_ENA_MASK : 0; + cache_flush.bitfields2.coher_cntl = coher_cntl; + + // Append the built command into output Command Buffer + APPEND_COMMAND_WRAPPER(cmdbuf, cache_flush); + return; +} + +void Gfx9CmdWriter::BuildDmaDataPacket(CmdBuf* cmdbuf, uint32_t* srcAddr, uint32_t* dstAddr, + uint32_t copySize, bool waitForConfirm) { + PM4MEC_DMA_DATA cmdDmaData; + memset(&cmdDmaData, 0, sizeof(PM4MEC_DMA_DATA)); + cmdDmaData.header.u32All = + PM4_TYPE3_HDR(IT_DMA_DATA, (sizeof(PM4MEC_DMA_DATA) / sizeof(uint32_t))); + + // Specify attributes of source buffer such as its + // location and Cache policy + cmdDmaData.bitfields2.src_sel = src_sel__mec_dma_data__src_addr_using_sas; + cmdDmaData.bitfields2.src_cache_policy = src_cache_policy__mec_dma_data__stream; + + // Specify attributes of destination buffer such as its + // location and Cache policy + cmdDmaData.bitfields2.dst_sel = dst_sel__mec_dma_data__dst_addr_using_das; + cmdDmaData.bitfields2.dst_cache_policy = dst_cache_policy__mec_dma_data__stream; + + // Specify the source and destination addr + cmdDmaData.src_addr_lo_or_data = PtrLow32(srcAddr); + cmdDmaData.src_addr_hi = PtrHigh32(srcAddr); + cmdDmaData.dst_addr_lo = PtrLow32(dstAddr); + cmdDmaData.dst_addr_hi = PtrHigh32(dstAddr); + + // Number of bytes to copy. The command restricts + // the size to be (64 MB - 1) - 26 Bits + assert(copySize < 0x1FFFFF); + cmdDmaData.bitfields7.byte_count = copySize; + + // Indicate that DMA Cmd should wait if its source + // is the destination of a previous DMA Cmd + cmdDmaData.bitfields7.raw_wait = waitForConfirm; + + APPEND_COMMAND_WRAPPER(cmdbuf, cmdDmaData); + return; +} + + +} // gfx9 namespace + +} // pm4_profile diff --git a/runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmdwriter.h b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmdwriter.h new file mode 100644 index 0000000000..fe7e3ce216 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/commandwriter/gfx9_cmdwriter.h @@ -0,0 +1,199 @@ +#ifndef _GFX9_CMDWRITER_H_ +#define _GFX9_CMDWRITER_H_ + +#include "cmdwriter.h" +#include "gfx9_cmds.h" + +namespace pm4_profile { + +namespace gfx9 { + + +/// @brief class Gfx9CmdWriter implements the virtual class CommandWriter +/// for GFX9 chipsets +class Gfx9CmdWriter : public CommandWriter { + public: + Gfx9CmdWriter(bool atc_support, bool pcie_atomic_support); + + /// @brief Dword specifying NOOP command for GFX9 chipsets. The macro + /// populates the NOOP command which is 32-bits wide. The second parameter, + /// the COUNT field of NOOP command, specifies the number of Dwords to skip. + /// To skip ZERO Dwords the value should be set to 0x3FFF. Since the macro + /// decrements the second parameter by TWO, an artifact of its definition, + /// the value is incremented by TWO to 0x4001 (0x3FFF + 2). + /// + inline uint32_t GetNoOpCmd() { + static const uint32_t nopCmd = PM4_TYPE3_HDR(IT_NOP, 0x4001); + return nopCmd; + } + + void BuildBarrierCommand(CmdBuf* cmdBuf); + + void BuildIndirectBufferCmd(CmdBuf* cmdbuf, const void* cmd_addr, std::size_t cmd_size); + + void BuildBOPNotifyCmd(CmdBuf* cmdbuf, const void* write_addr, uint32_t write_val, + bool interrupt); + + void BuildBarrierFenceCommands(CmdBuf* cmdbuf); + + void BuildWriteEventPacket(CmdBuf* cmdbuf, uint32_t event); + + void BuildWaitRegMemCommand(CmdBuf* cmdbuf, bool mem_space, uint64_t wait_addr, bool func_eq, + uint32_t mask_val, uint32_t wait_val); + + void BuildWriteUnshadowRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value); + + /// @brief Build CP command to program a Gpu register + /// + /// @param cmdbuf Pointer to command buffer to be appended + /// @param addr Register to be programmed + /// @param value Value to write into register + /// + /// @return void + void BuildWriteUConfigRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value); + + void BuildWriteShRegPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value); + + void BuildCopyDataPacket(CmdBuf* cmdbuf, uint32_t src_sel, uint32_t src_addr_lo, + uint32_t src_addr_hi, uint32_t* dst_addr, uint32_t size, bool wait); + + void BuildWriteWaitIdlePacket(CmdBuf* cmdbuf); + + // Will issue a VGT event including a cache flush later on + void BuildVgtEventPacket(CmdBuf* cmdbuf, uint32_t vgtEvent); + + void BuildWriteRegisterPacket(CmdBuf* cmdbuf, uint32_t addr, uint32_t value); + + void BuildWriteEventQueryPacket(CmdBuf* cmdbuf, uint32_t event, uint32_t* addr); + + void BuildAtomicPacket(CmdBuf* cmdbuf, AtomicType atomic_op, volatile uint32_t* addr, + uint32_t value, uint32_t compare); + + void BuildAtomicPacket64(CmdBuf* cmdbuf, AtomicType atomic_op, volatile uint64_t* addr, + uint64_t value = 0, uint64_t compare = 0); + + size_t SizeOfAtomicPacket() const; + + void BuildConditionalExecute(CmdBuf* cmdbuf, uint32_t* signal, uint16_t count); + + void BuildWriteDataCommand(CmdBuf* cmdbuf, uint32_t* write_addr, uint32_t write_value); + + void BuildWriteData64Command(CmdBuf* cmdbuf, uint64_t* write_addr, uint64_t write_value); + + void BuildCacheFlushPacket(CmdBuf* cmdbuf); + + /// Writes into input buffer Gpu commands to flush its cache. It is + /// necessary that the buffer provided for flush commands is large + /// enough to accommodate the full set of commands. It should be at + /// least 512 bytes. + /// + /// @param tsCmdBuf Buffer to write commands to. + /// @param writeAddr Registered address into which GPU should write + /// a user provided value upon executing the flush commands. + /// @param writeVal User provided value written by GPU at user provided + /// address, upon executing the flush commands. + /// + /// @return void + void BuildFlushCacheCmd(CmdBuf* cmdBuf, FlushCacheOptions* options, uint32_t* writeAddr, + uint32_t writeVal); + + /// Builds Gpu command to copy data from source to destination buffer + /// using DMA engine. + /// + /// @param cmdbuf Buffer updated with Gpu copy command + /// @param srcAddr Address of source buffer address + /// @param dstAddr Address of destination buffer address + /// @param copySize Size of data to copy in bytes + /// @param waitForCompletion if command should wait for copying to complete + void BuildDmaDataPacket(CmdBuf* cmdBuf, uint32_t* srcAddr, uint32_t* dstAddr, uint32_t copySize, + bool waitForCompletion); + + protected: + /// @brief Append an instance of Gpu command into input command buffer stream. + /// + /// @param cmdbuf CommandWriter object appended with anohter Gpu command + /// + /// @param cmd Gpu command to be appended into command buffer + /// + /// @return void + template void AppendCommand(CmdBuf* cmdbuf, const T& cmd); + + private: + /// @brief Initializes a Gpu command which can be used to + /// reference a Gpu command stream indirectly + void InitializeLaunchTemplate(); + + /// @brief Initializes a Gpu command which can be used to + /// flush Gpu caches and write to a user configurable address + /// to indicate an end of kernel + void InitializeEndOfKernelNotifyTemplate(); + + /// @brief Initializes a Gpu command to perform atomic operations + //// + void InitializeAtomicTemplate(); + + /// @brief Initializes a Gpu command to allow conditional execution + /// of a Gpu command stream + void InitializeConditionalTemplate(); + + /// @brief Initializes a Gpu command to let command processor + /// wait for some update before letting other commands to be + /// processed + void InitializeWaitRegMemTemplate(); + + /// @brief Initializes the template for Barrier command. + /// Applications can use Barrier command to ensure their + /// command is executed only after all other commands have + /// completed their execution. + void InitializeBarrierTemplate(); + + void BuildUpdateHostAddress(CmdBuf* cmdbuf, uint64_t* addr, int64_t value); + + /// @brief Initializes Acquire Memory command template. Users + /// can submit this command to invalidate Gpu caches - L1 and + /// or L2. + void InitializeAcquireMemTemplate(); + + /// @brief Initializes an instance of Write Data command + /// for use by an application + void InitializeWriteDataTemplate(); + void InitializeWriteData64Template(); + void InitializeWriteDataTemplate(PM4MEC_WRITE_DATA* write_data, bool bit32); + + /// @brief Builds wait_reg_mem with EQUALS condition + void BuildWaitRegMemCommand(CmdBuf* cmdbuf, uint64_t wait_addr, uint32_t wait_value); + + /// @brief Instance of Gpu command to reference dispatch commands + LaunchTemplate launch_template_; + + /// @brief Instance of Gpu command to use in determing end of kernel + EndofKernelNotifyTemplate notify_template_; + + /// @brief Instance of Gpu command to use in performing atomic operations + AtomicTemplate atomic_template_; + + /// @brief Instance of Pm4 command WRITE_DATA + WriteDataTemplate write_data_template_; + WriteData64Template write_data64_template_; + + /// @brief Instance of Pm4 command EVENT_WRITE + BarrierTemplate pending_dispatch_template_; + + /// @brief Instance of Pm4 command ACQUIRE_MEM + AcquireMemTemplate invalidate_cache_template_; + + /// @brief Instance of Pm4 command WAIT_REG_MEM + WaitRegMemTemplate wait_reg_mem_template_; + + /// @brief ATC support. + bool atc_support_; + + /// @brief PCIe atomic support. + bool pcie_atomic_support_; +}; + +} // gfx9 + +} // pm4_profile + +#endif // _GFX9_CMDWRITER_H_ diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/CMakeLists.txt b/runtime/hsa-ext-aql-profile/src/perfcounter/CMakeLists.txt new file mode 100644 index 0000000000..c8902cc036 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/CMakeLists.txt @@ -0,0 +1,24 @@ +# +# Source files for Rocr PerfCntr +# +set ( LIB_SRC var_data.cpp ) +set ( LIB_SRC ${LIB_SRC} info_set.cpp ) +set ( LIB_SRC ${LIB_SRC} parameter_set.cpp ) +set ( LIB_SRC ${LIB_SRC} gpu_counter.cpp ) +set ( LIB_SRC ${LIB_SRC} gpu_countergroup.cpp ) +set ( LIB_SRC ${LIB_SRC} vi_blockinfo.cpp ) +set ( LIB_SRC ${LIB_SRC} vi_pmu.cpp ) +set ( LIB_SRC ${LIB_SRC} ai_blockinfo.cpp ) +set ( LIB_SRC ${LIB_SRC} ai_pmu.cpp ) + +# +# Header files include path(s). +# +include_directories ( $ENV{ROCR_INC_DIR} ) +include_directories ( ${PROJ_DIR}/commandwriter ) +include_directories ( ${CORE_UTIL_DIR} ) + +# +# Build PerfCntr as a Static Library object +# +add_library ( ${PMC_LIB} STATIC ${LIB_SRC} ) diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/ai_blockinfo.cpp b/runtime/hsa-ext-aql-profile/src/perfcounter/ai_blockinfo.cpp new file mode 100644 index 0000000000..f99dbe4b13 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/ai_blockinfo.cpp @@ -0,0 +1,555 @@ +#include "ai_blockinfo.h" +#include "gfxip/gfx9/gfx9_offset.h" +#include "gfxip/gfx9/gfx9_typedef.h" + +namespace pm4_profile { +/** + * Table containing CounterGroups which represent AI hardware blocks + * as defined by \ref GpuBlockInfo structure + */ +GpuBlockInfo AiPmuHwBlocks[] = { + // Counter block CB + {"AI_CB0", kHsaAiCounterBlockIdCb0, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_CB, + CntlMethodBySeAndInstance, 395, AI_COUNTER_NUM_PER_CB, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_CB1", kHsaAiCounterBlockIdCb1, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_CB, + CntlMethodBySeAndInstance, 395, AI_COUNTER_NUM_PER_CB, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_CB2", kHsaAiCounterBlockIdCb2, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_CB, + CntlMethodBySeAndInstance, 395, AI_COUNTER_NUM_PER_CB, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_CB3", kHsaAiCounterBlockIdCb3, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_CB, + CntlMethodBySeAndInstance, 395, AI_COUNTER_NUM_PER_CB, 0, 0, true, 0, 0, false, 0, 0}, + + // Temp commented for Vega10 + // Counter block CPF + /* + {"AI_CPF", kHsaAiCounterBlockIdCpf, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 19, + AI_COUNTER_NUM_PER_CPF, 0, 0, true, 0, 0, false, 0, 0}, + */ + {"AI_CB3", kHsaAiCounterBlockIdCpf, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_CB, + CntlMethodBySeAndInstance, 395, AI_COUNTER_NUM_PER_CB, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block DB + {"AI_DB0", kHsaAiCounterBlockIdDb0, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_DB, + CntlMethodBySeAndInstance, 256, AI_COUNTER_NUM_PER_DB, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_DB1", kHsaAiCounterBlockIdDb1, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_DB, + CntlMethodBySeAndInstance, 256, AI_COUNTER_NUM_PER_DB, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_DB2", kHsaAiCounterBlockIdDb2, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_DB, + CntlMethodBySeAndInstance, 256, AI_COUNTER_NUM_PER_DB, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_DB3", kHsaAiCounterBlockIdDb3, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_DB, + CntlMethodBySeAndInstance, 256, AI_COUNTER_NUM_PER_DB, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block GRBM + {"AI_GRBM", kHsaAiCounterBlockIdGrbm, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 33, + AI_COUNTER_NUM_PER_GRBM, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block GRBMSE + {"AI_GRBMSE", kHsaAiCounterBlockIdGrbmSe, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 14, + AI_COUNTER_NUM_PER_GRBMSE, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block PA_SU + {"AI_PA_SU", kHsaAiCounterBlockIdPaSu, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 152, + AI_COUNTER_NUM_PER_PA_SU, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block PA_SC + {"AI_PA_SC", kHsaAiCounterBlockIdPaSc, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 396, + AI_COUNTER_NUM_PER_PA_SC, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block SPI + {"AI_SPI", kHsaAiCounterBlockIdSpi, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 196, + 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_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}, + {"AI_SQ_VS", kHsaAiCounterBlockIdSqVs, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + AI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_SQ_PS", kHsaAiCounterBlockIdSqPs, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + AI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_SQ_HS", kHsaAiCounterBlockIdSqHs, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + AI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_SQ_CS", kHsaAiCounterBlockIdSqCs, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + AI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block SX + {"AI_SX", kHsaAiCounterBlockIdSx, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 33, + AI_COUNTER_NUM_PER_SX, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block TA + {"AI_TA0", kHsaAiCounterBlockIdTa0, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA1", kHsaAiCounterBlockIdTa1, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA2", kHsaAiCounterBlockIdTa2, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA3", kHsaAiCounterBlockIdTa3, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA4", kHsaAiCounterBlockIdTa4, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA5", kHsaAiCounterBlockIdTa5, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA6", kHsaAiCounterBlockIdTa6, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA7", kHsaAiCounterBlockIdTa7, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA8", kHsaAiCounterBlockIdTa8, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA9", kHsaAiCounterBlockIdTa9, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA10", kHsaAiCounterBlockIdTa10, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA11", kHsaAiCounterBlockIdTa11, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA12", kHsaAiCounterBlockIdTa12, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA13", kHsaAiCounterBlockIdTa13, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA14", kHsaAiCounterBlockIdTa14, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TA15", kHsaAiCounterBlockIdTa15, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TA, + CntlMethodBySeAndInstance, 118, AI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block TCA + {"AI_TCA0", kHsaAiCounterBlockIdTca0, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCA, + CntlMethodByInstance, 34, AI_COUNTER_NUM_PER_TCA, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCA1", kHsaAiCounterBlockIdTca1, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCA, + CntlMethodByInstance, 34, AI_COUNTER_NUM_PER_TCA, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block TCC + {"AI_TCC0", kHsaAiCounterBlockIdTcc0, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC1", kHsaAiCounterBlockIdTcc1, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC2", kHsaAiCounterBlockIdTcc2, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC3", kHsaAiCounterBlockIdTcc3, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC4", kHsaAiCounterBlockIdTcc4, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC5", kHsaAiCounterBlockIdTcc5, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC6", kHsaAiCounterBlockIdTcc6, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC7", kHsaAiCounterBlockIdTcc7, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC8", kHsaAiCounterBlockIdTcc8, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC9", kHsaAiCounterBlockIdTcc9, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC10", kHsaAiCounterBlockIdTcc10, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC11", kHsaAiCounterBlockIdTcc11, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC12", kHsaAiCounterBlockIdTcc12, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC13", kHsaAiCounterBlockIdTcc13, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC14", kHsaAiCounterBlockIdTcc14, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCC15", kHsaAiCounterBlockIdTcc15, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCC, + CntlMethodByInstance, 191, AI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block TD + {"AI_TD0", kHsaAiCounterBlockIdTd0, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD1", kHsaAiCounterBlockIdTd1, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD2", kHsaAiCounterBlockIdTd2, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD3", kHsaAiCounterBlockIdTd3, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD4", kHsaAiCounterBlockIdTd4, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD5", kHsaAiCounterBlockIdTd5, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD6", kHsaAiCounterBlockIdTd6, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD7", kHsaAiCounterBlockIdTd7, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD8", kHsaAiCounterBlockIdTd8, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD9", kHsaAiCounterBlockIdTd9, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD10", kHsaAiCounterBlockIdTd10, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD11", kHsaAiCounterBlockIdTd11, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD12", kHsaAiCounterBlockIdTd12, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD13", kHsaAiCounterBlockIdTd13, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD14", kHsaAiCounterBlockIdTd14, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TD15", kHsaAiCounterBlockIdTd15, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TD, + CntlMethodBySeAndInstance, 54, AI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block TCP + {"AI_TCP0", kHsaAiCounterBlockIdTcp0, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP1", kHsaAiCounterBlockIdTcp1, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP2", kHsaAiCounterBlockIdTcp2, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP3", kHsaAiCounterBlockIdTcp3, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP4", kHsaAiCounterBlockIdTcp4, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP5", kHsaAiCounterBlockIdTcp5, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP6", kHsaAiCounterBlockIdTcp6, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP7", kHsaAiCounterBlockIdTcp7, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP8", kHsaAiCounterBlockIdTcp8, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP9", kHsaAiCounterBlockIdTcp9, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP10", kHsaAiCounterBlockIdTcp10, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP11", kHsaAiCounterBlockIdTcp11, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP12", kHsaAiCounterBlockIdTcp12, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP13", kHsaAiCounterBlockIdTcp13, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP14", kHsaAiCounterBlockIdTcp14, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"AI_TCP15", kHsaAiCounterBlockIdTcp15, AI_MAX_NUM_SHADER_ENGINES, 2, AI_NUM_TCP, + CntlMethodBySeAndInstance, 182, AI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block GDS + {"AI_GDS", kHsaAiCounterBlockIdGds, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 120, + AI_COUNTER_NUM_PER_GDS, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block VGT + {"AI_VGT", kHsaAiCounterBlockIdVgt, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 145, + AI_COUNTER_NUM_PER_VGT, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block IA + {"AI_IA", kHsaAiCounterBlockIdIa, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 23, + AI_COUNTER_NUM_PER_IA, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block MC + {"AI_MC", kHsaAiCounterBlockIdMc, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 22, + AI_COUNTER_NUM_PER_MC, 0, 0, true, 0, 0, false, 0, 0}, + + // Temp commented out for Vega10 + // Counter block SRBM + /* + {"AI_SRBM", kHsaAiCounterBlockIdSrbm, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 19, + AI_COUNTER_NUM_PER_SRBM, 0, 0, true, 0, 0, false, 0, 0}, + */ + + // Counter block WD + {"AI_WD", kHsaAiCounterBlockIdWd, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 36, + AI_COUNTER_NUM_PER_WD, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block CPG + // Temp commented for Vega10 + /* + {"AI_CPG", kHsaAiCounterBlockIdCpg, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 48, + AI_COUNTER_NUM_PER_CPG, 0, 0, true, 0, 0, false, 0, 0}, + */ + + // 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}, + */ + + // Counter block IOMMUV2 + {"AI_IOMMUV2", kHsaAiCounterBlockIdIommuV2, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 25, + 8, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block KernelDriver + {"AI_KD", kHsaAiCounterBlockIdKernelDriver, AI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 0, + 0, 0, 0, true, 0, 0, false, 0, 0}, + + // Name of the last line should be empty to indicate end of all counter groups + {"", kHsaAiCounterBlockIdBlocksLast, 0, 0, 0, CntlMethodNone, 0, 0, 0, 0, false, 0, 0, false, 0, + 0}}; + +/* + * The following tables contain register addresses of the SQ counter registers + */ + +/* + * SQ + */ +GpuCounterRegInfo AiSqCounterRegAddr[] = { + {mmSQ_PERFCOUNTER0_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER0_LO, mmSQ_PERFCOUNTER0_HI}, + {mmSQ_PERFCOUNTER1_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER1_LO, mmSQ_PERFCOUNTER1_HI}, + {mmSQ_PERFCOUNTER2_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER2_LO, mmSQ_PERFCOUNTER2_HI}, + {mmSQ_PERFCOUNTER3_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER3_LO, mmSQ_PERFCOUNTER3_HI}, + {mmSQ_PERFCOUNTER4_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER4_LO, mmSQ_PERFCOUNTER4_HI}, + {mmSQ_PERFCOUNTER5_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER5_LO, mmSQ_PERFCOUNTER5_HI}, + {mmSQ_PERFCOUNTER6_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER6_LO, mmSQ_PERFCOUNTER6_HI}, + {mmSQ_PERFCOUNTER7_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER7_LO, mmSQ_PERFCOUNTER7_HI}, + {mmSQ_PERFCOUNTER8_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER8_LO, mmSQ_PERFCOUNTER8_HI}, + {mmSQ_PERFCOUNTER9_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER9_LO, mmSQ_PERFCOUNTER9_HI}, + {mmSQ_PERFCOUNTER10_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER10_LO, + mmSQ_PERFCOUNTER10_HI}, + {mmSQ_PERFCOUNTER11_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER11_LO, + mmSQ_PERFCOUNTER11_HI}, + {mmSQ_PERFCOUNTER12_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER12_LO, + mmSQ_PERFCOUNTER12_HI}, + {mmSQ_PERFCOUNTER13_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER13_LO, + mmSQ_PERFCOUNTER13_HI}, + {mmSQ_PERFCOUNTER14_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER14_LO, + mmSQ_PERFCOUNTER14_HI}, + {mmSQ_PERFCOUNTER15_SELECT, mmSQ_PERFCOUNTER_CTRL, mmSQ_PERFCOUNTER15_LO, + mmSQ_PERFCOUNTER15_HI}}; + +/* + * DRMDMA + */ +GpuCounterRegInfo AiDrmdmaCounterRegAddr[] = { + {mmSDMA0_PERFMON_CNTL, 0, mmSDMA0_PERFCOUNTER0_RESULT, 0}, + {mmSDMA0_PERFMON_CNTL, 0, mmSDMA0_PERFCOUNTER1_RESULT, 0}, + {mmSDMA1_PERFMON_CNTL, 0, mmSDMA1_PERFCOUNTER0_RESULT, 0}, + {mmSDMA1_PERFMON_CNTL, 0, mmSDMA1_PERFCOUNTER1_RESULT, 0}, +}; + +/* + * IH + */ +GpuCounterRegInfo AiIhCounterRegAddr[] = {{mmIH_PERFMON_CNTL, 0, mmIH_PERFCOUNTER0_RESULT, 0}, + {mmIH_PERFMON_CNTL, 0, mmIH_PERFCOUNTER1_RESULT, 0}}; + +/* + * CPF + */ +GpuCounterRegInfo AiCpfCounterRegAddr[] = { + {mmCPF_PERFCOUNTER0_SELECT, 0, mmCPF_PERFCOUNTER0_LO, mmCPF_PERFCOUNTER0_HI}, + {mmCPF_PERFCOUNTER1_SELECT, 0, mmCPF_PERFCOUNTER1_LO, mmCPF_PERFCOUNTER1_HI}}; + +/* + * DRM + */ +GpuCounterRegInfo AiDrmCounterRegAddr[] = { + /* + {mmDRM_PERFCOUNTER1_SELECT, 0, mmDRM_PERFCOUNTER1_LO, mmDRM_PERFCOUNTER1_HI}, + {mmDRM_PERFCOUNTER2_SELECT, 0, mmDRM_PERFCOUNTER2_LO, mmDRM_PERFCOUNTER2_HI} + */ +}; + +/* + * GRBM + */ +GpuCounterRegInfo AiGrbmCounterRegAddr[] = { + {mmGRBM_PERFCOUNTER0_SELECT, 0, mmGRBM_PERFCOUNTER0_LO, mmGRBM_PERFCOUNTER0_HI}, + {mmGRBM_PERFCOUNTER1_SELECT, 0, mmGRBM_PERFCOUNTER1_LO, mmGRBM_PERFCOUNTER1_HI}}; + +/* + * GRBM_SE + */ +GpuCounterRegInfo AiGrbmSeCounterRegAddr[] = { + {mmGRBM_SE0_PERFCOUNTER_SELECT, 0, mmGRBM_SE0_PERFCOUNTER_LO, mmGRBM_SE0_PERFCOUNTER_HI}, + {mmGRBM_SE1_PERFCOUNTER_SELECT, 0, mmGRBM_SE1_PERFCOUNTER_LO, mmGRBM_SE1_PERFCOUNTER_HI}, + {mmGRBM_SE2_PERFCOUNTER_SELECT, 0, mmGRBM_SE2_PERFCOUNTER_LO, mmGRBM_SE2_PERFCOUNTER_HI}, + {mmGRBM_SE3_PERFCOUNTER_SELECT, 0, mmGRBM_SE3_PERFCOUNTER_LO, mmGRBM_SE3_PERFCOUNTER_HI}}; + +/* + * PA_SU + */ +GpuCounterRegInfo AiPaSuCounterRegAddr[] = { + {mmPA_SU_PERFCOUNTER0_SELECT, 0, mmPA_SU_PERFCOUNTER0_LO, mmPA_SU_PERFCOUNTER0_HI}, + {mmPA_SU_PERFCOUNTER1_SELECT, 0, mmPA_SU_PERFCOUNTER1_LO, mmPA_SU_PERFCOUNTER1_HI}, + {mmPA_SU_PERFCOUNTER2_SELECT, 0, mmPA_SU_PERFCOUNTER2_LO, mmPA_SU_PERFCOUNTER2_HI}, + {mmPA_SU_PERFCOUNTER3_SELECT, 0, mmPA_SU_PERFCOUNTER3_LO, mmPA_SU_PERFCOUNTER3_HI}}; + +/* + * PA_SC + */ +GpuCounterRegInfo AiPaScCounterRegAddr[] = { + {mmPA_SC_PERFCOUNTER0_SELECT, 0, mmPA_SC_PERFCOUNTER0_LO, mmPA_SC_PERFCOUNTER0_HI}, + {mmPA_SC_PERFCOUNTER1_SELECT, 0, mmPA_SC_PERFCOUNTER1_LO, mmPA_SC_PERFCOUNTER1_HI}, + {mmPA_SC_PERFCOUNTER2_SELECT, 0, mmPA_SC_PERFCOUNTER2_LO, mmPA_SC_PERFCOUNTER2_HI}, + {mmPA_SC_PERFCOUNTER3_SELECT, 0, mmPA_SC_PERFCOUNTER3_LO, mmPA_SC_PERFCOUNTER3_HI}}; + +/* + * SPI + */ +GpuCounterRegInfo AiSpiCounterRegAddr[] = { + {mmSPI_PERFCOUNTER0_SELECT, 0, mmSPI_PERFCOUNTER0_LO, mmSPI_PERFCOUNTER0_HI}, + {mmSPI_PERFCOUNTER1_SELECT, 0, mmSPI_PERFCOUNTER1_LO, mmSPI_PERFCOUNTER1_HI}, + {mmSPI_PERFCOUNTER2_SELECT, 0, mmSPI_PERFCOUNTER2_LO, mmSPI_PERFCOUNTER2_HI}, + {mmSPI_PERFCOUNTER3_SELECT, 0, mmSPI_PERFCOUNTER3_LO, mmSPI_PERFCOUNTER3_HI}, + {mmSPI_PERFCOUNTER4_SELECT, 0, mmSPI_PERFCOUNTER4_LO, mmSPI_PERFCOUNTER4_HI}, + {mmSPI_PERFCOUNTER5_SELECT, 0, mmSPI_PERFCOUNTER5_LO, mmSPI_PERFCOUNTER5_HI}}; + +/* + * TCA + */ +GpuCounterRegInfo AiTcaCounterRegAddr[] = { + {mmTCA_PERFCOUNTER0_SELECT, 0, mmTCA_PERFCOUNTER0_LO, mmTCA_PERFCOUNTER0_HI}, + {mmTCA_PERFCOUNTER1_SELECT, 0, mmTCA_PERFCOUNTER1_LO, mmTCA_PERFCOUNTER1_HI}, + {mmTCA_PERFCOUNTER2_SELECT, 0, mmTCA_PERFCOUNTER2_LO, mmTCA_PERFCOUNTER2_HI}, + {mmTCA_PERFCOUNTER3_SELECT, 0, mmTCA_PERFCOUNTER3_LO, mmTCA_PERFCOUNTER3_HI}}; + +/* + * TCC + */ +GpuCounterRegInfo AiTccCounterRegAddr[] = { + {mmTCC_PERFCOUNTER0_SELECT, 0, mmTCC_PERFCOUNTER0_LO, mmTCC_PERFCOUNTER0_HI}, + {mmTCC_PERFCOUNTER1_SELECT, 0, mmTCC_PERFCOUNTER1_LO, mmTCC_PERFCOUNTER1_HI}, + {mmTCC_PERFCOUNTER2_SELECT, 0, mmTCC_PERFCOUNTER2_LO, mmTCC_PERFCOUNTER2_HI}, + {mmTCC_PERFCOUNTER3_SELECT, 0, mmTCC_PERFCOUNTER3_LO, mmTCC_PERFCOUNTER3_HI}}; + +/* + * TCP + */ +GpuCounterRegInfo AiTcpCounterRegAddr[] = { + {mmTCP_PERFCOUNTER0_SELECT, 0, mmTCP_PERFCOUNTER0_LO, mmTCP_PERFCOUNTER0_HI}, + {mmTCP_PERFCOUNTER1_SELECT, 0, mmTCP_PERFCOUNTER1_LO, mmTCP_PERFCOUNTER1_HI}, + {mmTCP_PERFCOUNTER2_SELECT, 0, mmTCP_PERFCOUNTER2_LO, mmTCP_PERFCOUNTER2_HI}, + {mmTCP_PERFCOUNTER3_SELECT, 0, mmTCP_PERFCOUNTER3_LO, mmTCP_PERFCOUNTER3_HI}}; + +/* + * CB + */ +GpuCounterRegInfo AiCbCounterRegAddr[] = { + {mmCB_PERFCOUNTER0_SELECT, 0, mmCB_PERFCOUNTER0_LO, mmCB_PERFCOUNTER0_HI}, + {mmCB_PERFCOUNTER1_SELECT, 0, mmCB_PERFCOUNTER1_LO, mmCB_PERFCOUNTER1_HI}, + {mmCB_PERFCOUNTER2_SELECT, 0, mmCB_PERFCOUNTER2_LO, mmCB_PERFCOUNTER2_HI}, + {mmCB_PERFCOUNTER3_SELECT, 0, mmCB_PERFCOUNTER3_LO, mmCB_PERFCOUNTER3_HI}}; + +/* + * DB + */ +GpuCounterRegInfo AiDbCounterRegAddr[] = { + {mmDB_PERFCOUNTER0_SELECT, 0, mmDB_PERFCOUNTER0_LO, mmDB_PERFCOUNTER0_HI}, + {mmDB_PERFCOUNTER1_SELECT, 0, mmDB_PERFCOUNTER1_LO, mmDB_PERFCOUNTER1_HI}, + {mmDB_PERFCOUNTER2_SELECT, 0, mmDB_PERFCOUNTER2_LO, mmDB_PERFCOUNTER2_HI}, + {mmDB_PERFCOUNTER3_SELECT, 0, mmDB_PERFCOUNTER3_LO, mmDB_PERFCOUNTER3_HI}}; + +/* + * RLC + */ +GpuCounterRegInfo AiRlcCounterRegAddr[] = { + {mmRLC_PERFCOUNTER0_SELECT, 0, mmRLC_PERFCOUNTER0_LO, mmRLC_PERFCOUNTER0_HI}, + {mmRLC_PERFCOUNTER1_SELECT, 0, mmRLC_PERFCOUNTER1_LO, mmRLC_PERFCOUNTER1_HI}}; + +/* + * SC + */ +GpuCounterRegInfo AiScCounterRegAddr[] = { + {mmPA_SC_PERFCOUNTER0_SELECT, 0, mmPA_SC_PERFCOUNTER0_LO, mmPA_SC_PERFCOUNTER0_HI}, + {mmPA_SC_PERFCOUNTER1_SELECT, 0, mmPA_SC_PERFCOUNTER1_LO, mmPA_SC_PERFCOUNTER1_HI}, + {mmPA_SC_PERFCOUNTER2_SELECT, 0, mmPA_SC_PERFCOUNTER2_LO, mmPA_SC_PERFCOUNTER2_HI}, + {mmPA_SC_PERFCOUNTER3_SELECT, 0, mmPA_SC_PERFCOUNTER3_LO, mmPA_SC_PERFCOUNTER3_HI}, + {mmPA_SC_PERFCOUNTER4_SELECT, 0, mmPA_SC_PERFCOUNTER4_LO, mmPA_SC_PERFCOUNTER4_HI}, + {mmPA_SC_PERFCOUNTER5_SELECT, 0, mmPA_SC_PERFCOUNTER5_LO, mmPA_SC_PERFCOUNTER5_HI}, + {mmPA_SC_PERFCOUNTER6_SELECT, 0, mmPA_SC_PERFCOUNTER6_LO, mmPA_SC_PERFCOUNTER6_HI}, + {mmPA_SC_PERFCOUNTER7_SELECT, 0, mmPA_SC_PERFCOUNTER7_LO, mmPA_SC_PERFCOUNTER7_HI}}; + +/* + * SX + */ +GpuCounterRegInfo AiSxCounterRegAddr[] = { + {mmSX_PERFCOUNTER0_SELECT, 0, mmSX_PERFCOUNTER0_LO, mmSX_PERFCOUNTER0_HI}, + {mmSX_PERFCOUNTER1_SELECT, 0, mmSX_PERFCOUNTER1_LO, mmSX_PERFCOUNTER1_HI}, + {mmSX_PERFCOUNTER2_SELECT, 0, mmSX_PERFCOUNTER2_LO, mmSX_PERFCOUNTER2_HI}, + {mmSX_PERFCOUNTER3_SELECT, 0, mmSX_PERFCOUNTER3_LO, mmSX_PERFCOUNTER3_HI}}; + +/* + * TA + */ +GpuCounterRegInfo AiTaCounterRegAddr[] = { + {mmTA_PERFCOUNTER0_SELECT, 0, mmTA_PERFCOUNTER0_LO, mmTA_PERFCOUNTER0_HI}, + {mmTA_PERFCOUNTER1_SELECT, 0, mmTA_PERFCOUNTER1_LO, mmTA_PERFCOUNTER1_HI}}; + +/* + * TD + */ +GpuCounterRegInfo AiTdCounterRegAddr[] = { + {mmTD_PERFCOUNTER0_SELECT, 0, mmTD_PERFCOUNTER0_LO, mmTD_PERFCOUNTER0_HI}, + {mmTD_PERFCOUNTER1_SELECT, 0, mmTD_PERFCOUNTER1_LO, mmTD_PERFCOUNTER1_HI}}; + +/* + * GDS + */ +GpuCounterRegInfo AiGdsCounterRegAddr[] = { + {mmGDS_PERFCOUNTER0_SELECT, 0, mmGDS_PERFCOUNTER0_LO, mmGDS_PERFCOUNTER0_HI}, + {mmGDS_PERFCOUNTER1_SELECT, 0, mmGDS_PERFCOUNTER1_LO, mmGDS_PERFCOUNTER1_HI}, + {mmGDS_PERFCOUNTER2_SELECT, 0, mmGDS_PERFCOUNTER2_LO, mmGDS_PERFCOUNTER2_HI}, + {mmGDS_PERFCOUNTER3_SELECT, 0, mmGDS_PERFCOUNTER3_LO, mmGDS_PERFCOUNTER3_HI}}; + +/* + * VGT + */ +GpuCounterRegInfo AiVgtCounterRegAddr[] = { + {mmVGT_PERFCOUNTER0_SELECT, 0, mmVGT_PERFCOUNTER0_LO, mmVGT_PERFCOUNTER0_HI}, + {mmVGT_PERFCOUNTER1_SELECT, 0, mmVGT_PERFCOUNTER1_LO, mmVGT_PERFCOUNTER1_HI}, + {mmVGT_PERFCOUNTER2_SELECT, 0, mmVGT_PERFCOUNTER2_LO, mmVGT_PERFCOUNTER2_HI}, + {mmVGT_PERFCOUNTER3_SELECT, 0, mmVGT_PERFCOUNTER3_LO, mmVGT_PERFCOUNTER3_HI}}; + +/* + * IA + */ +GpuCounterRegInfo AiIaCounterRegAddr[] = { + {mmIA_PERFCOUNTER0_SELECT, 0, mmIA_PERFCOUNTER0_LO, mmIA_PERFCOUNTER0_HI}, + {mmIA_PERFCOUNTER1_SELECT, 0, mmIA_PERFCOUNTER1_LO, mmIA_PERFCOUNTER1_HI}, + {mmIA_PERFCOUNTER2_SELECT, 0, mmIA_PERFCOUNTER2_LO, mmIA_PERFCOUNTER2_HI}, + {mmIA_PERFCOUNTER3_SELECT, 0, mmIA_PERFCOUNTER3_LO, mmIA_PERFCOUNTER3_HI}}; + +/* + * MC + */ +GpuCounterRegInfo AiMcCounterRegAddr[] = { + /* + + {mmMC_SEQ_PERF_SEQ_CTL__SI__VI, 0, mmMC_SEQ_PERF_SEQ_CNT_A_I0__VI, + mmMC_SEQ_PERF_SEQ_CNT_A_I1__VI}, + {mmMC_SEQ_PERF_SEQ_CTL__SI__VI, 0, mmMC_SEQ_PERF_SEQ_CNT_B_I0__VI, + mmMC_SEQ_PERF_SEQ_CNT_B_I1__VI}, + {mmMC_SEQ_PERF_SEQ_CTL__SI__VI, 0, mmMC_SEQ_PERF_SEQ_CNT_C_I0__VI, + mmMC_SEQ_PERF_SEQ_CNT_C_I1__VI}, + {mmMC_SEQ_PERF_SEQ_CTL__SI__VI, 0, mmMC_SEQ_PERF_SEQ_CNT_D_I0__VI, + mmMC_SEQ_PERF_SEQ_CNT_D_I1__VI} + + */ +}; + +/* + * SRBM + */ +GpuCounterRegInfo AiSrbmCounterRegAddr[] = { + /* + {mmSRBM_PERFCOUNTER0_SELECT, 0, mmSRBM_PERFCOUNTER0_LO, + mmSRBM_PERFCOUNTER0_HI}, + {mmSRBM_PERFCOUNTER1_SELECT, 0, mmSRBM_PERFCOUNTER1_LO, + mmSRBM_PERFCOUNTER1_HI} + */ +}; + +/* + * WD + */ +GpuCounterRegInfo AiWdCounterRegAddr[] = { + {mmWD_PERFCOUNTER0_SELECT, 0, mmWD_PERFCOUNTER0_LO, mmWD_PERFCOUNTER0_HI}, + {mmWD_PERFCOUNTER1_SELECT, 0, mmWD_PERFCOUNTER1_LO, mmWD_PERFCOUNTER1_HI}, + {mmWD_PERFCOUNTER2_SELECT, 0, mmWD_PERFCOUNTER2_LO, mmWD_PERFCOUNTER2_HI}, + {mmWD_PERFCOUNTER3_SELECT, 0, mmWD_PERFCOUNTER3_LO, mmWD_PERFCOUNTER3_HI}}; + +/* + * CPG + */ +GpuCounterRegInfo AiCpgCounterRegAddr[] = { + {mmCPG_PERFCOUNTER0_SELECT, 0, mmCPG_PERFCOUNTER0_LO, mmCPG_PERFCOUNTER0_HI}, + {mmCPG_PERFCOUNTER1_SELECT, 0, mmCPG_PERFCOUNTER1_LO, mmCPG_PERFCOUNTER1_HI}}; + +/* + * CPC + */ +GpuCounterRegInfo AiCpcCounterRegAddr[] = { + {mmCPC_PERFCOUNTER0_SELECT, 0, mmCPC_PERFCOUNTER0_LO, mmCPC_PERFCOUNTER0_HI}, + {mmCPC_PERFCOUNTER1_SELECT, 0, mmCPC_PERFCOUNTER1_LO, mmCPC_PERFCOUNTER1_HI}}; + +GpuPrivCounterBlockId AiBlockIdSq = {{0xb5c396b6, 0x47e4d310, 0xc35cfc86, 0x08f53a04}}; +GpuPrivCounterBlockId AiBlockIdMc = {{0x13900b57, 0x4d984956, 0x5268d081, 0x9cf53719}}; +GpuPrivCounterBlockId AiBlockIdIommuV2 = {{0x80969879, 0x4be6b0f6, 0x636af697, 0x1d10f500}}; +GpuPrivCounterBlockId AiBlockIdKernelDriver = {{0xea9b5ae1, 0x44b36c3f, 0xf0da5489, 0x0aa96575}}; + +} // pm4_profile diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/ai_blockinfo.h b/runtime/hsa-ext-aql-profile/src/perfcounter/ai_blockinfo.h new file mode 100644 index 0000000000..8e2460d7c0 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/ai_blockinfo.h @@ -0,0 +1,252 @@ +#ifndef _AI_BLOCKINFO_H_ +#define _AI_BLOCKINFO_H_ + +#include +#include "rocr_profiler.h" +#include "gpu_enum.h" +#include "gpu_blockinfo.h" + +namespace pm4_profile { + +// MAX Number of block instances for ARCTIC ISLANDS (From Vega10) +// Values are found here //gfxip/gfx8/main/src/meta/features/variant/Fiji/album.dj + +// @brief Number of block instances. + +// Number of CB block instances per SE +// and number of Perf Cntrs per CB block +#define AI_NUM_CB 4 +#define AI_COUNTER_NUM_PER_CB 4 + +// Number of DB block instances per SE +// and number of Perf Cntrs per DB block +#define AI_NUM_DB 4 +#define AI_COUNTER_NUM_PER_DB 4 + +// Number of TA block instances per SE +// and number of Perf Cntrs per TA block +#define AI_NUM_TA 16 +#define AI_COUNTER_NUM_PER_TA 2 + +// Number of TD block instances per SE +// and number of Perf Cntrs per TD block +#define AI_NUM_TD 16 +#define AI_COUNTER_NUM_PER_TD 2 + +// Number of TCP block instances per SE +// and number of Perf Cntrs per TCP block +#define AI_NUM_TCP 16 +#define AI_COUNTER_NUM_PER_TCP 4 + +// Number of TCA block instances per chip +// and number of Perf Cntrs per TCA block +#define AI_NUM_TCA 2 +#define AI_COUNTER_NUM_PER_TCA 4 + +// Number of TCC block instances per chip +// and number of Perf Cntrs per TCC block +#define AI_NUM_TCC 16 +#define AI_COUNTER_NUM_PER_TCC 4 + +// Number of SDMA block instances per chip +// and number of Perf Cntrs per SDMA block +#define AI_NUM_SDMA 2 + +// Number of counter registers per block for arctic islands +#define AI_COUNTER_NUM_PER_DRM 2 +#define AI_COUNTER_NUM_PER_DRMDMA 2 +#define AI_COUNTER_NUM_PER_IH 2 +#define AI_COUNTER_NUM_PER_SRBM 2 +#define AI_COUNTER_NUM_PER_CPF 2 +#define AI_COUNTER_NUM_PER_GRBM 2 +#define AI_COUNTER_NUM_PER_GRBMSE 4 +#define AI_COUNTER_NUM_PER_PA_SU 4 +#define AI_COUNTER_NUM_PER_RLC 2 +#define AI_COUNTER_NUM_PER_PA_SC 8 +#define AI_COUNTER_NUM_PER_SPI 6 // [Shucai: To do: double check the value] +#define AI_COUNTER_NUM_PER_SQ 16 +#define AI_COUNTER_NUM_PER_SX 4 +#define AI_COUNTER_NUM_PER_GDS 4 +#define AI_COUNTER_NUM_PER_VGT 4 +#define AI_COUNTER_NUM_PER_IA 4 +#define AI_COUNTER_NUM_PER_MC 4 +#define AI_COUNTER_NUM_PER_TCS 4 +#define AI_COUNTER_NUM_PER_WD 4 +#define AI_COUNTER_NUM_PER_CPG 2 +#define AI_COUNTER_NUM_PER_CPC 2 +#define AI_COUNTER_NUM_PER_VM 1 +#define AI_COUNTER_NUM_PER_VM_MD 1 +#define AI_COUNTER_NUM_PER_PIPESTATS 12 + +#define AI_MAX_NUM_SHADER_ENGINES 1 + +// Enumeration of AI hardware counter blocks +typedef enum HsaAiCounterBlockId { + kHsaAiCounterBlockIdCb0 = 0, + kHsaAiCounterBlockIdCb1, + kHsaAiCounterBlockIdCb2, + kHsaAiCounterBlockIdCb3, + + // Temp commented for Vega10 + kHsaAiCounterBlockIdCpf, + + kHsaAiCounterBlockIdDb0, + kHsaAiCounterBlockIdDb1, + kHsaAiCounterBlockIdDb2, + kHsaAiCounterBlockIdDb3, + + kHsaAiCounterBlockIdGrbm, + kHsaAiCounterBlockIdGrbmSe, + kHsaAiCounterBlockIdPaSu, + kHsaAiCounterBlockIdPaSc, + kHsaAiCounterBlockIdSpi, + + kHsaAiCounterBlockIdSq, + kHsaAiCounterBlockIdSqGs, + kHsaAiCounterBlockIdSqVs, + kHsaAiCounterBlockIdSqPs, + kHsaAiCounterBlockIdSqHs, + kHsaAiCounterBlockIdSqCs, + + kHsaAiCounterBlockIdSx, + + kHsaAiCounterBlockIdTa0, + kHsaAiCounterBlockIdTa1, + kHsaAiCounterBlockIdTa2, + kHsaAiCounterBlockIdTa3, + kHsaAiCounterBlockIdTa4, + kHsaAiCounterBlockIdTa5, + kHsaAiCounterBlockIdTa6, + kHsaAiCounterBlockIdTa7, + kHsaAiCounterBlockIdTa8, + kHsaAiCounterBlockIdTa9, + kHsaAiCounterBlockIdTa10, + kHsaAiCounterBlockIdTa11, + kHsaAiCounterBlockIdTa12, + kHsaAiCounterBlockIdTa13, + kHsaAiCounterBlockIdTa14, + kHsaAiCounterBlockIdTa15, + + kHsaAiCounterBlockIdTca0, + kHsaAiCounterBlockIdTca1, + + kHsaAiCounterBlockIdTcc0, + kHsaAiCounterBlockIdTcc1, + kHsaAiCounterBlockIdTcc2, + kHsaAiCounterBlockIdTcc3, + kHsaAiCounterBlockIdTcc4, + kHsaAiCounterBlockIdTcc5, + kHsaAiCounterBlockIdTcc6, + kHsaAiCounterBlockIdTcc7, + kHsaAiCounterBlockIdTcc8, + kHsaAiCounterBlockIdTcc9, + kHsaAiCounterBlockIdTcc10, + kHsaAiCounterBlockIdTcc11, + kHsaAiCounterBlockIdTcc12, + kHsaAiCounterBlockIdTcc13, + kHsaAiCounterBlockIdTcc14, + kHsaAiCounterBlockIdTcc15, + + kHsaAiCounterBlockIdTd0, + kHsaAiCounterBlockIdTd1, + kHsaAiCounterBlockIdTd2, + kHsaAiCounterBlockIdTd3, + kHsaAiCounterBlockIdTd4, + kHsaAiCounterBlockIdTd5, + kHsaAiCounterBlockIdTd6, + kHsaAiCounterBlockIdTd7, + kHsaAiCounterBlockIdTd8, + kHsaAiCounterBlockIdTd9, + kHsaAiCounterBlockIdTd10, + kHsaAiCounterBlockIdTd11, + kHsaAiCounterBlockIdTd12, + kHsaAiCounterBlockIdTd13, + kHsaAiCounterBlockIdTd14, + kHsaAiCounterBlockIdTd15, + + kHsaAiCounterBlockIdTcp0, + kHsaAiCounterBlockIdTcp1, + kHsaAiCounterBlockIdTcp2, + kHsaAiCounterBlockIdTcp3, + kHsaAiCounterBlockIdTcp4, + kHsaAiCounterBlockIdTcp5, + kHsaAiCounterBlockIdTcp6, + kHsaAiCounterBlockIdTcp7, + kHsaAiCounterBlockIdTcp8, + kHsaAiCounterBlockIdTcp9, + kHsaAiCounterBlockIdTcp10, + kHsaAiCounterBlockIdTcp11, + kHsaAiCounterBlockIdTcp12, + kHsaAiCounterBlockIdTcp13, + kHsaAiCounterBlockIdTcp14, + kHsaAiCounterBlockIdTcp15, + + kHsaAiCounterBlockIdGds, + kHsaAiCounterBlockIdVgt, + kHsaAiCounterBlockIdIa, + kHsaAiCounterBlockIdMc, + + // Temp commented out for Vega10 + // kHsaAiCounterBlockIdSrbm, + + kHsaAiCounterBlockIdTcs, + kHsaAiCounterBlockIdWd, + + // Temp commented out for Vega10 + // kHsaAiCounterBlockIdCpg, + + // Temp commented for Vega10 + kHsaAiCounterBlockIdCpc, + + // Counters retrieved by KFD + kHsaAiCounterBlockIdIommuV2, + kHsaAiCounterBlockIdKernelDriver, + + kHsaAiCounterBlockIdCpPipeStats, + kHsaAiCounterBlockIdHwInfo, + kHsaAiCounterBlockIdBlocksFirst = kHsaAiCounterBlockIdCb0, + kHsaAiCounterBlockIdBlocksLast = kHsaAiCounterBlockIdHwInfo +} HsaAiCounterBlockId; + +extern GpuBlockInfo AiPmuHwBlocks[]; +extern GpuCounterRegInfo AiSqCounterRegAddr[]; +extern GpuCounterRegInfo AiCbCounterRegAddr[]; +extern GpuCounterRegInfo AiDrmdmaCounterRegAddr[]; +extern GpuCounterRegInfo AiIhCounterRegAddr[]; +extern GpuCounterRegInfo AiCpfCounterRegAddr[]; +extern GpuCounterRegInfo AiCpgCounterRegAddr[]; +extern GpuCounterRegInfo AiCpcCounterRegAddr[]; +extern GpuCounterRegInfo AiDrmCounterRegAddr[]; +extern GpuCounterRegInfo AiGrbmCounterRegAddr[]; +extern GpuCounterRegInfo AiGrbmSeCounterRegAddr[]; +extern GpuCounterRegInfo AiPaSuCounterRegAddr[]; +extern GpuCounterRegInfo AiPaScCounterRegAddr[]; +extern GpuCounterRegInfo AiSpiCounterRegAddr[]; +extern GpuCounterRegInfo AiTcaCounterRegAddr[]; +extern GpuCounterRegInfo AiTccCounterRegAddr[]; +extern GpuCounterRegInfo AiTcpCounterRegAddr[]; +extern GpuCounterRegInfo AiDbCounterRegAddr[]; +extern GpuCounterRegInfo AiRlcCounterRegAddr[]; +extern GpuCounterRegInfo AiScCounterRegAddr[]; +extern GpuCounterRegInfo AiSxCounterRegAddr[]; +extern GpuCounterRegInfo AiTaCounterRegAddr[]; +extern GpuCounterRegInfo AiTdCounterRegAddr[]; +extern GpuCounterRegInfo AiGdsCounterRegAddr[]; +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; +extern GpuPrivCounterBlockId AiBlockIdIommuV2; +extern GpuPrivCounterBlockId AiBlockIdKernelDriver; +} + +#endif // _AI_BLOCKINFO_H_ diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/ai_pmu.cpp b/runtime/hsa-ext-aql-profile/src/perfcounter/ai_pmu.cpp new file mode 100644 index 0000000000..5fa851a53e --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/ai_pmu.cpp @@ -0,0 +1,1601 @@ +#include "os.h" + +#include "gfxip/gfx9/gfx9_registers.h" +#include "gfxip/gfx9/gfx9_typedef.h" +#include "gfxip/gfx9/gfx9_offset.h" +#include "cmdwriter.h" + +#include "ai_pmu.h" +#include "gpu_countergroup.h" +#include "ai_blockinfo.h" +#include "gpu_enum.h" + +#include +#include + +#include + +using namespace std; +using namespace pm4_profile; +using namespace pm4_profile::gfx9; + +// A flag to indicate the current packet is for copy register value +#define MAX_REG_NUM (100) +#define COPY_DATA_FLAG (0xFFFFFFFF) +#define COPY_DATA_SEL_REG (0x00) ///< Mem-mapped register +#define COPY_DATA_SEL_COUNT_1DW (0x00) ///< Copy 1 word (32 bits) +#define COPY_DATA_SEL_COUNT_2DW (0x01) ///< Copy 2 words (64 bits) + +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"}}; + +AiPmu::AiPmu() { + // Initialize the number of shader engines + num_se_ = 4; + Init(); +} + +void AiPmu::Init() { + error_code_ = 0; + info_set_ = new InfoSet(); + parameter_set_ = new ParameterSet(); + + // Initialize pointer to stored counter block list to NULL + blk_list_ = NULL; + initCounterBlock(); + + // Initialize the value to use in resetting GRBM + regGRBM_GFX_INDEX grbm_gfx_index; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reset_grbm_ = grbm_gfx_index.u32All; + + // Update state of Perf Mgmt Unit + profiler_state_ = ROCR_PMU_STATE_IDLE; +} + +AiPmu::~AiPmu() { + // Remove all counter blocks + RemoveCounterBlocks(); + blk_map_.clear(); + delete parameter_set_; + delete info_set_; + + if (blk_list_) { + free(blk_list_); + blk_list_ = NULL; + } +} + +// Initializes the handle of buffer used to collect PMC data +// @param cmdBufSz Size in terms of bytes +bool AiPmu::setPmcDataBuff(uint8_t* pmcBuffer, uint32_t pmcBuffSz) { + // Update counter data buffer addr and size params + pmcDataSz_ = pmcBuffSz; + pmcData_ = (uint32_t*)pmcBuffer; + return true; +} + +// +// The logic is quite simple and is as follows +// +// Issue CsPartialFlush +// Issue Cmd to stop Perf Counters +// Issue Cmd to Disable & Reset Perf Counters +// +void AiPmu::ResetCounterBlocks(pm4_profile::DefaultCmdBuf* cmdBuff, + pm4_profile::CommandWriter* cmdWriter) { + // Waits until all outstanding commands have completed + // by issing CS Partial Flush command + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Program CP Perfmon Cntrl Rgstr to disable and reset counters + 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); +} + +bool AiPmu::begin(pm4_profile::DefaultCmdBuf* cmdBuff, pm4_profile::CommandWriter* cmdWriter, + bool reset_counter) { + if (profiler_state_ != ROCR_PMU_STATE_IDLE) { + error_code_ = kHsaPmuErrorCodeErrorState; + return false; + } + + // Reset Grbm to its default state - broadcast + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX, reset_grbm_); + + // Disable RLC Perfmon Clock Gating + // On Vega this is needed to collect Perf Cntrs + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmRLC_PERFMON_CLK_CNTL, 1); + + // Collect all the program counter blocks + uint32_t reg_val[MAX_REG_NUM], reg_addr[MAX_REG_NUM], reg_num; + + // Retrieve the list of blocks whose perf counters have been enabled + uint32_t blk_cnt = 0; + CounterBlock** blk_list = getAllCounterBlocks(blk_cnt); + + // Iterate through the list of blocks to generate Pm4 commands to + // program corresponding perf counters of each block + for (uint32_t blkIdx = 0; blkIdx < blk_cnt; blkIdx++) { + // Retrieve the list of perf counters and their count + uint32_t counter_num; + Counter** cntr_list; + cntr_list = blk_list[blkIdx]->getEnabledCounters(counter_num); + if (counter_num == 0) { + continue; + } + + // Retrieve the block Id of perf counters + void* p_data; + uint32_t block_id; + uint32_t data_size; + blk_list[blkIdx]->getInfo(GPU_BLK_INFO_ID, data_size, (void**)&p_data); + block_id = *(static_cast(p_data)); + + // Iterate through each enabled perf counter and building + // corresponding Pm4 commands to program the various control + // registers involved + for (uint32_t cntrIdx = 0; cntrIdx < counter_num; cntrIdx++) { + // Build the list of control registers to program which + // varies per perf counter block + reg_num = BuildCounterSelRegister(cntrIdx, reg_addr, reg_val, block_id, cntr_list[cntrIdx]); + + // Build the list of Pm4 commands that support control + // register programming + for (uint32_t regIdx = 0; regIdx < reg_num; regIdx++) { + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, reg_addr[regIdx], reg_val[regIdx]); + } + } + } + + // Reset Grbm to its default state - broadcast + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX, reset_grbm_); + + // Program Compute_Perfcount_Enable register to support perf counting + regCOMPUTE_PERFCOUNT_ENABLE cp_perfcount_enable; + cp_perfcount_enable.u32All = 0; + cp_perfcount_enable.bits.PERFCOUNT_ENABLE = 1; + 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 + cp_perfmon_cntl.bits.PERFMON_STATE = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmCP_PERFMON_CNTL, cp_perfmon_cntl.u32All); + + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + profiler_state_ = ROCR_PMU_STATE_START; + return true; +} + +bool AiPmu::end(pm4_profile::DefaultCmdBuf* cmdBuff, pm4_profile::CommandWriter* cmdWriter) { + if (profiler_state_ != ROCR_PMU_STATE_START) { + error_code_ = kHsaPmuErrorCodeErrorState; + return false; + } + + void* p_data; + regGRBM_GFX_INDEX grbm_gfx_index; + + // Issue CsPartialFlush command to wait for dispatch to complete + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Build PM4 packet for starting counters + regCP_PERFMON_CNTL cp_perfmon_cntl; + cp_perfmon_cntl.u32All = 0; + cp_perfmon_cntl.bits.PERFMON_STATE = 2; + cp_perfmon_cntl.bits.PERFMON_SAMPLE_ENABLE = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmCP_PERFMON_CNTL, cp_perfmon_cntl.u32All); + + // Collect all the program counter blocks + uint32_t i, j, k, reg_addr[MAX_REG_NUM], reg_val[MAX_REG_NUM], reg_num, data_size; + + uint32_t blk_cnt = 0; + CounterBlock** blk_list = getAllCounterBlocks(blk_cnt); + + uint32_t counter_num; + Counter** cntr_list; + uint32_t total_counter_num = 0; + for (i = 0; i < blk_cnt; i++) { + // Retrieve all enabled cntr_list in each counter block + cntr_list = blk_list[i]->getEnabledCounters(counter_num); + if (!blk_list[i]->getInfo(GPU_BLK_INFO_CONTROL_METHOD, data_size, &p_data)) { + return false; + } + + CntlMethod method; + method = static_cast(*(static_cast(p_data))); + + // Need to read counter values from each shader engine + if (method == CntlMethodBySe || method == CntlMethodBySeAndInstance) { + counter_num = counter_num * num_se_; + } + + total_counter_num += counter_num; + } + + size_t cntrSize = sizeof(int32_t) * 2 * total_counter_num; + if (cntrSize > pmcDataSz_) { + return false; + } + + // Reset Grbm to its default state - broadcast + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX, reset_grbm_); + + // Create PM4 packet to read counter values + total_counter_num = 0; + for (i = 0; i < blk_cnt; i++) { + // Retrieve all enabled cntr_list in each counter block + cntr_list = blk_list[i]->getEnabledCounters(counter_num); + if (counter_num > 0) { + uint32_t block_id; + uint32_t data_size; + if (!blk_list[i]->getInfo(GPU_BLK_INFO_ID, data_size, (void**)&p_data)) { + return false; + } + block_id = *(static_cast(p_data)); + + for (j = 0; j < counter_num; j++) { + // retrieve the registers to be set + reg_num = BuildCounterReadRegisters(j, block_id, reg_addr, reg_val); + for (k = 0; k < reg_num; k++) { + if (reg_val[k] == COPY_DATA_FLAG) { + cmdWriter->BuildCopyDataPacket(cmdBuff, COPY_DATA_SEL_REG, reg_addr[k], 0, + pmcData_ + total_counter_num, COPY_DATA_SEL_COUNT_1DW, + false); + total_counter_num++; + } else { + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, reg_addr[k], reg_val[k]); + } + } + } + } + } + + // Reset Grbm to its default state - broadcast + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX, reset_grbm_); + + // Enable RLC Perfmon Clock Gating. On Vega this is + // was disabled during Perf Cntrs collection session + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmRLC_PERFMON_CLK_CNTL, 0); + + profiler_state_ = ROCR_PMU_STATE_STOP; + return true; +} + +bool AiPmu::initCounterBlock() { + for (int i = 0; !(std::string(AiPmuHwBlocks[i].blockName).empty()); i++) { + // Override the value of max number of shader engines + AiPmuHwBlocks[i].maxShaderEngineCount = num_se_; + + // Instantiate a perf counter block and its properties + GpuCounterBlock* cntr_blk = new GpuCounterBlock(); + if (!cntr_blk) { + blk_map_.clear(); + return false; + } + + cntr_blk->setInfo(GPU_BLK_INFO_BLOCK_NAME, GPU_BLOCK_NAME_SIZE, + (void*)AiPmuHwBlocks[i].blockName); + + cntr_blk->setInfo(GPU_BLK_INFO_ID, sizeof(uint32_t), (void*)&AiPmuHwBlocks[i].counterGroupId); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_SHADER_ENGINE_COUNT, sizeof(uint32_t), + (void*)&(AiPmuHwBlocks[i].maxShaderEngineCount)); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_SHADER_ARRAY_COUNT, sizeof(uint32_t), + (void*)&(AiPmuHwBlocks[i].maxShaderArrayCount)); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_INSTANCE_COUNT, sizeof(uint32_t), + (void*)&(AiPmuHwBlocks[i].maxInstanceCount)); + + cntr_blk->setInfo(GPU_BLK_INFO_CONTROL_METHOD, sizeof(uint32_t), + (void*)&(AiPmuHwBlocks[i].method)); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_EVENT_ID, sizeof(uint32_t), + (void*)&(AiPmuHwBlocks[i].maxEventId)); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_SIMULTANEOUS_COUNTERS, sizeof(uint32_t), + (void*)&(AiPmuHwBlocks[i].maxSimultaneousCounters)); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_STREAMING_COUNTERS, sizeof(uint32_t), + (void*)&(AiPmuHwBlocks[i].maxStreamingCounters)); + + cntr_blk->setInfo(GPU_BLK_INFO_SHARED_HW_COUNTERS, sizeof(uint32_t), + (void*)&(AiPmuHwBlocks[i].sharedHWCounters)); + + cntr_blk->setInfo(GPU_BLK_INFO_HAS_FILTERS, sizeof(bool), + (void*)&(AiPmuHwBlocks[i].hasFilters)); + + // TODO: Need to fill in the Threadtrace stuff here + HsaAiCounterBlockId blk_id; + blk_id = static_cast(AiPmuHwBlocks[i].counterGroupId); + blk_map_.insert(AiCounterBlockMap::value_type(blk_id, cntr_blk)); + } + + // Initiate the PMU state and error code + error_code_ = 0; + profiler_state_ = ROCR_PMU_STATE_IDLE; + return true; +} + +int AiPmu::getLastError() { return error_code_; } + +std::string AiPmu::getErrorString(int error) { + if ((error >= 0) && (error < kHsaPmuErrorCodeMax)) { + std::string err_string(errorString[error]); + return err_string; + } + return string("Error input code!"); +} + +bool AiPmu::getParameter(uint32_t param, uint32_t& retSize, void** ppData) { + return parameter_set_->getParameter(param, retSize, ppData); +} + +bool AiPmu::setParameter(uint32_t param, uint32_t paramSize, const void* p_data) { + return parameter_set_->setParameter(param, paramSize, p_data); +} + +bool AiPmu::getInfo(uint32_t info, uint32_t& retSize, void** ppData) { + return info_set_->getInfo(info, retSize, ppData); +} + +pm4_profile::CounterBlock* AiPmu::getCounterBlockById(uint32_t id) { + HsaAiCounterBlockId block_id = static_cast(id); + + return blk_map_[block_id]; +} + +pm4_profile::CounterBlock** AiPmu::getAllCounterBlocks(uint32_t& num_blocks) { + size_t block_size = blk_map_.size(); + + if (block_size <= 0) { + error_code_ = kHsaPmuErrorCodeNoCounterBlock; + return NULL; + } + + if (blk_list_) { + free(blk_list_); + blk_list_ = NULL; + } + + blk_list_size_ = (uint32_t)(sizeof(GpuCounterBlock*) * block_size); + blk_list_size_ = ((blk_list_size_ % 4096) != 0) ? 4096 : blk_list_size_; + blk_list_ = (CounterBlock**)malloc(blk_list_size_); + if (blk_list_ == NULL) { + return NULL; + } + + AiCounterBlockMap::iterator it; + uint32_t blk_cnt = 0; + for (it = blk_map_.begin(); it != blk_map_.end(); it++) { + blk_list_[blk_cnt] = it->second; + blk_cnt++; + } + + num_blocks = blk_cnt; + return blk_list_; +} + +uint32_t AiPmu::ProgramTcpCntrs(uint32_t tcpRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + regGRBM_GFX_INDEX grbm_gfx_index; + + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_INDEX = blkId - kHsaAiCounterBlockIdTcp0; + + uint32_t regIdx = 0; + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX; + regIdx++; + + regTCP_PERFCOUNTER0_SELECT tcp_perf_counter_select; + tcp_perf_counter_select.u32All = 0; + tcp_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[regIdx] = tcp_perf_counter_select.u32All; + regAddr[regIdx] = AiTcpCounterRegAddr[tcpRegIdx].counterSelRegAddr; + regIdx++; + + return regIdx; +} + +uint32_t AiPmu::ProgramTdCntrs(uint32_t tdRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + regGRBM_GFX_INDEX grbm_gfx_index; + + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_INDEX = blkId - kHsaAiCounterBlockIdTd0; + + uint32_t regIdx = 0; + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX; + regIdx++; + + regTD_PERFCOUNTER0_SELECT td_perf_counter_select; + td_perf_counter_select.u32All = 0; + td_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[regIdx] = td_perf_counter_select.u32All; + regAddr[regIdx] = AiTdCounterRegAddr[tdRegIdx].counterSelRegAddr; + regIdx++; + + return regIdx; +} + +uint32_t AiPmu::ProgramTccCntrs(uint32_t tccRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + regGRBM_GFX_INDEX grbm_gfx_index; + + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_INDEX = blkId - kHsaAiCounterBlockIdTcc0; + + uint32_t regIdx = 0; + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX; + regIdx++; + + regTCC_PERFCOUNTER0_SELECT tcc_perf_counter_select; + tcc_perf_counter_select.u32All = 0; + tcc_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[regIdx] = tcc_perf_counter_select.u32All; + regAddr[regIdx] = AiTccCounterRegAddr[tccRegIdx].counterSelRegAddr; + regIdx++; + + return regIdx; +} + +uint32_t AiPmu::ProgramTcaCntrs(uint32_t tcaRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + regGRBM_GFX_INDEX grbm_gfx_index; + + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_INDEX = blkId - kHsaAiCounterBlockIdTca0; + + uint32_t regIdx = 0; + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX; + regIdx++; + + regTCA_PERFCOUNTER0_SELECT tca_perf_counter_select; + tca_perf_counter_select.u32All = 0; + tca_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[regIdx] = tca_perf_counter_select.u32All; + regAddr[regIdx] = AiTcaCounterRegAddr[tcaRegIdx].counterSelRegAddr; + regIdx++; + return regIdx; +} + +uint32_t AiPmu::ProgramTaCntrs(uint32_t taRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + regGRBM_GFX_INDEX grbm_gfx_index; + + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_INDEX = blkId - kHsaAiCounterBlockIdTa0; + + uint32_t regIdx = 0; + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX; + regIdx++; + + regTA_PERFCOUNTER0_SELECT ta_perf_counter_select; + ta_perf_counter_select.u32All = 0; + ta_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[regIdx] = ta_perf_counter_select.u32All; + regAddr[regIdx] = AiTaCounterRegAddr[taRegIdx].counterSelRegAddr; + regIdx++; + + return regIdx; +} + +uint32_t AiPmu::ProgramSQCntrs(uint32_t sqRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + uint32_t regIdx = 0; + + // Program the SQ Counter Select Register + regSQ_PERFCOUNTER0_SELECT sq_cntr_sel; + sq_cntr_sel.u32All = 0; + sq_cntr_sel.bits.SIMD_MASK = 0xF; + sq_cntr_sel.bits.SQC_BANK_MASK = 0xF; + sq_cntr_sel.bits.SQC_CLIENT_MASK = 0xF; + sq_cntr_sel.bits.PERF_SEL = blkCntrIdx; + regVal[regIdx] = sq_cntr_sel.u32All; + regAddr[regIdx] = AiSqCounterRegAddr[sqRegIdx].counterSelRegAddr; + regIdx++; + + // Program the SQ Counter Mask Register + regSQ_PERFCOUNTER_MASK sq_cntr_mask; + sq_cntr_mask.u32All = 0; + sq_cntr_mask.bits.SH0_MASK = 0xFFFF; + sq_cntr_mask.bits.SH1_MASK = 0xFFFF; + regVal[regIdx] = sq_cntr_mask.u32All; + regAddr[regIdx] = mmSQ_PERFCOUNTER_MASK; + regIdx++; + + // Initialize the register content + // Program the SQ Counter Control Register + regSQ_PERFCOUNTER_CTRL sq_cntr_ctrl; + sq_cntr_ctrl.u32All = 0; + if (blkId == kHsaAiCounterBlockIdSq) { + sq_cntr_ctrl.bits.PS_EN = 0x1; + sq_cntr_ctrl.bits.VS_EN = 0x1; + sq_cntr_ctrl.bits.GS_EN = 0x1; + sq_cntr_ctrl.bits.HS_EN = 0x1; + sq_cntr_ctrl.bits.CS_EN = 0x1; + } else if (blkId == kHsaAiCounterBlockIdSqGs) { + sq_cntr_ctrl.bits.GS_EN = 0x1; + } else if (blkId == kHsaAiCounterBlockIdSqVs) { + sq_cntr_ctrl.bits.VS_EN = 0x1; + } else if (blkId == kHsaAiCounterBlockIdSqPs) { + sq_cntr_ctrl.bits.PS_EN = 0x1; + } else if (blkId == kHsaAiCounterBlockIdSqHs) { + sq_cntr_ctrl.bits.HS_EN = 0x1; + } else if (blkId == kHsaAiCounterBlockIdSqCs) { + sq_cntr_ctrl.bits.CS_EN = 0x1; + } + + regVal[regIdx] = sq_cntr_ctrl.u32All; + regAddr[regIdx] = AiSqCounterRegAddr[sqRegIdx].counterCntlRegAddr; + regIdx++; + + return regIdx; +} + +uint32_t AiPmu::BuildCounterSelRegister(uint32_t cntrIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, pm4_profile::Counter* blkCntr) { + void* p_data; + uint32_t data_size; + uint32_t blkCntrIdx; + uint32_t instance_index; + regGRBM_GFX_INDEX grbm_gfx_index; + + // Get the blkCntr selection value + if (!blkCntr->getParameter(HSA_EXT_TOOLS_COUNTER_PARAMETER_EVENT_INDEX, data_size, + (void**)&p_data)) { + return 0; + } + blkCntrIdx = *(static_cast(p_data)); + + uint32_t regIdx = 0; + switch (blkId) { + // Program counters belonging to SQ block + case kHsaAiCounterBlockIdSq: + case kHsaAiCounterBlockIdSqGs: + case kHsaAiCounterBlockIdSqVs: + case kHsaAiCounterBlockIdSqPs: + case kHsaAiCounterBlockIdSqHs: + case kHsaAiCounterBlockIdSqCs: + return ProgramSQCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaAiCounterBlockIdCb0: + case kHsaAiCounterBlockIdCb1: + case kHsaAiCounterBlockIdCb2: + case kHsaAiCounterBlockIdCb3: { + regIdx = 0; + instance_index = blkId - kHsaAiCounterBlockIdCb0; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER0_LO; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER0_HI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER1_LO; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER1_HI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER2_LO; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER2_HI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER3_LO; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER3_HI; + regIdx++; + + regCB_PERFCOUNTER0_SELECT cb_perf_counter_select; + cb_perf_counter_select.u32All = 0; + cb_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[regIdx] = cb_perf_counter_select.u32All; + regAddr[regIdx] = AiCbCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx++; + + break; + } + + // Temp commented for Vega10 + /* + case kHsaAiCounterBlockIdCpf: { + regCPF_PERFCOUNTER0_SELECT cpf_perf_counter_select; + cpf_perf_counter_select.u32All = 0; + cpf_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[0] = cpf_perf_counter_select.u32All; + regAddr[0] = AiCpfCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + */ + + case kHsaAiCounterBlockIdDb0: + case kHsaAiCounterBlockIdDb1: + case kHsaAiCounterBlockIdDb2: + case kHsaAiCounterBlockIdDb3: { + instance_index = blkId - kHsaAiCounterBlockIdDb0; + regIdx = 0; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER0_LO; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER0_HI; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER1_LO; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER1_HI; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER2_LO; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER2_HI; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER3_LO; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER3_HI; + regIdx++; + + regDB_PERFCOUNTER0_SELECT db_perf_counter_select; + db_perf_counter_select.u32All = 0; + db_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[regIdx] = db_perf_counter_select.u32All; + regAddr[regIdx] = AiDbCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx++; + break; + } + + case kHsaAiCounterBlockIdGrbm: { + regGRBM_PERFCOUNTER0_SELECT grbm_perf_counter_select; + grbm_perf_counter_select.u32All = 0; + grbm_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = grbm_perf_counter_select.u32All; + regAddr[0] = AiGrbmCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaAiCounterBlockIdGrbmSe: { + regGRBM_SE0_PERFCOUNTER_SELECT grbm_se0_perf_counter_select; + grbm_se0_perf_counter_select.u32All = 0; + grbm_se0_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = grbm_se0_perf_counter_select.u32All; + regAddr[0] = AiGrbmSeCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaAiCounterBlockIdPaSu: { + regPA_SU_PERFCOUNTER0_SELECT pa_su_perf_counter_select; + pa_su_perf_counter_select.u32All = 0; + pa_su_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = pa_su_perf_counter_select.u32All; + regAddr[0] = AiPaSuCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaAiCounterBlockIdPaSc: { + regPA_SC_PERFCOUNTER0_SELECT pa_sc_perf_counter_select; + pa_sc_perf_counter_select.u32All = 0; + pa_sc_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = pa_sc_perf_counter_select.u32All; + regAddr[0] = AiPaScCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaAiCounterBlockIdSpi: { + regSPI_PERFCOUNTER0_SELECT spi_perf_counter_select; + spi_perf_counter_select.u32All = 0; + spi_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = spi_perf_counter_select.u32All; + regAddr[0] = AiSpiCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaAiCounterBlockIdSx: { + regIdx = 0; + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER0_LO; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER0_HI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER1_LO; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER1_HI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER2_LO; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER2_HI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER3_LO; + regIdx++; + + regSX_PERFCOUNTER0_SELECT sx_perf_counter_select; + sx_perf_counter_select.u32All = 0; + sx_perf_counter_select.bits.PERFCOUNTER_SELECT = blkCntrIdx; + regVal[regIdx] = sx_perf_counter_select.u32All; + regAddr[regIdx] = AiSxCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx++; + break; + } + + case kHsaAiCounterBlockIdTa0: + case kHsaAiCounterBlockIdTa1: + case kHsaAiCounterBlockIdTa2: + case kHsaAiCounterBlockIdTa3: + case kHsaAiCounterBlockIdTa4: + case kHsaAiCounterBlockIdTa5: + case kHsaAiCounterBlockIdTa6: + case kHsaAiCounterBlockIdTa7: + case kHsaAiCounterBlockIdTa8: + case kHsaAiCounterBlockIdTa9: + case kHsaAiCounterBlockIdTa10: + case kHsaAiCounterBlockIdTa11: + case kHsaAiCounterBlockIdTa12: + case kHsaAiCounterBlockIdTa13: + case kHsaAiCounterBlockIdTa14: + case kHsaAiCounterBlockIdTa15: + return ProgramTaCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaAiCounterBlockIdTca0: + case kHsaAiCounterBlockIdTca1: + return ProgramTcaCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaAiCounterBlockIdTcc0: + case kHsaAiCounterBlockIdTcc1: + case kHsaAiCounterBlockIdTcc2: + case kHsaAiCounterBlockIdTcc3: + case kHsaAiCounterBlockIdTcc4: + case kHsaAiCounterBlockIdTcc5: + case kHsaAiCounterBlockIdTcc6: + case kHsaAiCounterBlockIdTcc7: + case kHsaAiCounterBlockIdTcc8: + case kHsaAiCounterBlockIdTcc9: + case kHsaAiCounterBlockIdTcc10: + case kHsaAiCounterBlockIdTcc11: + case kHsaAiCounterBlockIdTcc12: + case kHsaAiCounterBlockIdTcc13: + case kHsaAiCounterBlockIdTcc14: + case kHsaAiCounterBlockIdTcc15: + return ProgramTccCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaAiCounterBlockIdTd0: + case kHsaAiCounterBlockIdTd1: + case kHsaAiCounterBlockIdTd2: + case kHsaAiCounterBlockIdTd3: + case kHsaAiCounterBlockIdTd4: + case kHsaAiCounterBlockIdTd5: + case kHsaAiCounterBlockIdTd6: + case kHsaAiCounterBlockIdTd7: + case kHsaAiCounterBlockIdTd8: + case kHsaAiCounterBlockIdTd9: + case kHsaAiCounterBlockIdTd10: + case kHsaAiCounterBlockIdTd11: + case kHsaAiCounterBlockIdTd12: + case kHsaAiCounterBlockIdTd13: + case kHsaAiCounterBlockIdTd14: + case kHsaAiCounterBlockIdTd15: + return ProgramTdCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaAiCounterBlockIdTcp0: + case kHsaAiCounterBlockIdTcp1: + case kHsaAiCounterBlockIdTcp2: + case kHsaAiCounterBlockIdTcp3: + case kHsaAiCounterBlockIdTcp4: + case kHsaAiCounterBlockIdTcp5: + case kHsaAiCounterBlockIdTcp6: + case kHsaAiCounterBlockIdTcp7: + case kHsaAiCounterBlockIdTcp8: + case kHsaAiCounterBlockIdTcp9: + case kHsaAiCounterBlockIdTcp10: + case kHsaAiCounterBlockIdTcp11: + case kHsaAiCounterBlockIdTcp12: + case kHsaAiCounterBlockIdTcp13: + case kHsaAiCounterBlockIdTcp14: + case kHsaAiCounterBlockIdTcp15: + return ProgramTcpCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaAiCounterBlockIdGds: { + regGDS_PERFCOUNTER0_SELECT gds_perf_counter_select; + gds_perf_counter_select.u32All = 0; + gds_perf_counter_select.bits.PERFCOUNTER_SELECT = blkCntrIdx; + regVal[0] = gds_perf_counter_select.u32All; + regAddr[0] = AiGdsCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaAiCounterBlockIdVgt: { + regVGT_PERFCOUNTER0_SELECT vgt_perf_counter_select; + vgt_perf_counter_select.u32All = 0; + vgt_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = vgt_perf_counter_select.u32All; + regAddr[0] = AiVgtCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaAiCounterBlockIdIa: { + regIA_PERFCOUNTER0_SELECT ia_perf_counter_select; + ia_perf_counter_select.u32All = 0; + ia_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = ia_perf_counter_select.u32All; + regAddr[0] = AiIaCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + /* + case kHsaAiCounterBlockIdMc: { + // To be investigated later + //regMC_SEQ_PERF_SEQ_CTL mc_perfcounter_select; + //mc_perfcounter_select.u32All = 0; + //mc_perfcounter_select.bits.PERF_SEL = blkCntrIdx; + //regVal[0] = mc_perfcounter_select.u32All; + //regAddr[0] = AiMcCounterRegAddr[cntrIdx].counterSelRegAddr; + //regIdx = 1; + } + break; + */ + + // Temp Commented out for Vega10 + /* + case kHsaAiCounterBlockIdSrbm: { + regSRBM_PERFCOUNTER0_SELECT srbm_perf_counter_select; + srbm_perf_counter_select.u32All = 0; + srbm_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = srbm_perf_counter_select.u32All; + regAddr[0] = AiSrbmCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + */ + + /* + case kHsaAiCounterBlockIdTcs: { + regTCS_PERFCOUNTER0_SELECT__CI tcs_perf_counter_select; + tcs_perf_counter_select.u32All = 0; + tcs_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = tcs_perf_counter_select.u32All; + regAddr[0] = AiTcsCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + */ + + case kHsaAiCounterBlockIdWd: { + regWD_PERFCOUNTER0_SELECT wd_perf_counter_select; + wd_perf_counter_select.u32All = 0; + wd_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = wd_perf_counter_select.u32All; + regAddr[0] = AiWdCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + // Temp commented for Vega10 + /* + case kHsaAiCounterBlockIdCpg: { + regCPG_PERFCOUNTER0_SELECT cpg_perf_counter_select; + cpg_perf_counter_select.u32All = 0; + cpg_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = cpg_perf_counter_select.u32All; + regAddr[0] = AiCpgCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + */ + + // 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; + regVal[0] = cpc_perf_counter_select.u32All; + regAddr[0] = AiCpcCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + */ + + /* + case kHsaAiCounterBlockIdMc: { + AddPriviledgedCountersToList(AiBlockIdMc, blkCntrIdx); + //Num of regs equals to 0 means it is processed by KFD + regIdx = 0; + break; + } + + case kHsaAiCounterBlockIdIommuV2: { + AddPriviledgedCountersToList(AiBlockIdIommuV2, blkCntrIdx); + //Num of regs equals to 0 means it is processed by KFD + regIdx = 0; + break; + } + + case kHsaAiCounterBlockIdKernelDriver: { + AddPriviledgedCountersToList(AiBlockIdKernelDriver, blkCntrIdx); + //Num of regs equals to 0 means it is processed by KFD + regIdx = 0; + break; + } + */ + + default: { + regIdx = 0; + break; + } + } + + return regIdx; +} + +uint32_t AiPmu::BuildCounterReadRegisters(uint32_t reg_index, uint32_t block_id, uint32_t* reg_addr, + uint32_t* reg_val) { + uint32_t ii; + uint32_t reg_num = 0; + uint32_t instance_index; + regGRBM_GFX_INDEX grbm_gfx_index; + switch (block_id) { + case kHsaAiCounterBlockIdSq: + case kHsaAiCounterBlockIdSqGs: + case kHsaAiCounterBlockIdSqVs: + case kHsaAiCounterBlockIdSqPs: + case kHsaAiCounterBlockIdSqHs: + case kHsaAiCounterBlockIdSqCs: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiSqCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiSqCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaAiCounterBlockIdCb0: + case kHsaAiCounterBlockIdCb1: + case kHsaAiCounterBlockIdCb2: + case kHsaAiCounterBlockIdCb3: { + instance_index = block_id - kHsaAiCounterBlockIdCb0; + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiCbCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiCbCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + // Temp commented for Vega10 + /* + case kHsaAiCounterBlockIdCpf: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = AiCpfCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiCpfCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + */ + + case kHsaAiCounterBlockIdDb0: + case kHsaAiCounterBlockIdDb1: + case kHsaAiCounterBlockIdDb2: + case kHsaAiCounterBlockIdDb3: { + instance_index = block_id - kHsaAiCounterBlockIdDb0; + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiDbCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiDbCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaAiCounterBlockIdGrbm: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = AiGrbmCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiGrbmCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaAiCounterBlockIdGrbmSe: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = AiGrbmSeCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiGrbmSeCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaAiCounterBlockIdPaSu: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiPaSuCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiPaSuCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaAiCounterBlockIdPaSc: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiPaScCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiPaScCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaAiCounterBlockIdSpi: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiSpiCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiSpiCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaAiCounterBlockIdSx: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiSxCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiSxCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaAiCounterBlockIdTa0: + case kHsaAiCounterBlockIdTa1: + case kHsaAiCounterBlockIdTa2: + case kHsaAiCounterBlockIdTa3: + case kHsaAiCounterBlockIdTa4: + case kHsaAiCounterBlockIdTa5: + case kHsaAiCounterBlockIdTa6: + case kHsaAiCounterBlockIdTa7: + case kHsaAiCounterBlockIdTa8: + case kHsaAiCounterBlockIdTa9: + case kHsaAiCounterBlockIdTa10: + case kHsaAiCounterBlockIdTa11: + case kHsaAiCounterBlockIdTa12: + case kHsaAiCounterBlockIdTa13: + case kHsaAiCounterBlockIdTa14: + case kHsaAiCounterBlockIdTa15: { + instance_index = block_id - kHsaAiCounterBlockIdTa0; + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiTaCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiTaCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaAiCounterBlockIdTca0: + case kHsaAiCounterBlockIdTca1: { + instance_index = block_id - kHsaAiCounterBlockIdTca0; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiTcaCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiTcaCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaAiCounterBlockIdTcc0: + case kHsaAiCounterBlockIdTcc1: + case kHsaAiCounterBlockIdTcc2: + case kHsaAiCounterBlockIdTcc3: + case kHsaAiCounterBlockIdTcc4: + case kHsaAiCounterBlockIdTcc5: + case kHsaAiCounterBlockIdTcc6: + case kHsaAiCounterBlockIdTcc7: + case kHsaAiCounterBlockIdTcc8: + case kHsaAiCounterBlockIdTcc9: + case kHsaAiCounterBlockIdTcc10: + case kHsaAiCounterBlockIdTcc11: + case kHsaAiCounterBlockIdTcc12: + case kHsaAiCounterBlockIdTcc13: + case kHsaAiCounterBlockIdTcc14: + case kHsaAiCounterBlockIdTcc15: { + instance_index = block_id - kHsaAiCounterBlockIdTcc0; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiTccCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiTccCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaAiCounterBlockIdTd0: + case kHsaAiCounterBlockIdTd1: + case kHsaAiCounterBlockIdTd2: + case kHsaAiCounterBlockIdTd3: + case kHsaAiCounterBlockIdTd4: + case kHsaAiCounterBlockIdTd5: + case kHsaAiCounterBlockIdTd6: + case kHsaAiCounterBlockIdTd7: + case kHsaAiCounterBlockIdTd8: + case kHsaAiCounterBlockIdTd9: + case kHsaAiCounterBlockIdTd10: + case kHsaAiCounterBlockIdTd11: + case kHsaAiCounterBlockIdTd12: + case kHsaAiCounterBlockIdTd13: + case kHsaAiCounterBlockIdTd14: + case kHsaAiCounterBlockIdTd15: { + instance_index = block_id - kHsaAiCounterBlockIdTd0; + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiTdCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiTdCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaAiCounterBlockIdTcp0: + case kHsaAiCounterBlockIdTcp1: + case kHsaAiCounterBlockIdTcp2: + case kHsaAiCounterBlockIdTcp3: + case kHsaAiCounterBlockIdTcp4: + case kHsaAiCounterBlockIdTcp5: + case kHsaAiCounterBlockIdTcp6: + case kHsaAiCounterBlockIdTcp7: + case kHsaAiCounterBlockIdTcp8: + case kHsaAiCounterBlockIdTcp9: + case kHsaAiCounterBlockIdTcp10: + case kHsaAiCounterBlockIdTcp11: + case kHsaAiCounterBlockIdTcp12: + case kHsaAiCounterBlockIdTcp13: + case kHsaAiCounterBlockIdTcp14: + case kHsaAiCounterBlockIdTcp15: { + instance_index = block_id - kHsaAiCounterBlockIdTcp0; + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiTcpCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiTcpCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaAiCounterBlockIdGds: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = AiGdsCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiGdsCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaAiCounterBlockIdVgt: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiVgtCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiVgtCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaAiCounterBlockIdIa: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = AiIaCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiIaCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + /* + case kHsaAiCounterBlockIdMc: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = AiMcCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiMcCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + */ + // Temp Commented out for Vega10 + /* + case kHsaAiCounterBlockIdSrbm: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = AiSrbmCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiSrbmCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + */ + /* + case kHsaAiCounterBlockIdTcs: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = AiTcsCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiTcsCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + */ + case kHsaAiCounterBlockIdWd: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = AiWdCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiWdCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + // Temp commented for Vega10 + /* + case kHsaAiCounterBlockIdCpg: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = AiCpgCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiCpgCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + */ + + // Temp commented for Vega10 + /* + case kHsaAiCounterBlockIdCpc: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = AiCpcCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = AiCpcCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + */ + + // IommuV2, MC, kernel driver counters are retrieved via + // KFD implementation + case kHsaAiCounterBlockIdMc: + case kHsaAiCounterBlockIdIommuV2: + case kHsaAiCounterBlockIdKernelDriver: { + reg_num = 0; + break; + } + + default: { break; } + } + + return reg_num; +} + +hsa_status_t AiPmu::RemoveCounterBlocks() { + AiCounterBlockMap::iterator it = blk_map_.begin(); + AiCounterBlockMap::iterator block_end = blk_map_.end(); + + for (; it != block_end; it++) { + delete it->second; + } + + return HSA_STATUS_SUCCESS; +} + + +} /* namespace */ diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/ai_pmu.h b/runtime/hsa-ext-aql-profile/src/perfcounter/ai_pmu.h new file mode 100644 index 0000000000..a76ee9df0d --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/ai_pmu.h @@ -0,0 +1,137 @@ +#ifndef _AI_PMU_H_ +#define _AI_PMU_H_ + +#include "hsa.h" +#include "cmdwriter.h" +#include "hsa_perf.h" +#include "info_set.h" +#include "parameter_set.h" +#include "ai_blockinfo.h" +#include "rocr_profiler.h" + +#include +#include +#include + +namespace pm4_profile { +typedef std::map AiCounterBlockMap; + +// This class implement the AI PMU. It is responsible for setting up +// CounterGroups to represent each AI hardware block which exposes performance +// counters. +class AiPmu : public pm4_profile::Pmu { + public: + AiPmu(); + + ~AiPmu(); + + // Returns number of shader engines per block + // for the blocks featured shader engines instancing + uint32_t getNumSe() { return num_se_; } + + // Initializes the handle of buffer used to collect PMC data + bool setPmcDataBuff(uint8_t* pmcBuffer, uint32_t pmcBuffSz); + + int getLastError(); + + std::string getErrorString(int error); + + virtual bool begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, bool reset = true); + + virtual bool end(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter); + + // IPMU inherits the IParameterSet and IInfoSetso we implement it + // through composition and function forwarding + bool getParameter(uint32_t param, uint32_t& ret_size, void** pp_data); + + bool setParameter(uint32_t param, uint32_t param_size, const void* p_data); + + bool getInfo(uint32_t info, uint32_t& ret_size, void** pp_data); + + pm4_profile::CounterBlock* getCounterBlockById(uint32_t id); + + rocr_pmu_state_t getCurrentState() { return profiler_state_; } + + pm4_profile::CounterBlock** getAllCounterBlocks(uint32_t& num_groups); + + private: + // Addr of Counter Data Buffer + uint32_t* pmcData_; + + // Size of Counter Data Buffer + uint32_t pmcDataSz_; + + void Init(); + + bool initCounterBlock(); + + bool isResultReady(); + + // Clear CounterBlockMap + void clearCounterBlockMap(); + + // Reset SQ and CB counters + void ResetCounterBlocks(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter); + + // Program SQ block related counters + uint32_t ProgramSQCntrs(uint32_t sqRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Program TA block related counters + uint32_t ProgramTaCntrs(uint32_t taRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Program TCA block related counters + uint32_t ProgramTcaCntrs(uint32_t tcaRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Program TCC block related counters + uint32_t ProgramTccCntrs(uint32_t tccRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Program TCP block related counters + uint32_t ProgramTcpCntrs(uint32_t tcpRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Program TD block related counters + uint32_t ProgramTdCntrs(uint32_t tdRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Build counter selection register, return how many registers are built + uint32_t BuildCounterSelRegister(uint32_t cntrIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, pm4_profile::Counter* blkCntr); + + // Build counter selection register, return how many registers are built + uint32_t BuildCounterReadRegisters(uint32_t reg_index, uint32_t block_id, uint32_t* reg_addr, + uint32_t* reg_val); + + private: + // Delete counter blocks in the PMU + hsa_status_t RemoveCounterBlocks(); + + private: + // This contains the available counter groups. + AiCounterBlockMap blk_map_; + + // This stores the current profiling state. + rocr_pmu_state_t profiler_state_; + + pm4_profile::ParameterSet* parameter_set_; + + pm4_profile::InfoSet* info_set_; + + int error_code_; + + // Pointer used to store counter block list internally + uint32_t blk_list_size_; + pm4_profile::CounterBlock** blk_list_; + + // Indicates the number of Shader Engines Present + uint32_t num_se_; + + // Used to reset GRBM to its default state + uint32_t reset_grbm_; +}; +} + +#endif // _AI_PMU_H_ diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_blockinfo.h b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_blockinfo.h new file mode 100644 index 0000000000..acc19908c8 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_blockinfo.h @@ -0,0 +1,101 @@ +#ifndef _GPU_BLOCKINFO_H_ +#define _GPU_BLOCKINFO_H_ + +#include "rocr_profiler.h" +#include "gpu_enum.h" + +#include + +namespace pm4_profile { + +typedef enum CntlMethod { + CntlMethodNone = 0, + CntlMethodByInstance = 1, + CntlMethodBySe = 2, + CntlMethodBySeAndInstance = 3 +} CntlMethod; + +// Structure which contains information about a specific hardware block for CI. +#define GPU_BLOCK_NAME_SIZE 15 + +typedef struct GpuBlockInfo_ { + // Unique string identifier of the block. + const char blockName[GPU_BLOCK_NAME_SIZE]; + + // Unique string identifier of the block. + uint32_t counterGroupId; + + // Maximum number of shader engines + uint32_t maxShaderEngineCount; + + // Maximum number of shader arrays + uint32_t maxShaderArrayCount; + + // Maximum number of block instances in the group per shader array + uint32_t maxInstanceCount; + + // Counter control method + CntlMethod method; + + // Maximum counter event ID + uint32_t maxEventId; + + // Maximum number of counters that can be enabled at once + uint32_t maxSimultaneousCounters; + + // Maximum number of streaming counters that can be enabled at once + uint32_t maxStreamingCounters; + + // The number of hardware counters that are shared + // between regular and streaming counters. + // This is important so that resources are not double-booked + // between the two types of counters. + uint32_t sharedHWCounters; + + // Block counters can be configured with additional filters + bool hasFilters; + + //------------------------------------------ + // Trace specific stuff regarding when they get locked + + // Buffer size in bytes + uint32_t bufferSize; + + // Current write pointer offset from beginning of the buffer + uint32_t wptrOffset; + + // Flag that buffer might have wrapped + bool wrapped; + + // If buffer has wrapped, this could indicate approximate + // total amount of data that was dumpued in the trace buffer + uint32_t dataSizeEstimate; + + // Buffer data pointer + void* pData; +} GpuBlockInfo; + +// Register address corresponding to each counter +typedef struct GpuCounterRegInfo_ { + // counter select register address + uint32_t counterSelRegAddr; + + // counter control register address + uint32_t counterCntlRegAddr; + + // counter read register address low + uint32_t counterReadRegAddrLo; + + // counter read register address high + uint32_t counterReadRegAddrHi; +} GpuCounterRegInfo; + +// Gpu Privileged Block ID info. This number should be the same as that +// defined in KFD +typedef struct GpuPrivCounterBlockId_ { + // Block ID consists of 4 dwords + uint32_t items[4]; +} GpuPrivCounterBlockId; + +} // pm4_profile +#endif diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_counter.cpp b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_counter.cpp new file mode 100644 index 0000000000..6e46af151e --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_counter.cpp @@ -0,0 +1,73 @@ +#include "gpu_counter.h" + +using namespace pm4_profile; + +namespace pm4_profile { +static char error_string[][64] = { + {"No error"}, {"Counter generic error"}, {"Counter is already set"}, {"Counter not ready"}, +}; + +GpuCounter::GpuCounter() : Counter() { + counter_enabled_ = false; + parameter_set_ = new ParameterSet(); +} + +GpuCounter::~GpuCounter() { delete parameter_set_; } + +bool GpuCounter::getResult(uint64_t* p_result) { + if (!p_result) { + return false; + } + + *p_result = result_; + + return true; +} + +bool GpuCounter::setCounterBlock(pm4_profile::CounterBlock* p_cntr_group) { + if (!p_cntr_group) { + return false; + } + + counter_block_ = p_cntr_group; + + return true; +} + +pm4_profile::CounterBlock* GpuCounter::getCounterBlock() { return counter_block_; } + +bool GpuCounter::setEnable(bool b) { + // TODO: Validate counter + counter_enabled_ = b; + return true; +} + +void GpuCounter::setResult(uint64_t result) { result_ = result; } + +int GpuCounter::getLastError() { return error_code_; } + +std::string GpuCounter::getErrorString(int error) { + if ((error >= 0) && (error < kHsaCounterErrorCodeMax)) { + std::string err_string(error_string[error]); + return err_string; + } + return "Incorrect error index"; +} + +bool GpuCounter::getParameter(uint32_t param, uint32_t& ret_size, void** pp_data) { + return parameter_set_->getParameter(param, ret_size, pp_data); +} + +bool GpuCounter::setParameter(uint32_t param, uint32_t param_size, const void* p_data) { + bool ret_code; + + error_code_ = kHsaCounterErrorCodeNoError; + + ret_code = parameter_set_->setParameter(param, param_size, p_data); + if (ret_code == false) { + error_code_ = kHsaCounterErrorCodeAlreadySet; + } + + return ret_code; +} +} diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_counter.h b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_counter.h new file mode 100644 index 0000000000..f09d2849a7 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_counter.h @@ -0,0 +1,52 @@ +#ifndef _GPU_COUNTER_H_ +#define _GPU_COUNTER_H_ + +#include "hsa_perf.h" +#include "parameter_set.h" + +#include +#include +#include + +namespace pm4_profile { +// @brief This class represent each CI performance counter +class GpuCounter : public pm4_profile::Counter { + public: + GpuCounter(); + + virtual ~GpuCounter(); + + virtual int getLastError(); + + virtual std::string getErrorString(int error); + + virtual bool getResult(uint64_t* p_result); + + virtual pm4_profile::CounterBlock* getCounterBlock(); + + virtual bool setEnable(bool b); + + virtual bool isEnabled() { return counter_enabled_; } + + virtual bool isResultReady() { return is_result_ready_; } + + virtual bool getParameter(uint32_t param, uint32_t& ret_size, void** pp_data); + + virtual bool setParameter(uint32_t param, uint32_t param_size, const void* p_data); + + bool setCounterBlock(pm4_profile::CounterBlock* p_cntr_group); + + void setResult(uint64_t result); + + private: + bool counter_enabled_; + bool is_result_ready_; + uint64_t result_; + pm4_profile::ParameterSet* parameter_set_; + pm4_profile::CounterBlock* counter_block_; + uint32_t error_code_; +}; + +typedef std::list GpuCounterList; +} +#endif // _GPU_COUNTER_H_ diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_countergroup.cpp b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_countergroup.cpp new file mode 100644 index 0000000000..5b4005c4c0 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_countergroup.cpp @@ -0,0 +1,215 @@ +#include "gpu_countergroup.h" +#include "gpu_counter.h" +#include "gpu_enum.h" + +using namespace pm4_profile; + +namespace pm4_profile { + +static char error_string[][64] = { + {"No error"}, {"Counter block error"}, {"Max counter reached"}, {"Unkown counter"}}; + +GpuCounterBlock::GpuCounterBlock() : CounterBlock() { + cntr_list_.clear(); + parameter_set_ = new ParameterSet(); + info_set_ = new InfoSet(); + + // Initialize pointer to NULL + pp_cntrs_ = NULL; + + _initCounterBlockType(); +} + +GpuCounterBlock::~GpuCounterBlock() { + GpuCounterList::iterator it = cntr_list_.begin(); + GpuCounterList::iterator it_end = cntr_list_.end(); + + for (; it != it_end; it++) { + if (*it) { + delete (*it); + } + } + cntr_list_.clear(); + + delete parameter_set_; + delete info_set_; + + if (pp_cntrs_) { + free(pp_cntrs_); + pp_cntrs_ = NULL; + } +} + +void GpuCounterBlock::_initCounterBlockType() { + block_type_ = HSA_EXT_TOOLS_COUNTER_BLOCK_TYPE_ASYNC; +} + +Counter* GpuCounterBlock::createCounter() { + if (!_checkMaxNumOfCounters()) { + return NULL; + } + + GpuCounter* p_cntr = new GpuCounter(); + if (!p_cntr) { + return NULL; + } + + cntr_list_.push_back(p_cntr); + + return (Counter*)p_cntr; +} + +bool GpuCounterBlock::destroyCounter(Counter* p_cntr) { + bool ret = false; + + if (!p_cntr) { + return ret; + } + + GpuCounterList::iterator it = cntr_list_.begin(); + GpuCounterList::iterator it_end = cntr_list_.end(); + for (; it != it_end; it++) { + if (*it == p_cntr) { + delete (*it); + cntr_list_.erase(it); + ret = true; + break; + } + } + + return ret; +} + +bool GpuCounterBlock::destroyAllCounters() { + GpuCounterList::iterator it = cntr_list_.begin(); + GpuCounterList::iterator it_end = cntr_list_.end(); + + for (; it != it_end; it++) { + if (*it) { + delete (*it); + } + } + + cntr_list_.clear(); + + return true; +} + +Counter** GpuCounterBlock::getEnabledCounters(uint32_t& num) { + if (pp_cntrs_) { + free(pp_cntrs_); + pp_cntrs_ = NULL; + } + + pp_cntrs_ = (Counter**)malloc(sizeof(GpuCounter*) * cntr_list_.size()); + + if (!pp_cntrs_) { + return NULL; + } + + int cnt = 0; + GpuCounterList::iterator it = cntr_list_.begin(); + GpuCounterList::iterator it_end = cntr_list_.end(); + for (; it != it_end; it++) { + GpuCounter* p_cntr = (*it); + bool is_enabled; + is_enabled = p_cntr->isEnabled(); + if (is_enabled) { + *(pp_cntrs_ + cnt) = (Counter*)*it; + cnt++; + } + } + + num = cnt; + if (0 == num) { + return NULL; + } + + return pp_cntrs_; +} + +Counter** GpuCounterBlock::getAllCounters(uint32_t& num) { + if (pp_cntrs_) { + free(pp_cntrs_); + pp_cntrs_ = NULL; + } + + pp_cntrs_ = (Counter**)malloc(sizeof(GpuCounter*) * cntr_list_.size()); + + if (!pp_cntrs_) { + return NULL; + } + + int cnt = 0; + GpuCounterList::iterator it = cntr_list_.begin(); + GpuCounterList::iterator it_end = cntr_list_.end(); + for (; it != it_end; it++, cnt++) { + *(pp_cntrs_ + cnt) = (Counter*)*it; + } + + num = cnt; + if (0 == num) { + return NULL; + } + + return pp_cntrs_; +} + +bool GpuCounterBlock::setInfo(GPU_BLK_INFOS blk_info, uint32_t size, void* data) { + return info_set_->setInfo(blk_info, size, data); +} + +bool GpuCounterBlock::_checkMaxNumOfCounters() { + uint32_t num_enabled = _getNumOfEnabledCounters(); + + uint32_t* p_num_max = NULL; + uint32_t size = 0; + + if (!getInfo(GPU_BLK_INFO_MAX_SIMULTANEOUS_COUNTERS, size, (void**)&p_num_max)) { + return false; + } + + if (num_enabled >= *p_num_max) { + return false; + } + + return true; +} + +uint32_t GpuCounterBlock::_getNumOfEnabledCounters() { + uint32_t cnt = 0; + GpuCounterList::iterator it = cntr_list_.begin(); + GpuCounterList::iterator it_end = cntr_list_.end(); + + for (; it != it_end; it++) { + GpuCounter* p_cntr = (*it); + bool is_enabled; + is_enabled = p_cntr->isEnabled(); + if (is_enabled) { + cnt++; + } + } + + return cnt; +} + +std::string GpuCounterBlock::getErrorString(int error) { + if ((error >= 0) && (error < kHsaCounterBlockErrorCodeMaxError)) { + std::string err_string(error_string[error]); + return err_string; + } + return "incorrect error code"; +} + +bool GpuCounterBlock::getParameter(uint32_t param, uint32_t& ret_size, void** pp_data) { + return parameter_set_->getParameter(param, ret_size, pp_data); +} + +bool GpuCounterBlock::setParameter(uint32_t param, uint32_t param_size, const void* pData) { + return parameter_set_->setParameter(param, param_size, pData); +} + +bool GpuCounterBlock::getInfo(uint32_t info, uint32_t& ret_size, void** pp_data) { + return info_set_->getInfo(info, ret_size, pp_data); +} +} diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_countergroup.h b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_countergroup.h new file mode 100644 index 0000000000..8b1549b076 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_countergroup.h @@ -0,0 +1,70 @@ +#ifndef _GPU_COUNTER_GROUP_H_ +#define _GPU_COUNTER_GROUP_H_ + +// This file contains declaration of Sea Island (CI) CounterBlock class. +#include "hsa_perf.h" +#include "gpu_counter.h" +#include "parameter_set.h" +#include "info_set.h" +#include "gpu_enum.h" + +#include +#include + +namespace pm4_profile { +// This class represents one CI hardware block. Each block contains +// multiple performance counters. +class GpuCounterBlock : public pm4_profile::CounterBlock { + public: + GpuCounterBlock(); + ~GpuCounterBlock(); + + // NOTE [Suravee] : We specify CiPmu as a friend + // because the CiPmu needs to be able to setup info of + // the counter block. + friend class CiPmu; + friend class ViPmu; + friend class AiPmu; + + std::string getErrorString(int error); + + pm4_profile::Counter* createCounter(); + + virtual bool destroyCounter(pm4_profile::Counter* p_cntr); + + virtual bool destroyAllCounters(); + + virtual pm4_profile::Counter** getEnabledCounters(uint32_t& num); + + virtual pm4_profile::Counter** getAllCounters(uint32_t& num); + + virtual bool getParameter(uint32_t param, uint32_t& ret_size, void** pp_data); + + virtual bool setParameter(uint32_t param, uint32_t param_size, const void* p_data); + + virtual bool getInfo(uint32_t info, uint32_t& ret_size, void** pp_data); + + protected: + void _initCounterBlockType(); + + bool setInfo(GPU_BLK_INFOS blk_info, uint32_t size, void* data); + + hsa_ext_tools_counter_block_type_t block_type_; + + private: + bool _checkMaxNumOfCounters(); + + uint32_t _getNumOfEnabledCounters(); + + pm4_profile::ParameterSet* parameter_set_; + pm4_profile::InfoSet* info_set_; + GpuCounterList cntr_list_; + uint32_t error_code_; + + // Pointer of buffer to store counter list + pm4_profile::Counter** pp_cntrs_; +}; + +} // pm4_profile + +#endif // _GPU_COUNTER_GROUP_H_ diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_enum.h b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_enum.h new file mode 100644 index 0000000000..085bc6f29b --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/gpu_enum.h @@ -0,0 +1,65 @@ +#ifndef _GPU_ENUM_H_ +#define _GPU_ENUM_H_ + +namespace pm4_profile { + +// Enumeration containing GPU hardware block information +enum GPU_BLK_INFOS { + GPU_BLK_INFO_BLOCK_NAME, + GPU_BLK_INFO_ID, + GPU_BLK_INFO_MAX_SHADER_ENGINE_COUNT, + GPU_BLK_INFO_MAX_SHADER_ARRAY_COUNT, + GPU_BLK_INFO_MAX_INSTANCE_COUNT, + GPU_BLK_INFO_CONTROL_METHOD, + GPU_BLK_INFO_MAX_EVENT_ID, + GPU_BLK_INFO_MAX_SIMULTANEOUS_COUNTERS, + GPU_BLK_INFO_MAX_STREAMING_COUNTERS, + GPU_BLK_INFO_SHARED_HW_COUNTERS, + GPU_BLK_INFO_HAS_FILTERS, + + // Trace-specific stuff + GPU_TRC_BLK_INFO_BUFFER_SIZE, + GPU_TRC_BLK_INFO_BUFFER_WRITE_POINTER_OFFSET, + GPU_TRC_BLK_INFO_BUFFER_WRAPPED, + GPU_TRC_BLK_INFO_DATA_SIZE_ESTIMATE, + GPU_TRC_BLK_INFO_DATA_POINTER, +}; + + +/** + * Trace buffer parameters + */ +enum GPU_BLK_PARAMS { + // Allows user to specify the size of the trace buffers. + GPU_BLK_PARAM_TRACE_BUFFER_SIZE, + + // If we decide to implement this functionality, this will allow the user + // to specify the number of trace buffers to create. + GPU_BLK_PARAM_TRACE_BUFFER_ARRAY, + + // Specifies whether a new trace buffer should be used for each cmd buffer. + // This allows for better correlation of data back to the host application + // If this is enabled, and the user does not explicitly specify a + // TRACE_BUFFER_ARRAY, then the driver should automatically allocate + // additional buffers as needed so that as much of the application + // can be traced as possible, until the PerfExperiment is ended. + // If a TRACE_BUFFER_ARRAY is specified, then only as many buffers + // as specified should be created. If more cmd buffers get submitted + // than there are trace buffers, then the later cmd buffers should + // not be traced. + GPU_BLK_PARAM_TRACE_NEW_BUFFER_ON_SUBMIT, +}; + + +// Enumeration containing GPU counter parameters +enum GPU_CNTR_PARAMS { + GPU_CNTR_PARAM_SHADERENGINE_ID, + GPU_CNTR_PARAM_SHADERARRAY_ID, + GPU_CNTR_PARAM_INSTANCE_ID, + GPU_CNTR_PARAM_EVENT_SELECT_ID, + GPU_CNTR_PARAM_SIMD_MASK, + GPU_CNTR_PARAM_PERF_MODE, + GPU_CNTR_PARAM_TRACE_TYPE, +}; +} +#endif diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/hsa_perf.h b/runtime/hsa-ext-aql-profile/src/perfcounter/hsa_perf.h new file mode 100644 index 0000000000..1611e63faa --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/hsa_perf.h @@ -0,0 +1,436 @@ +#ifndef _HSA_PERF_H_ +#define _HSA_PERF_H_ + +#include "rocr_profiler.h" + +#if !defined(AMD_AMP_HSA_INCLUDES) +#include +#include +#include +#include +#endif + +namespace pm4_profile { +class Pmu; +class Counter; +class CounterBlock; +class TraceGroup; +class CommandWriter; +class DefaultCmdBuf; + + +// @brief This is an abstract class for defining a CounterBlock. Each +// CounterBlock contains a set of Counters that often belong to the +// same functional unit +// +// For AMD GPU, this can represent blocks of Counters in each HW block +// (e.g. SQ, SQI, CP, etc.). +// For AMD CPU, this can represent blocks of core PMCs, NB PMCs, L2I PMCs +// on each CPU device +// +// Generally, CounterBlocks are created and initialized by the \ref Pmu class. +// Users can query them by calling \ref Pmu::getAllCounterBlocks() or +// \ref Pmu::getCounterBlockById(). A CounterBlock is enabled if it contains +// enabled Counters in the block. +// +// Users can manage Counters in each GounterBlock (e.g. create, destroy, +// enable and disable). To specify a Counter, users simply call \ref +// createCounter. Then it can be enabled or disabled using \ref +// Counter::setEnable. When a Counter is enabled, it is checked against the +// CounterBlock checks to make sure that the enabled-counter is valid and is +// not conflicting with the current Counters in the block. +class CounterBlock { + public: + typedef enum HsaCounterBlockErrorCode { + // Generic CounterBlock error + kHsaCounterBlockErrorCodeNoError = 0x0, + + // Generic CounterBlock error + kHsaCounterBlockErrorCodeGenericError, + + // The maximum number of Counters in the block is reached. + kHsaCounterBlockErrorCodeMaxNumCounterReached, + + // The counter does not belong to this block. + kHsaCounterBlockErrorCodeUnknownCounter, + + // The counter does not belong to this block. + kHsaCounterBlockErrorCodeMaxError + } HsaCounterBlockErrorCode; + + // Destructor of CounterBlock. + virtual ~CounterBlock() {} + + // 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; + + // Create an Counter object return a pointer to caller. + // Return On success, this function returns a pointer to Counter + // On failure, this function returns NULL + // Possible error codes are: + // kHSAPerfErrorCodesUnmodifiableState + // kHsaCounterBlockErrorCodeMaxNumCounterReached + virtual Counter* createCounter() = 0; + + // Destroy the Counter. The CounterBlock which owns the Counter must be in + // disabled state. + // Return true or false + // Possible error codes are: + // kHSAPerfErrorCodesInvalidAargs + // kHSAPerfErrorCodesUnmodifiableState + // kHsaCounterBlockErrorCodeUnknownCounter + virtual bool destroyCounter(Counter* p_counter) = 0; + + // Destroy all counters in the block. The CounterBlock must be in disable + // state. + // Return true or false. + // Possible error codes are: + // kHSAPerfErrorCodesUnmodifiableState + virtual bool destroyAllCounters() = 0; + + // Get a list of pointers to the enabled Counters in this CounterBlock. + // note The Counter must be created by the same CounterBlock object using + // createCounter(). + // @param[in] num The number of Counter pointers returned. + // Return + // return a list of pointers to the enabled Counters. + // return NULL if no counter is enabled. + virtual Counter** getEnabledCounters(uint32_t& num) = 0; + + // Get a list of pointers to the all Counters in this CounterBlock. + // note The Counter must be created by the same CounterBlock object using + // createCounter(). + // @param[in] num The number of Counter pointers returned. + // Return + // return a list of pointers in the CounterBlock. + // return NULL if no counter is enabled. + virtual Counter** getAllCounters(uint32_t& num) = 0; + + // Query value of the parameter specified by param + // @param[in] param The enumeration of parameter to be queried + // @param[out] return_size The returned size of data + // @param[out] pp_data The pointer to the returned data. The API is + // responsible for managing the memory to store the information as specified + // by return_size. + // + // Return true or false + // Possible error codes are: + // kHSAPerfErrorCodesInvalidParam + // kHSAPerfErrorCodesInvalidParamSize + // kHSAPerfErrorCodesInvalidParamData + virtual bool getParameter(uint32_t param, uint32_t& return_size, void** pp_data) = 0; + + // Set value for the parameter specified by param + // @param[in] param The enumeration of parameter to be queried + // @param[out] param_size The size of data + // @param[out] p_data The pointer to the data to be set. Users are responsible + // for deallocating the memory of p_data after calling the API. + // Return true or false + // Possible error codes are: + // kHSAPerfErrorCodesUnmodifiableState + // kHSAPerfErrorCodesInvalidParam + // kHSAPerfErrorCodesInvalidParamSize + // kHSAPerfErrorCodesInvalidParamData + virtual bool setParameter(uint32_t param, uint32_t param_size, const void* p_data) = 0; + + // Query value of the information specified by info + // @param[in] info The enumeration of information to be queried + // @param[out] Return_size The returned size of data + // @param[out] pp_data The pointer to the returned data + // Return true or false + // Possible error codes are: + // kHSAPerfErrorCodesInvalidInfo + // kHSAPerfErrorCodesInvalidInfoSize + // kHSAPerfErrorCodesInvalidInfoData + virtual bool getInfo(uint32_t info, uint32_t& return_size, void** pp_data) = 0; +}; // class CounterBlock + + +// This is an abstract class for defining a TraceGroup. TraceGroup inherits +// CounterBlock and add interfaces for managing trace buffer. It also supports +// user-data insertion into trace. This allows users to insert arbitary data +// (e.g. markers) into trace which and can be used to correlating a specific +// events to the collected trace data. +class TraceGroup : public CounterBlock { + public: + typedef enum HsaTraceGroupErrorCode { + // Generic TraceGroup error + HsaTraceGroupErrorCodeGenericError = 0x100, + } HsaTraceGroupErrorCode; + + // Destructor of TraceGroup. + virtual ~TraceGroup() {} + + // Obtains the number of buffers which were collected as part of + // the trace. + // Return The number of collected buffers. + virtual uint32_t getCollectedBufferCount() = 0; + + // Locks a trace buffer for host access. + // @param[in] buffer_id The index of the buffer to be locked. + // Return true or false + virtual bool lock(uint32_t buffer_id) = 0; + + // Unlock a trace buffer that was previously locked. + // @param[in] buffer_id The index of the buffer to be unlocked. + // Return true or false + virtual bool unlock(uint32_t buffer_id) = 0; + + // Inserts data (e.g. trace marker) into the trace. + // @param[in] type The type of data to be inserted. + // @param[in] p_data The data to be inserted. + // @param[in] data_size The size of data to be inserted. + // Return true or false + virtual bool insertUserData(uint32_t type, void* p_data, uint32_t data_size) = 0; +}; // class TraceGroup + + +// This is an abstract class for defining a performance Counter. +// Users can obtain a Counter from \ref CounterBlock::createCounter(). +// Once obtained, users can set up Counter parameters, and enable it using +// \ref Counter::setEnable(). +// +// There are several types of Counter as defined in \ref +// HsaCounterBlockTypeMask. +// Only the supported Counter type can be added to the CounterBlock. +// +// Each Counter can store Counter-specific parameters. The Counter is used to +// specify types of event to be counted. +class Counter { + public: + typedef enum HsaCounterErrorCode { + // Generic Counter error + kHsaCounterErrorCodeNoError = 0x0, + + // Generic Counter error + kHsaCounterErrorCodeGenericError = 0x1, + + // Counter already error + kHsaCounterErrorCodeAlreadySet = 0x2, + + // Counter result is not ready. + kHsaCounterErrorCodeResultNotReady = 0x3, + + // Max counter error num + kHsaCounterErrorCodeMax, + } HsaCounterErrorCode; + + // Destructor of Counter + virtual ~Counter() {} + + // 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; + + // Get the \ref CounterBlock which owns this counter. + // Return + // On success, it returns a pointer to the CounterBlock. + // On Failure, it returns NULL. + virtual CounterBlock* getCounterBlock() = 0; + + // Enable or disable the Counter. + // @param[in] b Set to true to enable the CounterBlock. + // Return + // return true when successfully set the state. + // return false otherwise. + // In case of the current state already is set to the specified value, + // the API returns true. + // Possible error codes are: + // kHSAPerfErrorCodesUnmodifiableState + virtual bool setEnable(bool b) = 0; + + // Return the current state of the Counter. + // Return true or false + virtual bool isEnabled() = 0; + + // Return the status of this Counter whether the result is available. + // Return true or false + virtual bool isResultReady() = 0; + + // Query Counter result + // note Must be implemented by derived classes + // @param[out] p_result The pointer containing the returned result. + // Return true or false + // Possible error codes are: + // kHSAPerfErrorCodesInvalidAargs + // kHsaCounterErrorCodeResultNotReady + virtual bool getResult(uint64_t* p_result) = 0; + + // Query value of the parameter specified by param + // @param[in] param The enumeration of parameter to be queried + // @param[out] Return_size The returned size of data + // @param[out] pp_data The pointer to the returned data. The API is + // responsible for managing the memory to store the information as + // specified by return_size. + // Return true or false + // Possible error codes are: + // kHSAPerfErrorCodesInvalidParam + // kHSAPerfErrorCodesInvalidParamSize + // kHSAPerfErrorCodesInvalidParamData + virtual bool getParameter(uint32_t param, uint32_t& return_size, void** pp_data) = 0; + + // Set value for the parameter specified by param + // @param[in] param The enumeration of parameter to be queried + // @param[out] param_size The size of data + // @param[out] p_data The pointer to the data to be set. Users are responsible + // for deallocating the memory of p_data after calling the API. + // Return true or false + // Possible error codes are: + // kHSAPerfErrorCodesUnmodifiableState + // kHSAPerfErrorCodesInvalidParam + // kHSAPerfErrorCodesInvalidParamSize + // kHSAPerfErrorCodesInvalidParamData + virtual bool setParameter(uint32_t param, uint32_t param_size, const void* p_data) = 0; +}; // class Counter + +class Pmu { + public: + // Enumeration of Pmu error codes + typedef enum HsaPmuErrorCode { + // Generic PMU error + kHsaPmuErrorCodeNoError = 0x0, + + // Unknown CounterBlock ID + kHsaPmuErrorCodeUnknownCounterBlockId, + + // No CounterBlock exists + kHsaPmuErrorCodeNoCounterBlock, + + // The previously operation is not valid. This could be due to + // invalid transition from the current state. + kHsaPmuErrorCodeInvalidOperation, + + // PMU is not currently available (e.g. PMU is currently + // in-used by others) + kHsaPmuErrorCodeNotAvailable, + + // PMU is not currently available (e.g. PMU is currently + // in-used by others) + kHsaPmuErrorCodeErrorState, + + // PMU result is timeout + kHsaPmuErrorCodeTimeOut, + + // Max error count + kHsaPmuErrorCodeMax + } HsaPmuErrorCode; + + // 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; + + // Get CounterBlock from Id + // @param[in] id ID of the target CounterBlock + // Return + // On success, it returns a pointer to specified CounterBlock. + // On Failure, it returns NULL. + // Possible error codes are: + // kHsaPmuErrorCodeUnknownCounterBlockId. + virtual CounterBlock* getCounterBlockById(uint32_t id) = 0; + + // Get all available CounterBlock + // @param[out] num_block The returned number of CounterBlocks + // Return On success, it returns an array of CounterBlock pointers. + // On Failure, it returns NULL. + virtual CounterBlock** getAllCounterBlocks(uint32_t& num_block) = 0; + + // Get current PMU profiling state. + // Return The PMU profiling state as defined in \ref PMU_PROFILE_STATES + virtual rocr_pmu_state_t getCurrentState() = 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: + // kHsaPmuErrorCodeInvalidOperation + // kHsaPmuErrorCodeNotAvailable + virtual bool begin(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter, bool reset = true) = 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: + // kHsaPmuErrorCodeInvalidOperation + virtual bool end(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter) = 0; + + // Initializes the handle of buffer used to collect PMC data + // @param pmcBuffer The buffer pointer + // @param cmdBufSz Size in terms of bytes + virtual bool setPmcDataBuff(uint8_t* pmcBuffer, uint32_t pmcBuffSz) = 0; + + // Query value of the parameter specified by param + // @param[in] param The enumeration of parameter to be queried + // @param[out] Return_size The returned size of data + // @param[out] pp_data The pointer to the returned data. The API is + // responsible for managing the memory to store the information as + // specified by return_size. + // Return true or false + // Possible error codes are: + // kHSAPerfErrorCodesInvalidParam + // kHSAPerfErrorCodesInvalidParamSize + // kHSAPerfErrorCodesInvalidParamData + virtual bool getParameter(uint32_t param, uint32_t& return_size, void** pp_data) = 0; + + // Set value for the parameter specified by param + // @param[in] param The enumeration of parameter to be queried + // @param[out] param_size The size of data + // @param[out] p_data The pointer to the data to be set. Users are responsible + // for deallocating the memory of p_data after calling the API. + // Return true or false + // Possible error codes are: + // kHSAPerfErrorCodesUnmodifiableState + // kHSAPerfErrorCodesInvalidParam + // kHSAPerfErrorCodesInvalidParamSize + // kHSAPerfErrorCodesInvalidParamData + virtual bool setParameter(uint32_t param, uint32_t param_size, const void* p_data) = 0; + + // Query value of the information specified by info + // @param[in] info The enumeration of information to be queried + // @param[out] Return_size The returned size of data + // @param[out] pp_data The pointer to the returned data + // Return true or false + // Possible error codes are: + // kHSAPerfErrorCodesInvalidInfo + // kHSAPerfErrorCodesInvalidInfoSize + // kHSAPerfErrorCodesInvalidInfoData + virtual bool getInfo(uint32_t info, uint32_t& return_size, void** pp_data) = 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/runtime/hsa-ext-aql-profile/src/perfcounter/info_set.cpp b/runtime/hsa-ext-aql-profile/src/perfcounter/info_set.cpp new file mode 100644 index 0000000000..f886170eb5 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/info_set.cpp @@ -0,0 +1,74 @@ +#include "info_set.h" +#include "var_data.h" +using namespace std; + +namespace pm4_profile { +InfoSet::InfoSet() { + releaseParameters(); + info_table_.clear(); + p_data_ = NULL; +} + +InfoSet::~InfoSet() { + releaseParameters(); + info_table_.clear(); + free(p_data_); + p_data_ = NULL; +} + +bool InfoSet::setInfo(uint32_t info, uint32_t info_size, void* p_data) { + if (info_table_.end() != info_table_.find(info)) { + return false; + } + + VarData data; + if (!data.set(info_size, p_data)) { + return false; + } + + info_table_.insert(VarDataMap::value_type(info, data)); + return true; +} + +bool InfoSet::getInfo(uint32_t info, uint32_t& ret_size, void** pp_data) { + if (!pp_data || (0 == info_table_.size())) { + return false; + } + + VarDataMap::iterator it = info_table_.find(info); + if (it == info_table_.end()) { + return false; + } + + int size = it->second.getSize(); + if (size == 0) { + return false; + } + + free(p_data_); + p_data_ = NULL; + + p_data_ = malloc(size); + if (!p_data_) { + return false; + } + + *pp_data = p_data_; + + ret_size = info_table_[info].get(size, *pp_data); + + return true; +} + +void InfoSet::releaseParameters() { + VarDataMap::iterator it = info_table_.begin(); + VarDataMap::iterator table_end = info_table_.end(); + + for (; it != table_end; it++) { + it->second.clear(); + } + + return; +} + +} // pm4_profile diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/info_set.h b/runtime/hsa-ext-aql-profile/src/perfcounter/info_set.h new file mode 100644 index 0000000000..8527491908 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/info_set.h @@ -0,0 +1,48 @@ +#ifndef _INFO_SET_H_ +#define _INFO_SET_H_ + +// This file contains declaration of IInfoSet class. +#include "hsa_perf.h" +#include "var_data.h" + +#include +#include + +namespace pm4_profile { +// An abstract class defining a container to hold a information data set +// (e.g. PMU info, CounterGroup info, etc.). Unlike \ref IParameterSet, +// This class allows only the children of the class to set the information. +class InfoSet { + public: + // IInfoSet constructor + InfoSet(); + + // IInfoSet destructor + virtual ~InfoSet(); + + // Query value of the information specified by info + // @param[in] info The enumeration of information to be queried + // @param[out] ret_size The returned size of data + // @param[out] pp_data The pointer to the returned data + // /return true or false + bool getInfo(uint32_t info, uint32_t& ret_size, void** pp_data); + + // Set value for the information specified by info + // @param[in] info The enumeration of information to be queried + // @param[out] info_size The size of data + // @param[out] p_data The pointer to the data to be set + // /return true or false + bool setInfo(uint32_t info, uint32_t info_size, void* p_data); + + private: + // Remove all data in the parameter table + void releaseParameters(); + + // InfoSet property: The info table + VarDataMap info_table_; + + // Pointer to the buffer used in getInfo + void* p_data_; +}; +} +#endif diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/parameter_set.cpp b/runtime/hsa-ext-aql-profile/src/perfcounter/parameter_set.cpp new file mode 100644 index 0000000000..f43ac28569 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/parameter_set.cpp @@ -0,0 +1,74 @@ +#include "parameter_set.h" + +using namespace std; + +namespace pm4_profile { +ParameterSet::ParameterSet() { + releaseParameters(); + param_table_.clear(); + p_data_ = NULL; +} + +ParameterSet::~ParameterSet() { + releaseParameters(); + param_table_.clear(); + free(p_data_); + p_data_ = NULL; +} + +bool ParameterSet::setParameter(uint32_t param, uint32_t param_size, const void* p_data) { + if (param_table_.end() != param_table_.find(param)) { + return false; + } + + VarData data; + if (!data.set(param_size, p_data)) { + return false; + } + + param_table_.insert(VarDataMap::value_type(param, data)); + return true; +} + +bool ParameterSet::getParameter(uint32_t param, uint32_t& ret_size, void** pp_data) { + if (!pp_data || (0 == param_table_.size())) { + return false; + } + + VarDataMap::iterator it = param_table_.find(param); + if (it == param_table_.end()) { + return false; + } + + int size = it->second.getSize(); + if (size == 0) { + return false; + } + + // for NULL pointer, free does nothing + free(p_data_); + p_data_ = malloc(size); + if (!p_data_) { + return false; + } + + // store the pointer to be freed + *pp_data = p_data_; + + ret_size = param_table_[param].get(size, *pp_data); + + return true; +} + +bool ParameterSet::releaseParameters() { + VarDataMap::iterator it = param_table_.begin(); + VarDataMap::iterator table_end = param_table_.end(); + + for (; it != table_end; it++) { + it->second.clear(); + } + + return true; +} + +} // pm4_profile diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/parameter_set.h b/runtime/hsa-ext-aql-profile/src/perfcounter/parameter_set.h new file mode 100644 index 0000000000..2d9d181a98 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/parameter_set.h @@ -0,0 +1,75 @@ +#ifndef _PARAMETER_SET_H_ +#define _PARAMETER_SET_H_ + +/*! + \note This file contains declaration of IParameterSet class. + */ +#include "hsa_perf.h" +#include "var_data.h" + +#include +#include + +namespace pm4_profile { +/*! + A class defining a container to hold parameter data set + (e.g. PMU parameter, CounterGroup parameter, etc.). + */ +class ParameterSet { + public: + /*! + Enumeration containing types of parameters + */ + enum parameter { + PARAM_MAX, + }; + + /*! IParameterSet constructor */ + ParameterSet(); + + /*! IParameterSet destructor */ + virtual ~ParameterSet(); + + /*! + Query value of the parameter specified by param + @param[in] param The enumeration of parameter to be queried + @param[out] ret_size The returned size of data + @param[out] pp_data The pointer to the returned data + /return true or false + */ + bool getParameter( + /*in*/ uint32_t param, + /*out*/ uint32_t& ret_size, + /*out*/ void** pp_data); + + /*! + Set value for the parameter specified by param + @param[in] param The enumeration of parameter to be queried + @param[out] param_size The size of data + @param[out] p_data The pointer to the data to be set + /return true or false + */ + bool setParameter( + /*in*/ uint32_t param, + /*in*/ uint32_t param_size, + /*in*/ const void* p_data); + + private: + /*! + Remove all data in the parameter table + */ + bool releaseParameters(); + + /*! + IParameterSet property: The parameter table + */ + VarDataMap param_table_; + + /*! + Pointer to the buffer used in getParameter + */ + void* p_data_; +}; +} + +#endif // _PARAMETER_SET_H_ diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/rocr_profiler.h b/runtime/hsa-ext-aql-profile/src/perfcounter/rocr_profiler.h new file mode 100644 index 0000000000..dc2c385413 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/rocr_profiler.h @@ -0,0 +1,254 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// The University of Illinois/NCSA +// Open Source License (NCSA) +// +// Copyright (c) 2014-2015, Advanced Micro Devices, Inc. All rights reserved. +// +// Developed by: +// +// AMD Research and AMD HSA Software Development +// +// Advanced Micro Devices, Inc. +// +// www.amd.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal with the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimers. +// - Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimers in +// the documentation and/or other materials provided with the distribution. +// - Neither the names of Advanced Micro Devices, Inc, +// nor the names of its contributors may be used to endorse or promote +// products derived from this Software without specific prior written +// permission. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS WITH THE SOFTWARE. +// +//////////////////////////////////////////////////////////////////////////////// + +#ifndef _ROCR_PROFILER_H_ +#define _ROCR_PROFILER_H_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +#if defined _WIN32 || defined __CYGWIN__ +#ifdef __GNUC__ +#define HSA_TOOLS_API __attribute__((dllexport)) +#else +#define HSA_TOOLS_API __declspec(dllexport) // Note: actually gcc seems +// to also supports this +// syntax. +#endif +#ifndef DLL_LOCAL +#define DLL_LOCAL +#endif + +#else // defined _WIN32 || defined __CYGWIN__ +#if __GNUC__ >= 4 +#define HSA_TOOLS_API __attribute__((visibility("default"))) +#ifndef DLL_LOCAL +#define DLL_LOCAL __attribute__((visibility("hidden"))) +#endif +#else +#define HSA_TOOLS_API +#ifndef DLL_LOCAL +#define DLL_LOCAL +#endif +#endif +#endif // defined _WIN32 || defined __CYGWIN__ + +//---------------------------------------------------------------------------// +// @brief Enumeration of various information that is set for a counter. // +// @detail This enumeration defines the various counter info that could be // +// used in a counter. This is used by a counter object to specify // +// its type and other conditions that are needed to retrieve a // +// counter value. // +//---------------------------------------------------------------------------// +typedef enum hsa_ext_tools_counter_parameter_s { + // Event index of a counter + HSA_EXT_TOOLS_COUNTER_PARAMETER_EVENT_INDEX = 0, + + // Simd mask of a counter + HSA_EXT_TOOLS_COUNTER_PARAMETER_SIMD_MASK = 1, + + // Shader engine mask of a counter + HSA_EXT_TOOLS_COUNTER_PARAMETER_SHADER_MASK = 2, + + // Max counter info index + HSA_EXT_TOOLS_COUNTER_PARAMETER_INFO_MAX +} hsa_ext_tools_counter_parameter_t; + +//---------------------------------------------------------------------------// +// @brief Enumeration of counter block type mask // +// @details This enumeration define the bit mask representing types of // +// counter broup supported by HSA. This is used by counter block object to // +// specify its type. // +//---------------------------------------------------------------------------// +typedef enum hsa_ext_tools_counter_block_type_s { + // Unknown counter block type + HSA_EXT_TOOLS_COUNTER_BLOCK_TYPE_UNKNOWN = 0, + + // The CounterBlock of this type can be access at anytime. + // note Examples are software Counters and CPU Counters. + HSA_EXT_TOOLS_COUNTER_BLOCK_TYPE_SYNC = 1, + + // The CounterBlock type can be access asynchronously. + // It is required that the Counter must be stopped + // before accessing. + HSA_EXT_TOOLS_COUNTER_BLOCK_TYPE_ASYNC = 2, + + // The CounterBlock of this counter block is used for generating + // trace. + HSA_EXT_TOOLS_COUNTER_BLOCK_TYPE_TRACE = 3, + + // Max CounterBlock type + HSA_EXT_TOOLS_COUNTER_BLOCK_TYPE_MAX +} hsa_ext_tools_counter_block_type_t; + +//---------------------------------------------------------------------------// +// @brief Enumeration of various information that is set for a counter block.// +// @detail This enumeration defines the various info that could be used // +// in a counter block. This is used by a counter object to specify its type // +// and other conditions that are needed for a counter block. // +//---------------------------------------------------------------------------// +/* +typedef enum hsa_ext_tools_counter_block_info_s { + // Index of a counter block + HSA_EXT_TOOLS_COUNTER_BLOCK_INFO_EVENT_INDEX = 0, + + // Shader bits of a counter block + HSA_EXT_TOOLS_COUNTER_BLOCK_INFO_SHADER_BITS = 1, + + // Simd mask of a counter + HSA_EXT_TOOLS_COUNTER_BLOCK_INFO_CONTROL_METHOD = 2, + + // Max index of counter block info + HSA_EXT_TOOLS_COUNTER_BLOCK_INFO_MAX +} hsa_ext_tools_counter_block_info_t; +*/ + +//---------------------------------------------------------------------------// +// Enumeration for the methods used to index into the correct registers. // +//---------------------------------------------------------------------------// +/* +typedef enum hsa_ext_tools_counter_index_method_s { + // No index + HSA_EXT_TOOLS_COUNTER_INDEX_METHOD_BY_NONE = 0, + + // Index by block instance + HSA_EXT_TOOLS_COUNTER_INDEX_METHOD_BY_INSTANCE = 1, + + // Index by shader engine + HSA_EXT_TOOLS_COUNTER_INDEX_METHOD_BY_SHADER_ENGINE = 2, + + // Index by shader and instance + HSA_EXT_TOOLS_COUNTER_INDEX_METHOD_BY_SHADER_ENGINE_ANDINSTANCE = 3 +} hsa_ext_tools_counter_index_method_t; +*/ + +//---------------------------------------------------------------------------// +// Enumeration for the HSAPerf generic error codes // +//---------------------------------------------------------------------------// +/* +typedef enum hsa_ext_tools_error_codes_s { + // Successful + HSA_EXT_TOOLS_ERROR_CODE_OK = 0, + + // Generic error code + HSA_EXT_TOOLS_ERROR_CODE_ERROR, + + // Generic invalid HSAPerf API arguments + HSA_EXT_TOOLS_ERROR_CODE_INVALID_ARGS, + + // The operation is not permit due to currently in the unmodifiable + // HSAPerf state . + HSA_EXT_TOOLS_ERROR_CODE_UNMODIFIABLE_STATE, + + // The hsa_ext_tools_set_pmu_parameter() or + // hsa_ext_tools_get_pmu_parameter() API contains invalid parameter value. + HSA_EXT_TOOLS_ERROR_CODE_INVALID_PARAM, + + // The hsa_ext_tools_set_pmu_parameter() or + // hsa_ext_tools_get_pmu_parameter() API contains invalid parameter size + // or return size. + HSA_EXT_TOOLS_ERROR_CODE_INVALID_PARAM_SIZE, + + // The hsa_ext_tools_set_pmu_parameter() or + // hsa_ext_tools_get_pmu_parameter() API contains invalid + // pointer (e.g. NULL). + HSA_EXT_TOOLS_ERROR_CODE_INVALID_PARAM_DATA, + + // The hsa_ext_tools_get_pmu_info() API contains invalid info value. + HSA_EXT_TOOLS_ERROR_CODE_INVALID_INFO, + + // The hsa_ext_tools_get_pmu_info() API contains invalid info + // size (e.g. zero). + HSA_EXT_TOOLS_ERROR_CODE_INVALID_INFO_SIZE, + + // The hsa_ext_tools_get_pmu_info() API contains invalid + // data (e.g. NULL). + HSA_EXT_TOOLS_ERROR_CODE_INVALID_INFO_DATA +} hsa_ext_tools_error_codes_t; +*/ + +//---------------------------------------------------------------------------// +// Enumeration for Pmu profiling state // +//---------------------------------------------------------------------------// +typedef enum rocr_pmu_state_s { + // Profiling idle. In this state, changes can be made to + // the PMU, counter blocks, counters. This state can represent + // the moment prior to calling begin or after calling + // hsa_ext_tools_pmu_wait_for_completion(). + ROCR_PMU_STATE_IDLE, + + // Profiling start. In this state, changes cannot be made to + // the PMU, counter block, counters. The PMU is collecting + // performance counter data. This state represents + // the moment after calling hsa_ext_tools_pmu_begin() and before calling + // hsa_ext_tools_pmu_end() + ROCR_PMU_STATE_START, + + // Profiling stop. In this state, changes cannot be made to + // the PMU, counter blocks, Counters. PMU has stopped the + // performance counter data collection. However, the result + // might not yet be available. This state represents + // the moment after calling hsa_ext_tools_pmu_end() and before the call + // to hsa_ext_tools_pmu_wait_for_completion() has returned success. + ROCR_PMU_STATE_STOP +} rocr_pmu_state_t; + +//---------------------------------------------------------------------------// +// Opaque pointer to HSA performance monitor unit (PMU) // +//---------------------------------------------------------------------------// +// typedef void * hsa_ext_tools_pmu_t; + +//---------------------------------------------------------------------------// +// Opaque pointer to HSA counter block // +//---------------------------------------------------------------------------// +// typedef void * hsa_ext_tools_counter_block_t; + +//---------------------------------------------------------------------------// +// Opaque pointer to HSA counter // +//---------------------------------------------------------------------------// +// typedef void * hsa_ext_tools_counter_t; + +#ifdef __cplusplus +} +#endif // __cplusplus +#endif // _ROCR_PROFILER_H_ diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/var_data.cpp b/runtime/hsa-ext-aql-profile/src/perfcounter/var_data.cpp new file mode 100644 index 0000000000..c7ec19e609 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/var_data.cpp @@ -0,0 +1,48 @@ +#include +#include "var_data.h" + +namespace pm4_profile { +VarData::VarData() { + size_ = 0; + p_data_ = NULL; +} + +VarData::~VarData() {} + +void VarData::clear() { + size_ = 0; + if (p_data_) { + free(p_data_); + p_data_ = NULL; + } +} + +bool VarData::set(uint32_t size, const void* p_data) { + if (!p_data || (size == 0)) { + return false; + } + + clear(); + + if (NULL == (p_data_ = malloc(size))) { + return false; + } + + memcpy(p_data_, p_data, size); + size_ = size; + + return true; +} + +uint32_t VarData::get(uint32_t size, void* p_data) { + if (!p_data || !size || !p_data_ || !size_) { + return 0; + } + + uint32_t ret_size = size < size_ ? size : size_; + + memcpy(p_data, p_data_, ret_size); + + return ret_size; +} +} // pm4_profile diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/var_data.h b/runtime/hsa-ext-aql-profile/src/perfcounter/var_data.h new file mode 100644 index 0000000000..e94a6b8b90 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/var_data.h @@ -0,0 +1,65 @@ +#ifndef _VAR_DATA_H_ +#define _VAR_DATA_H_ + +/*! + \note This file contains declaration of IVarData class. + */ + +#include "hsa_perf.h" + +#include +#include +#include + +namespace pm4_profile { +/*! + This abstract class implements variable-size storage for information and + parameter + sets. + */ +class VarData { + public: + /*! Constructor for IVarData */ + VarData(); + + /*! Destructor for IVarData */ + ~VarData(); + + /*! Deallocate the memory and clean up */ + void clear(); + + /*! + Set the data to be stored. + @param[in] size Size of data to be stored. + @param[in] p_data Pointer to data to be stored. + \return true or false + */ + bool set(uint32_t size, const void* p_data); + + /*! + Query the data that was stored. + @param[in] size Size (in bytes) of the memory pointed to by p_data. + This determines maximum size of the returned data. + @param[in,out] p_data Pointer to the result buffer. + \return Size (in bytes) of the returned result which is coppied into + the buffer pointed to by p_data. + */ + uint32_t get(uint32_t size, void* p_data); + + /*! + Get size of the current data stored + \return Size (in bytes) of the data stored. + */ + uint32_t getSize() { return size_; } + + private: + /*! Size of data being stored */ + uint32_t size_; + + /*! Pointer to the stored data */ + void* p_data_; +}; + +typedef std::map VarDataMap; +} +#endif diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/vi_blockinfo.cpp b/runtime/hsa-ext-aql-profile/src/perfcounter/vi_blockinfo.cpp new file mode 100644 index 0000000000..bc21dd1b7a --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/vi_blockinfo.cpp @@ -0,0 +1,622 @@ +#include "vi_blockinfo.h" +#include "gfxip/gfx8/si_ci_vi_merged_offset.h" + +namespace pm4_profile { +/** + * Table containing CounterGroups which represent VI hardware blocks + * as defined by \ref GpuBlockInfo structure + */ +GpuBlockInfo ViPmuHwBlocks[] = { + // Counter block CB + {"VI_CB0", kHsaViCounterBlockIdCb0, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_CB, + CntlMethodBySeAndInstance, 395, VI_COUNTER_NUM_PER_CB, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_CB1", kHsaViCounterBlockIdCb1, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_CB, + CntlMethodBySeAndInstance, 395, VI_COUNTER_NUM_PER_CB, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_CB2", kHsaViCounterBlockIdCb2, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_CB, + CntlMethodBySeAndInstance, 395, VI_COUNTER_NUM_PER_CB, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_CB3", kHsaViCounterBlockIdCb3, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_CB, + CntlMethodBySeAndInstance, 395, VI_COUNTER_NUM_PER_CB, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block CPF + {"VI_CPF", kHsaViCounterBlockIdCpf, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 19, + VI_COUNTER_NUM_PER_CPF, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block DB + {"VI_DB0", kHsaViCounterBlockIdDb0, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_DB, + CntlMethodBySeAndInstance, 256, VI_COUNTER_NUM_PER_DB, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_DB1", kHsaViCounterBlockIdDb1, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_DB, + CntlMethodBySeAndInstance, 256, VI_COUNTER_NUM_PER_DB, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_DB2", kHsaViCounterBlockIdDb2, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_DB, + CntlMethodBySeAndInstance, 256, VI_COUNTER_NUM_PER_DB, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_DB3", kHsaViCounterBlockIdDb3, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_DB, + CntlMethodBySeAndInstance, 256, VI_COUNTER_NUM_PER_DB, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block GRBM + {"VI_GRBM", kHsaViCounterBlockIdGrbm, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 33, + VI_COUNTER_NUM_PER_GRBM, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block GRBMSE + {"VI_GRBMSE", kHsaViCounterBlockIdGrbmSe, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 14, + VI_COUNTER_NUM_PER_GRBMSE, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block PA_SU + {"VI_PA_SU", kHsaViCounterBlockIdPaSu, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 152, + VI_COUNTER_NUM_PER_PA_SU, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block PA_SC + {"VI_PA_SC", kHsaViCounterBlockIdPaSc, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 396, + VI_COUNTER_NUM_PER_PA_SC, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block SPI + {"VI_SPI", kHsaViCounterBlockIdSpi, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 196, + VI_COUNTER_NUM_PER_SPI, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block SQ + {"VI_SQ", kHsaViCounterBlockIdSq, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + VI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_SQ_ES", kHsaViCounterBlockIdSqEs, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + VI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_SQ_GS", kHsaViCounterBlockIdSqGs, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + VI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_SQ_VS", kHsaViCounterBlockIdSqVs, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + VI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_SQ_PS", kHsaViCounterBlockIdSqPs, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + VI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_SQ_LS", kHsaViCounterBlockIdSqLs, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + VI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_SQ_HS", kHsaViCounterBlockIdSqHs, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + VI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_SQ_CS", kHsaViCounterBlockIdSqCs, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 298, + VI_COUNTER_NUM_PER_SQ, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block SX + {"VI_SX", kHsaViCounterBlockIdSx, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 33, + VI_COUNTER_NUM_PER_SX, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block TA + {"VI_TA0", kHsaViCounterBlockIdTa0, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA1", kHsaViCounterBlockIdTa1, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA2", kHsaViCounterBlockIdTa2, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA3", kHsaViCounterBlockIdTa3, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA4", kHsaViCounterBlockIdTa4, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA5", kHsaViCounterBlockIdTa5, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA6", kHsaViCounterBlockIdTa6, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA7", kHsaViCounterBlockIdTa7, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA8", kHsaViCounterBlockIdTa8, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA9", kHsaViCounterBlockIdTa9, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA10", kHsaViCounterBlockIdTa10, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA11", kHsaViCounterBlockIdTa11, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA12", kHsaViCounterBlockIdTa12, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA13", kHsaViCounterBlockIdTa13, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA14", kHsaViCounterBlockIdTa14, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TA15", kHsaViCounterBlockIdTa15, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TA, + CntlMethodBySeAndInstance, 118, VI_COUNTER_NUM_PER_TA, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block TCA + {"VI_TCA0", kHsaViCounterBlockIdTca0, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCA, + CntlMethodByInstance, 34, VI_COUNTER_NUM_PER_TCA, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCA1", kHsaViCounterBlockIdTca1, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCA, + CntlMethodByInstance, 34, VI_COUNTER_NUM_PER_TCA, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block TCC + {"VI_TCC0", kHsaViCounterBlockIdTcc0, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC1", kHsaViCounterBlockIdTcc1, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC2", kHsaViCounterBlockIdTcc2, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC3", kHsaViCounterBlockIdTcc3, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC4", kHsaViCounterBlockIdTcc4, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC5", kHsaViCounterBlockIdTcc5, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC6", kHsaViCounterBlockIdTcc6, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC7", kHsaViCounterBlockIdTcc7, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC8", kHsaViCounterBlockIdTcc8, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC9", kHsaViCounterBlockIdTcc9, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC10", kHsaViCounterBlockIdTcc10, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC11", kHsaViCounterBlockIdTcc11, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC12", kHsaViCounterBlockIdTcc12, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC13", kHsaViCounterBlockIdTcc13, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC14", kHsaViCounterBlockIdTcc14, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCC15", kHsaViCounterBlockIdTcc15, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCC, + CntlMethodByInstance, 191, VI_COUNTER_NUM_PER_TCC, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block TD + {"VI_TD0", kHsaViCounterBlockIdTd0, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD1", kHsaViCounterBlockIdTd1, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD2", kHsaViCounterBlockIdTd2, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD3", kHsaViCounterBlockIdTd3, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD4", kHsaViCounterBlockIdTd4, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD5", kHsaViCounterBlockIdTd5, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD6", kHsaViCounterBlockIdTd6, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD7", kHsaViCounterBlockIdTd7, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD8", kHsaViCounterBlockIdTd8, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD9", kHsaViCounterBlockIdTd9, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD10", kHsaViCounterBlockIdTd10, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD11", kHsaViCounterBlockIdTd11, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD12", kHsaViCounterBlockIdTd12, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD13", kHsaViCounterBlockIdTd13, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD14", kHsaViCounterBlockIdTd14, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TD15", kHsaViCounterBlockIdTd15, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TD, + CntlMethodBySeAndInstance, 54, VI_COUNTER_NUM_PER_TD, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block TCP + {"VI_TCP0", kHsaViCounterBlockIdTcp0, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP1", kHsaViCounterBlockIdTcp1, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP2", kHsaViCounterBlockIdTcp2, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP3", kHsaViCounterBlockIdTcp3, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP4", kHsaViCounterBlockIdTcp4, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP5", kHsaViCounterBlockIdTcp5, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP6", kHsaViCounterBlockIdTcp6, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP7", kHsaViCounterBlockIdTcp7, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP8", kHsaViCounterBlockIdTcp8, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP9", kHsaViCounterBlockIdTcp9, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP10", kHsaViCounterBlockIdTcp10, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP11", kHsaViCounterBlockIdTcp11, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP12", kHsaViCounterBlockIdTcp12, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP13", kHsaViCounterBlockIdTcp13, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP14", kHsaViCounterBlockIdTcp14, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + {"VI_TCP15", kHsaViCounterBlockIdTcp15, VI_MAX_NUM_SHADER_ENGINES, 2, VI_NUM_TCP, + CntlMethodBySeAndInstance, 182, VI_COUNTER_NUM_PER_TCP, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block GDS + {"VI_GDS", kHsaViCounterBlockIdGds, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 120, + VI_COUNTER_NUM_PER_GDS, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block VGT + {"VI_VGT", kHsaViCounterBlockIdVgt, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 145, + VI_COUNTER_NUM_PER_VGT, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block IA + {"VI_IA", kHsaViCounterBlockIdIa, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodBySe, 23, + VI_COUNTER_NUM_PER_IA, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block MC + {"VI_MC", kHsaViCounterBlockIdMc, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 22, + VI_COUNTER_NUM_PER_MC, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block SRBM + {"VI_SRBM", kHsaViCounterBlockIdSrbm, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 19, + VI_COUNTER_NUM_PER_SRBM, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block WD + {"VI_WD", kHsaViCounterBlockIdWd, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 36, + VI_COUNTER_NUM_PER_WD, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block CPG + {"VI_CPG", kHsaViCounterBlockIdCpg, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 48, + VI_COUNTER_NUM_PER_CPG, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block CPC + {"VI_CPC", kHsaViCounterBlockIdCpc, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 24, + VI_COUNTER_NUM_PER_CPC, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block IOMMUV2 + {"VI_IOMMUV2", kHsaViCounterBlockIdIommuV2, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 25, + 8, 0, 0, true, 0, 0, false, 0, 0}, + + // Counter block KernelDriver + {"VI_KD", kHsaViCounterBlockIdKernelDriver, VI_MAX_NUM_SHADER_ENGINES, 2, 1, CntlMethodNone, 0, + 0, 0, 0, true, 0, 0, false, 0, 0}, + + // Name of the last line should be empty to indicate end of all counter groups + {"", kHsaViCounterBlockIdBlocksLast, 0, 0, 0, CntlMethodNone, 0, 0, 0, 0, false, 0, 0, false, 0, + 0}}; + +/* + * The following tables contain register addresses of the SQ counter registers + */ + +/* + * SQ + */ +GpuCounterRegInfo ViSqCounterRegAddr[] = { + {mmSQ_PERFCOUNTER0_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, mmSQ_PERFCOUNTER0_LO__CI__VI, + mmSQ_PERFCOUNTER0_HI__CI__VI}, + {mmSQ_PERFCOUNTER1_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, mmSQ_PERFCOUNTER1_LO__CI__VI, + mmSQ_PERFCOUNTER1_HI__CI__VI}, + {mmSQ_PERFCOUNTER2_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, mmSQ_PERFCOUNTER2_LO__CI__VI, + mmSQ_PERFCOUNTER2_HI__CI__VI}, + {mmSQ_PERFCOUNTER3_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, mmSQ_PERFCOUNTER3_LO__CI__VI, + mmSQ_PERFCOUNTER3_HI__CI__VI}, + {mmSQ_PERFCOUNTER4_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, mmSQ_PERFCOUNTER4_LO__CI__VI, + mmSQ_PERFCOUNTER4_HI__CI__VI}, + {mmSQ_PERFCOUNTER5_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, mmSQ_PERFCOUNTER5_LO__CI__VI, + mmSQ_PERFCOUNTER5_HI__CI__VI}, + {mmSQ_PERFCOUNTER6_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, mmSQ_PERFCOUNTER6_LO__CI__VI, + mmSQ_PERFCOUNTER6_HI__CI__VI}, + {mmSQ_PERFCOUNTER7_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, mmSQ_PERFCOUNTER7_LO__CI__VI, + mmSQ_PERFCOUNTER7_HI__CI__VI}, + {mmSQ_PERFCOUNTER8_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, mmSQ_PERFCOUNTER8_LO__CI__VI, + mmSQ_PERFCOUNTER8_HI__CI__VI}, + {mmSQ_PERFCOUNTER9_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, mmSQ_PERFCOUNTER9_LO__CI__VI, + mmSQ_PERFCOUNTER9_HI__CI__VI}, + {mmSQ_PERFCOUNTER10_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, + mmSQ_PERFCOUNTER10_LO__CI__VI, mmSQ_PERFCOUNTER10_HI__CI__VI}, + {mmSQ_PERFCOUNTER11_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, + mmSQ_PERFCOUNTER11_LO__CI__VI, mmSQ_PERFCOUNTER11_HI__CI__VI}, + {mmSQ_PERFCOUNTER12_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, + mmSQ_PERFCOUNTER12_LO__CI__VI, mmSQ_PERFCOUNTER12_HI__CI__VI}, + {mmSQ_PERFCOUNTER13_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, + mmSQ_PERFCOUNTER13_LO__CI__VI, mmSQ_PERFCOUNTER13_HI__CI__VI}, + {mmSQ_PERFCOUNTER14_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, + mmSQ_PERFCOUNTER14_LO__CI__VI, mmSQ_PERFCOUNTER14_HI__CI__VI}, + {mmSQ_PERFCOUNTER15_SELECT__CI__VI, mmSQ_PERFCOUNTER_CTRL__CI__VI, + mmSQ_PERFCOUNTER15_LO__CI__VI, mmSQ_PERFCOUNTER15_HI__CI__VI}}; + +/* + * DRMDMA + */ +GpuCounterRegInfo ViDrmdmaCounterRegAddr[] = { + {mmSDMA0_PERFMON_CNTL__VI, 0, mmSDMA0_PERFCOUNTER0_RESULT__VI, 0}, + {mmSDMA0_PERFMON_CNTL__VI, 0, mmSDMA0_PERFCOUNTER1_RESULT__VI, 0}, + {mmSDMA1_PERFMON_CNTL__VI, 0, mmSDMA1_PERFCOUNTER0_RESULT__VI, 0}, + {mmSDMA1_PERFMON_CNTL__VI, 0, mmSDMA1_PERFCOUNTER1_RESULT__VI, 0}, +}; + +/* + * IH + */ +GpuCounterRegInfo ViIhCounterRegAddr[] = { + {mmIH_PERFMON_CNTL__VI, 0, mmIH_PERFCOUNTER0_RESULT__VI, 0}, + {mmIH_PERFMON_CNTL__VI, 0, mmIH_PERFCOUNTER1_RESULT__VI, 0}}; + +/* + * CPF + */ +GpuCounterRegInfo ViCpfCounterRegAddr[] = { + {mmCPF_PERFCOUNTER0_SELECT__CI__VI, 0, mmCPF_PERFCOUNTER0_LO__CI__VI, + mmCPF_PERFCOUNTER0_HI__CI__VI}, + {mmCPF_PERFCOUNTER1_SELECT__CI__VI, 0, mmCPF_PERFCOUNTER1_LO__CI__VI, + mmCPF_PERFCOUNTER1_HI__CI__VI}}; + +/* + * DRM + */ +GpuCounterRegInfo ViDrmCounterRegAddr[] = { + {mmDRM_PERFCOUNTER1_SELECT, 0, mmDRM_PERFCOUNTER1_LO, mmDRM_PERFCOUNTER1_HI}, + {mmDRM_PERFCOUNTER2_SELECT, 0, mmDRM_PERFCOUNTER2_LO, mmDRM_PERFCOUNTER2_HI}}; + +/* + * GRBM + */ +GpuCounterRegInfo ViGrbmCounterRegAddr[] = { + {mmGRBM_PERFCOUNTER0_SELECT__CI__VI, 0, mmGRBM_PERFCOUNTER0_LO__CI__VI, + mmGRBM_PERFCOUNTER0_HI__CI__VI}, + {mmGRBM_PERFCOUNTER1_SELECT__CI__VI, 0, mmGRBM_PERFCOUNTER1_LO__CI__VI, + mmGRBM_PERFCOUNTER1_HI__CI__VI}}; + +/* + * GRBM_SE + */ +GpuCounterRegInfo ViGrbmSeCounterRegAddr[] = { + {mmGRBM_SE0_PERFCOUNTER_SELECT__CI__VI, 0, mmGRBM_SE0_PERFCOUNTER_LO__CI__VI, + mmGRBM_SE0_PERFCOUNTER_HI__CI__VI}, + {mmGRBM_SE1_PERFCOUNTER_SELECT__CI__VI, 0, mmGRBM_SE1_PERFCOUNTER_LO__CI__VI, + mmGRBM_SE1_PERFCOUNTER_HI__CI__VI}, + {mmGRBM_SE2_PERFCOUNTER_SELECT__CI__VI, 0, mmGRBM_SE2_PERFCOUNTER_LO__CI__VI, + mmGRBM_SE2_PERFCOUNTER_HI__CI__VI}, + {mmGRBM_SE3_PERFCOUNTER_SELECT__CI__VI, 0, mmGRBM_SE3_PERFCOUNTER_LO__CI__VI, + mmGRBM_SE3_PERFCOUNTER_HI__CI__VI}}; + +/* + * PA_SU + */ +GpuCounterRegInfo ViPaSuCounterRegAddr[] = { + {mmPA_SU_PERFCOUNTER0_SELECT__CI__VI, 0, mmPA_SU_PERFCOUNTER0_LO__CI__VI, + mmPA_SU_PERFCOUNTER0_HI__CI__VI}, + {mmPA_SU_PERFCOUNTER1_SELECT__CI__VI, 0, mmPA_SU_PERFCOUNTER1_LO__CI__VI, + mmPA_SU_PERFCOUNTER1_HI__CI__VI}, + {mmPA_SU_PERFCOUNTER2_SELECT__CI__VI, 0, mmPA_SU_PERFCOUNTER2_LO__CI__VI, + mmPA_SU_PERFCOUNTER2_HI__CI__VI}, + {mmPA_SU_PERFCOUNTER3_SELECT__CI__VI, 0, mmPA_SU_PERFCOUNTER3_LO__CI__VI, + mmPA_SU_PERFCOUNTER3_HI__CI__VI}}; + +/* + * PA_SC + */ +GpuCounterRegInfo ViPaScCounterRegAddr[] = { + {mmPA_SC_PERFCOUNTER0_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER0_LO__CI__VI, + mmPA_SC_PERFCOUNTER0_HI__CI__VI}, + {mmPA_SC_PERFCOUNTER1_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER1_LO__CI__VI, + mmPA_SC_PERFCOUNTER1_HI__CI__VI}, + {mmPA_SC_PERFCOUNTER2_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER2_LO__CI__VI, + mmPA_SC_PERFCOUNTER2_HI__CI__VI}, + {mmPA_SC_PERFCOUNTER3_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER3_LO__CI__VI, + mmPA_SC_PERFCOUNTER3_HI__CI__VI}}; + +/* + * SPI + */ +GpuCounterRegInfo ViSpiCounterRegAddr[] = { + {mmSPI_PERFCOUNTER0_SELECT__CI__VI, 0, mmSPI_PERFCOUNTER0_LO__CI__VI, + mmSPI_PERFCOUNTER0_HI__CI__VI}, + {mmSPI_PERFCOUNTER1_SELECT__CI__VI, 0, mmSPI_PERFCOUNTER1_LO__CI__VI, + mmSPI_PERFCOUNTER1_HI__CI__VI}, + {mmSPI_PERFCOUNTER2_SELECT__CI__VI, 0, mmSPI_PERFCOUNTER2_LO__CI__VI, + mmSPI_PERFCOUNTER2_HI__CI__VI}, + {mmSPI_PERFCOUNTER3_SELECT__CI__VI, 0, mmSPI_PERFCOUNTER3_LO__CI__VI, + mmSPI_PERFCOUNTER3_HI__CI__VI}, + {mmSPI_PERFCOUNTER4_SELECT__CI__VI, 0, mmSPI_PERFCOUNTER4_LO__CI__VI, + mmSPI_PERFCOUNTER4_HI__CI__VI}, + {mmSPI_PERFCOUNTER5_SELECT__CI__VI, 0, mmSPI_PERFCOUNTER5_LO__CI__VI, + mmSPI_PERFCOUNTER5_HI__CI__VI}}; + +/* + * TCA + */ +GpuCounterRegInfo ViTcaCounterRegAddr[] = { + {mmTCA_PERFCOUNTER0_SELECT__CI__VI, 0, mmTCA_PERFCOUNTER0_LO__CI__VI, + mmTCA_PERFCOUNTER0_HI__CI__VI}, + {mmTCA_PERFCOUNTER1_SELECT__CI__VI, 0, mmTCA_PERFCOUNTER1_LO__CI__VI, + mmTCA_PERFCOUNTER1_HI__CI__VI}, + {mmTCA_PERFCOUNTER2_SELECT__CI__VI, 0, mmTCA_PERFCOUNTER2_LO__CI__VI, + mmTCA_PERFCOUNTER2_HI__CI__VI}, + {mmTCA_PERFCOUNTER3_SELECT__CI__VI, 0, mmTCA_PERFCOUNTER3_LO__CI__VI, + mmTCA_PERFCOUNTER3_HI__CI__VI}}; + +/* + * TCC + */ +GpuCounterRegInfo ViTccCounterRegAddr[] = { + {mmTCC_PERFCOUNTER0_SELECT__CI__VI, 0, mmTCC_PERFCOUNTER0_LO__CI__VI, + mmTCC_PERFCOUNTER0_HI__CI__VI}, + {mmTCC_PERFCOUNTER1_SELECT__CI__VI, 0, mmTCC_PERFCOUNTER1_LO__CI__VI, + mmTCC_PERFCOUNTER1_HI__CI__VI}, + {mmTCC_PERFCOUNTER2_SELECT__CI__VI, 0, mmTCC_PERFCOUNTER2_LO__CI__VI, + mmTCC_PERFCOUNTER2_HI__CI__VI}, + {mmTCC_PERFCOUNTER3_SELECT__CI__VI, 0, mmTCC_PERFCOUNTER3_LO__CI__VI, + mmTCC_PERFCOUNTER3_HI__CI__VI}}; + +/* + * TCP + */ +GpuCounterRegInfo ViTcpCounterRegAddr[] = { + {mmTCP_PERFCOUNTER0_SELECT__CI__VI, 0, mmTCP_PERFCOUNTER0_LO__CI__VI, + mmTCP_PERFCOUNTER0_HI__CI__VI}, + {mmTCP_PERFCOUNTER1_SELECT__CI__VI, 0, mmTCP_PERFCOUNTER1_LO__CI__VI, + mmTCP_PERFCOUNTER1_HI__CI__VI}, + {mmTCP_PERFCOUNTER2_SELECT__CI__VI, 0, mmTCP_PERFCOUNTER2_LO__CI__VI, + mmTCP_PERFCOUNTER2_HI__CI__VI}, + {mmTCP_PERFCOUNTER3_SELECT__CI__VI, 0, mmTCP_PERFCOUNTER3_LO__CI__VI, + mmTCP_PERFCOUNTER3_HI__CI__VI}}; + +/* + * CB + */ +GpuCounterRegInfo ViCbCounterRegAddr[] = { + {mmCB_PERFCOUNTER0_SELECT__CI__VI, 0, mmCB_PERFCOUNTER0_LO__CI__VI, + mmCB_PERFCOUNTER0_HI__CI__VI}, + {mmCB_PERFCOUNTER1_SELECT__CI__VI, 0, mmCB_PERFCOUNTER1_LO__CI__VI, + mmCB_PERFCOUNTER1_HI__CI__VI}, + {mmCB_PERFCOUNTER2_SELECT__CI__VI, 0, mmCB_PERFCOUNTER2_LO__CI__VI, + mmCB_PERFCOUNTER2_HI__CI__VI}, + {mmCB_PERFCOUNTER3_SELECT__CI__VI, 0, mmCB_PERFCOUNTER3_LO__CI__VI, + mmCB_PERFCOUNTER3_HI__CI__VI}}; + +/* + * DB + */ +GpuCounterRegInfo ViDbCounterRegAddr[] = { + {mmDB_PERFCOUNTER0_SELECT__CI__VI, 0, mmDB_PERFCOUNTER0_LO__CI__VI, + mmDB_PERFCOUNTER0_HI__CI__VI}, + {mmDB_PERFCOUNTER1_SELECT__CI__VI, 0, mmDB_PERFCOUNTER1_LO__CI__VI, + mmDB_PERFCOUNTER1_HI__CI__VI}, + {mmDB_PERFCOUNTER2_SELECT__CI__VI, 0, mmDB_PERFCOUNTER2_LO__CI__VI, + mmDB_PERFCOUNTER2_HI__CI__VI}, + {mmDB_PERFCOUNTER3_SELECT__CI__VI, 0, mmDB_PERFCOUNTER3_LO__CI__VI, + mmDB_PERFCOUNTER3_HI__CI__VI}}; + +/* + * RLC + */ +GpuCounterRegInfo ViRlcCounterRegAddr[] = { + {mmRLC_PERFCOUNTER0_SELECT__CI__VI, 0, mmRLC_PERFCOUNTER0_LO__CI__VI, + mmRLC_PERFCOUNTER0_HI__CI__VI}, + {mmRLC_PERFCOUNTER1_SELECT__CI__VI, 0, mmRLC_PERFCOUNTER1_LO__CI__VI, + mmRLC_PERFCOUNTER1_HI__CI__VI}}; + +/* + * SC + */ +GpuCounterRegInfo ViScCounterRegAddr[] = { + {mmPA_SC_PERFCOUNTER0_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER0_LO__CI__VI, + mmPA_SC_PERFCOUNTER0_HI__CI__VI}, + {mmPA_SC_PERFCOUNTER1_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER1_LO__CI__VI, + mmPA_SC_PERFCOUNTER1_HI__CI__VI}, + {mmPA_SC_PERFCOUNTER2_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER2_LO__CI__VI, + mmPA_SC_PERFCOUNTER2_HI__CI__VI}, + {mmPA_SC_PERFCOUNTER3_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER3_LO__CI__VI, + mmPA_SC_PERFCOUNTER3_HI__CI__VI}, + {mmPA_SC_PERFCOUNTER4_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER4_LO__CI__VI, + mmPA_SC_PERFCOUNTER4_HI__CI__VI}, + {mmPA_SC_PERFCOUNTER5_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER5_LO__CI__VI, + mmPA_SC_PERFCOUNTER5_HI__CI__VI}, + {mmPA_SC_PERFCOUNTER6_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER6_LO__CI__VI, + mmPA_SC_PERFCOUNTER6_HI__CI__VI}, + {mmPA_SC_PERFCOUNTER7_SELECT__CI__VI, 0, mmPA_SC_PERFCOUNTER7_LO__CI__VI, + mmPA_SC_PERFCOUNTER7_HI__CI__VI}}; + +/* + * SX + */ +GpuCounterRegInfo ViSxCounterRegAddr[] = { + {mmSX_PERFCOUNTER0_SELECT__CI__VI, 0, mmSX_PERFCOUNTER0_LO__CI__VI, + mmSX_PERFCOUNTER0_HI__CI__VI}, + {mmSX_PERFCOUNTER1_SELECT__CI__VI, 0, mmSX_PERFCOUNTER1_LO__CI__VI, + mmSX_PERFCOUNTER1_HI__CI__VI}, + {mmSX_PERFCOUNTER2_SELECT__CI__VI, 0, mmSX_PERFCOUNTER2_LO__CI__VI, + mmSX_PERFCOUNTER2_HI__CI__VI}, + {mmSX_PERFCOUNTER3_SELECT__CI__VI, 0, mmSX_PERFCOUNTER3_LO__CI__VI, + mmSX_PERFCOUNTER3_HI__CI__VI}}; + +/* + * TA + */ +GpuCounterRegInfo ViTaCounterRegAddr[] = { + {mmTA_PERFCOUNTER0_SELECT__CI__VI, 0, mmTA_PERFCOUNTER0_LO__CI__VI, + mmTA_PERFCOUNTER0_HI__CI__VI}, + {mmTA_PERFCOUNTER1_SELECT__CI__VI, 0, mmTA_PERFCOUNTER1_LO__CI__VI, + mmTA_PERFCOUNTER1_HI__CI__VI}}; + +/* + * TD + */ +GpuCounterRegInfo ViTdCounterRegAddr[] = { + {mmTD_PERFCOUNTER0_SELECT__CI__VI, 0, mmTD_PERFCOUNTER0_LO__CI__VI, + mmTD_PERFCOUNTER0_HI__CI__VI}, + {mmTD_PERFCOUNTER1_SELECT__CI__VI, 0, mmTD_PERFCOUNTER1_LO__CI__VI, + mmTD_PERFCOUNTER1_HI__CI__VI}}; + +/* + * GDS + */ +GpuCounterRegInfo ViGdsCounterRegAddr[] = { + {mmGDS_PERFCOUNTER0_SELECT__CI__VI, 0, mmGDS_PERFCOUNTER0_LO__CI__VI, + mmGDS_PERFCOUNTER0_HI__CI__VI}, + {mmGDS_PERFCOUNTER1_SELECT__CI__VI, 0, mmGDS_PERFCOUNTER1_LO__CI__VI, + mmGDS_PERFCOUNTER1_HI__CI__VI}, + {mmGDS_PERFCOUNTER2_SELECT__CI__VI, 0, mmGDS_PERFCOUNTER2_LO__CI__VI, + mmGDS_PERFCOUNTER2_HI__CI__VI}, + {mmGDS_PERFCOUNTER3_SELECT__CI__VI, 0, mmGDS_PERFCOUNTER3_LO__CI__VI, + mmGDS_PERFCOUNTER3_HI__CI__VI}}; + +/* + * VGT + */ +GpuCounterRegInfo ViVgtCounterRegAddr[] = { + {mmVGT_PERFCOUNTER0_SELECT__CI__VI, 0, mmVGT_PERFCOUNTER0_LO__CI__VI, + mmVGT_PERFCOUNTER0_HI__CI__VI}, + {mmVGT_PERFCOUNTER1_SELECT__CI__VI, 0, mmVGT_PERFCOUNTER1_LO__CI__VI, + mmVGT_PERFCOUNTER1_HI__CI__VI}, + {mmVGT_PERFCOUNTER2_SELECT__CI__VI, 0, mmVGT_PERFCOUNTER2_LO__CI__VI, + mmVGT_PERFCOUNTER2_HI__CI__VI}, + {mmVGT_PERFCOUNTER3_SELECT__CI__VI, 0, mmVGT_PERFCOUNTER3_LO__CI__VI, + mmVGT_PERFCOUNTER3_HI__CI__VI}}; + +/* + * IA + */ +GpuCounterRegInfo ViIaCounterRegAddr[] = { + {mmIA_PERFCOUNTER0_SELECT__CI__VI, 0, mmIA_PERFCOUNTER0_LO__CI__VI, + mmIA_PERFCOUNTER0_HI__CI__VI}, + {mmIA_PERFCOUNTER1_SELECT__CI__VI, 0, mmIA_PERFCOUNTER1_LO__CI__VI, + mmIA_PERFCOUNTER1_HI__CI__VI}, + {mmIA_PERFCOUNTER2_SELECT__CI__VI, 0, mmIA_PERFCOUNTER2_LO__CI__VI, + mmIA_PERFCOUNTER2_HI__CI__VI}, + {mmIA_PERFCOUNTER3_SELECT__CI__VI, 0, mmIA_PERFCOUNTER3_LO__CI__VI, + mmIA_PERFCOUNTER3_HI__CI__VI}}; + +/* + * MC + */ +GpuCounterRegInfo ViMcCounterRegAddr[] = { + {mmMC_SEQ_PERF_SEQ_CTL__SI__VI, 0, mmMC_SEQ_PERF_SEQ_CNT_A_I0__VI, + mmMC_SEQ_PERF_SEQ_CNT_A_I1__VI}, + {mmMC_SEQ_PERF_SEQ_CTL__SI__VI, 0, mmMC_SEQ_PERF_SEQ_CNT_B_I0__VI, + mmMC_SEQ_PERF_SEQ_CNT_B_I1__VI}, + {mmMC_SEQ_PERF_SEQ_CTL__SI__VI, 0, mmMC_SEQ_PERF_SEQ_CNT_C_I0__VI, + mmMC_SEQ_PERF_SEQ_CNT_C_I1__VI}, + {mmMC_SEQ_PERF_SEQ_CTL__SI__VI, 0, mmMC_SEQ_PERF_SEQ_CNT_D_I0__VI, + mmMC_SEQ_PERF_SEQ_CNT_D_I1__VI}}; + +/* + * SRBM + */ +GpuCounterRegInfo ViSrbmCounterRegAddr[] = { + {mmSRBM_PERFCOUNTER0_SELECT__VI, 0, mmSRBM_PERFCOUNTER0_LO__VI, mmSRBM_PERFCOUNTER0_HI__VI}, + {mmSRBM_PERFCOUNTER1_SELECT__VI, 0, mmSRBM_PERFCOUNTER1_LO__VI, mmSRBM_PERFCOUNTER1_HI__VI}}; + +/* + * WD + */ +GpuCounterRegInfo ViWdCounterRegAddr[] = { + {mmWD_PERFCOUNTER0_SELECT__CI__VI, 0, mmWD_PERFCOUNTER0_LO__CI__VI, + mmWD_PERFCOUNTER0_HI__CI__VI}, + {mmWD_PERFCOUNTER1_SELECT__CI__VI, 0, mmWD_PERFCOUNTER1_LO__CI__VI, + mmWD_PERFCOUNTER1_HI__CI__VI}, + {mmWD_PERFCOUNTER2_SELECT__CI__VI, 0, mmWD_PERFCOUNTER2_LO__CI__VI, + mmWD_PERFCOUNTER2_HI__CI__VI}, + {mmWD_PERFCOUNTER3_SELECT__CI__VI, 0, mmWD_PERFCOUNTER3_LO__CI__VI, + mmWD_PERFCOUNTER3_HI__CI__VI}}; + +/* + * CPG + */ +GpuCounterRegInfo ViCpgCounterRegAddr[] = { + {mmCPG_PERFCOUNTER0_SELECT__CI__VI, 0, mmCPG_PERFCOUNTER0_LO__CI__VI, + mmCPG_PERFCOUNTER0_HI__CI__VI}, + {mmCPG_PERFCOUNTER1_SELECT__CI__VI, 0, mmCPG_PERFCOUNTER1_LO__CI__VI, + mmCPG_PERFCOUNTER1_HI__CI__VI}}; + +/* + * CPC + */ +GpuCounterRegInfo ViCpcCounterRegAddr[] = { + {mmCPC_PERFCOUNTER0_SELECT__CI__VI, 0, mmCPC_PERFCOUNTER0_LO__CI__VI, + mmCPC_PERFCOUNTER0_HI__CI__VI}, + {mmCPC_PERFCOUNTER1_SELECT__CI__VI, 0, mmCPC_PERFCOUNTER1_LO__CI__VI, + mmCPC_PERFCOUNTER1_HI__CI__VI}}; + +GpuPrivCounterBlockId ViBlockIdSq = {{0xb5c396b6, 0x47e4d310, 0xc35cfc86, 0x08f53a04}}; +GpuPrivCounterBlockId ViBlockIdMc = {{0x13900b57, 0x4d984956, 0x5268d081, 0x9cf53719}}; +GpuPrivCounterBlockId ViBlockIdIommuV2 = {{0x80969879, 0x4be6b0f6, 0x636af697, 0x1d10f500}}; +GpuPrivCounterBlockId ViBlockIdKernelDriver = {{0xea9b5ae1, 0x44b36c3f, 0xf0da5489, 0x0aa96575}}; + +} // pm4_profile diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/vi_blockinfo.h b/runtime/hsa-ext-aql-profile/src/perfcounter/vi_blockinfo.h new file mode 100644 index 0000000000..2665836988 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/vi_blockinfo.h @@ -0,0 +1,230 @@ +#ifndef _VI_BLOCKINFO_H_ +#define _VI_BLOCKINFO_H_ + +#include +#include "rocr_profiler.h" +#include "gpu_enum.h" +#include "gpu_blockinfo.h" + +namespace pm4_profile { + +// MAX Number of block instances for VOLCANIC ISLANDS (From Fiji) +// Values are found here //gfxip/gfx8/main/src/meta/features/variant/Fiji/album.dj + +// @brief Number of block instances. + +// We index per SE and instance +#define VI_NUM_CB 4 // CB has 4 instances per SE +#define VI_NUM_DB 4 // DB has 4 instances per SE + +// For TA, TD and TCP, the values below are the same as the number of CUs +// per SH. We index per SE and instance +#define VI_NUM_TA 16 // TA has 11 instances +#define VI_NUM_TD 16 // TD has 11 instances +#define VI_NUM_TCP 16 // TCP has 11 instances + +// These values are per chip, we index directly per instance +#define VI_NUM_TCA 2 // TCA has 2 instances per chip +#define VI_NUM_TCC 16 // TCC has 16 instances per chip +#define VI_NUM_SDMA 2 // There are two SDMA blocks on VI, exposed as 2 + // instances here + +// Number of counter registers per block for volcanic islands +#define VI_COUNTER_NUM_PER_DRM 2 +#define VI_COUNTER_NUM_PER_DRMDMA 2 +#define VI_COUNTER_NUM_PER_IH 2 +#define VI_COUNTER_NUM_PER_SRBM 2 +#define VI_COUNTER_NUM_PER_CB 4 +#define VI_COUNTER_NUM_PER_CPF 2 +#define VI_COUNTER_NUM_PER_DB 4 +#define VI_COUNTER_NUM_PER_GRBM 2 +#define VI_COUNTER_NUM_PER_GRBMSE 4 +#define VI_COUNTER_NUM_PER_PA_SU 4 +#define VI_COUNTER_NUM_PER_RLC 2 +#define VI_COUNTER_NUM_PER_PA_SC 8 +#define VI_COUNTER_NUM_PER_SPI 6 // [Shucai: To do: double check the value] +#define VI_COUNTER_NUM_PER_SQ 16 +#define VI_COUNTER_NUM_PER_SX 4 +#define VI_COUNTER_NUM_PER_TA 2 +#define VI_COUNTER_NUM_PER_TCA 4 +#define VI_COUNTER_NUM_PER_TCC 4 +#define VI_COUNTER_NUM_PER_TD 2 // [Shucai: To do: double check the value] +#define VI_COUNTER_NUM_PER_TCP 4 +#define VI_COUNTER_NUM_PER_GDS 4 +#define VI_COUNTER_NUM_PER_VGT 4 +#define VI_COUNTER_NUM_PER_IA 4 +#define VI_COUNTER_NUM_PER_MC 4 +#define VI_COUNTER_NUM_PER_TCS 4 +#define VI_COUNTER_NUM_PER_WD 4 +#define VI_COUNTER_NUM_PER_CPG 2 +#define VI_COUNTER_NUM_PER_CPC 2 +#define VI_COUNTER_NUM_PER_VM 1 +#define VI_COUNTER_NUM_PER_VM_MD 1 +#define VI_COUNTER_NUM_PER_PIPESTATS 12 + +#define VI_MAX_NUM_SHADER_ENGINES 1 + +// Enumeration of VI hardware counter blocks +typedef enum HsaViCounterBlockId { + kHsaViCounterBlockIdCb0 = 0, + kHsaViCounterBlockIdCb1, + kHsaViCounterBlockIdCb2, + kHsaViCounterBlockIdCb3, + + kHsaViCounterBlockIdCpf, + + kHsaViCounterBlockIdDb0, + kHsaViCounterBlockIdDb1, + kHsaViCounterBlockIdDb2, + kHsaViCounterBlockIdDb3, + + kHsaViCounterBlockIdGrbm, + kHsaViCounterBlockIdGrbmSe, + kHsaViCounterBlockIdPaSu, + kHsaViCounterBlockIdPaSc, + kHsaViCounterBlockIdSpi, + + kHsaViCounterBlockIdSq, + kHsaViCounterBlockIdSqEs, + kHsaViCounterBlockIdSqGs, + kHsaViCounterBlockIdSqVs, + kHsaViCounterBlockIdSqPs, + kHsaViCounterBlockIdSqLs, + kHsaViCounterBlockIdSqHs, + kHsaViCounterBlockIdSqCs, + + kHsaViCounterBlockIdSx, + + kHsaViCounterBlockIdTa0, + kHsaViCounterBlockIdTa1, + kHsaViCounterBlockIdTa2, + kHsaViCounterBlockIdTa3, + kHsaViCounterBlockIdTa4, + kHsaViCounterBlockIdTa5, + kHsaViCounterBlockIdTa6, + kHsaViCounterBlockIdTa7, + kHsaViCounterBlockIdTa8, + kHsaViCounterBlockIdTa9, + kHsaViCounterBlockIdTa10, + kHsaViCounterBlockIdTa11, + kHsaViCounterBlockIdTa12, + kHsaViCounterBlockIdTa13, + kHsaViCounterBlockIdTa14, + kHsaViCounterBlockIdTa15, + + kHsaViCounterBlockIdTca0, + kHsaViCounterBlockIdTca1, + + kHsaViCounterBlockIdTcc0, + kHsaViCounterBlockIdTcc1, + kHsaViCounterBlockIdTcc2, + kHsaViCounterBlockIdTcc3, + kHsaViCounterBlockIdTcc4, + kHsaViCounterBlockIdTcc5, + kHsaViCounterBlockIdTcc6, + kHsaViCounterBlockIdTcc7, + kHsaViCounterBlockIdTcc8, + kHsaViCounterBlockIdTcc9, + kHsaViCounterBlockIdTcc10, + kHsaViCounterBlockIdTcc11, + kHsaViCounterBlockIdTcc12, + kHsaViCounterBlockIdTcc13, + kHsaViCounterBlockIdTcc14, + kHsaViCounterBlockIdTcc15, + + kHsaViCounterBlockIdTd0, + kHsaViCounterBlockIdTd1, + kHsaViCounterBlockIdTd2, + kHsaViCounterBlockIdTd3, + kHsaViCounterBlockIdTd4, + kHsaViCounterBlockIdTd5, + kHsaViCounterBlockIdTd6, + kHsaViCounterBlockIdTd7, + kHsaViCounterBlockIdTd8, + kHsaViCounterBlockIdTd9, + kHsaViCounterBlockIdTd10, + kHsaViCounterBlockIdTd11, + kHsaViCounterBlockIdTd12, + kHsaViCounterBlockIdTd13, + kHsaViCounterBlockIdTd14, + kHsaViCounterBlockIdTd15, + + kHsaViCounterBlockIdTcp0, + kHsaViCounterBlockIdTcp1, + kHsaViCounterBlockIdTcp2, + kHsaViCounterBlockIdTcp3, + kHsaViCounterBlockIdTcp4, + kHsaViCounterBlockIdTcp5, + kHsaViCounterBlockIdTcp6, + kHsaViCounterBlockIdTcp7, + kHsaViCounterBlockIdTcp8, + kHsaViCounterBlockIdTcp9, + kHsaViCounterBlockIdTcp10, + kHsaViCounterBlockIdTcp11, + kHsaViCounterBlockIdTcp12, + kHsaViCounterBlockIdTcp13, + kHsaViCounterBlockIdTcp14, + kHsaViCounterBlockIdTcp15, + + kHsaViCounterBlockIdGds, + kHsaViCounterBlockIdVgt, + kHsaViCounterBlockIdIa, + kHsaViCounterBlockIdMc, + kHsaViCounterBlockIdSrbm, + + kHsaViCounterBlockIdTcs, + kHsaViCounterBlockIdWd, + kHsaViCounterBlockIdCpg, + kHsaViCounterBlockIdCpc, + + // Counters retrieved by KFD + kHsaViCounterBlockIdIommuV2, + kHsaViCounterBlockIdKernelDriver, + + kHsaViCounterBlockIdCpPipeStats, + kHsaViCounterBlockIdHwInfo, + kHsaViCounterBlockIdBlocksFirst = kHsaViCounterBlockIdCb0, + kHsaViCounterBlockIdBlocksLast = kHsaViCounterBlockIdHwInfo +} HsaViCounterBlockId; + +extern GpuBlockInfo ViPmuHwBlocks[]; +extern GpuCounterRegInfo ViSqCounterRegAddr[]; +extern GpuCounterRegInfo ViCbCounterRegAddr[]; +extern GpuCounterRegInfo ViDrmdmaCounterRegAddr[]; +extern GpuCounterRegInfo ViIhCounterRegAddr[]; +extern GpuCounterRegInfo ViCpfCounterRegAddr[]; +extern GpuCounterRegInfo ViCpgCounterRegAddr[]; +extern GpuCounterRegInfo ViCpcCounterRegAddr[]; +extern GpuCounterRegInfo ViDrmCounterRegAddr[]; +extern GpuCounterRegInfo ViGrbmCounterRegAddr[]; +extern GpuCounterRegInfo ViGrbmSeCounterRegAddr[]; +extern GpuCounterRegInfo ViPaSuCounterRegAddr[]; +extern GpuCounterRegInfo ViPaScCounterRegAddr[]; +extern GpuCounterRegInfo ViSpiCounterRegAddr[]; +extern GpuCounterRegInfo ViTcaCounterRegAddr[]; +extern GpuCounterRegInfo ViTccCounterRegAddr[]; +extern GpuCounterRegInfo ViTcpCounterRegAddr[]; +extern GpuCounterRegInfo ViDbCounterRegAddr[]; +extern GpuCounterRegInfo ViRlcCounterRegAddr[]; +extern GpuCounterRegInfo ViScCounterRegAddr[]; +extern GpuCounterRegInfo ViSxCounterRegAddr[]; +extern GpuCounterRegInfo ViTaCounterRegAddr[]; +extern GpuCounterRegInfo ViTdCounterRegAddr[]; +extern GpuCounterRegInfo ViGdsCounterRegAddr[]; +extern GpuCounterRegInfo ViVgtCounterRegAddr[]; +extern GpuCounterRegInfo ViIaCounterRegAddr[]; +extern GpuCounterRegInfo ViMcCounterRegAddr[]; +extern GpuCounterRegInfo ViSrbmCounterRegAddr[]; + +// No Tcs Counter block on VI +// extern GpuCounterRegInfo ViTcsCounterRegAddr[]; +extern GpuCounterRegInfo ViWdCounterRegAddr[]; +extern GpuCounterRegInfo ViCpgCounterRegAddr[]; +extern GpuCounterRegInfo ViCpcCounterRegAddr[]; + +extern GpuPrivCounterBlockId ViBlockIdSq; +extern GpuPrivCounterBlockId ViBlockIdMc; +extern GpuPrivCounterBlockId ViBlockIdIommuV2; +extern GpuPrivCounterBlockId ViBlockIdKernelDriver; +} +#endif diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/vi_pmu.cpp b/runtime/hsa-ext-aql-profile/src/perfcounter/vi_pmu.cpp new file mode 100644 index 0000000000..b877ee31ff --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/vi_pmu.cpp @@ -0,0 +1,1569 @@ +#include +#include + +#include "os.h" + +#include "gfxip/gfx8/si_ci_vi_merged_typedef.h" +#include "gfxip/gfx8/si_ci_vi_merged_offset.h" +#include "gfxip/gfx8/si_ci_vi_merged_enum.h" +#include "gfxip/gfx8/si_pm4defs.h" +#include "cmdwriter.h" + +#include "vi_pmu.h" +#include "gpu_countergroup.h" +#include "vi_blockinfo.h" +#include "gpu_enum.h" + +using namespace std; +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"}}; + +ViPmu::ViPmu() { + // Initialize the number of shader engines + num_se_ = 4; + Init(); +} + +void ViPmu::Init() { + error_code_ = 0; + info_set_ = new InfoSet(); + parameter_set_ = new ParameterSet(); + + // Initialize pointer to stored counter block list to NULL + blk_list_ = NULL; + initCounterBlock(); + + // Initialize the value to use in resetting GRBM + regGRBM_GFX_INDEX grbm_gfx_index; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reset_grbm_ = grbm_gfx_index.u32All; + + // Update state of Perf Mgmt Unit + profiler_state_ = ROCR_PMU_STATE_IDLE; +} + +ViPmu::~ViPmu() { + // Remove all counter blocks + RemoveCounterBlocks(); + blk_map_.clear(); + delete parameter_set_; + delete info_set_; + + if (blk_list_) { + free(blk_list_); + blk_list_ = NULL; + } +} + +// Initializes the handle of buffer used to collect PMC data +// @param cmdBufSz Size in terms of bytes +bool ViPmu::setPmcDataBuff(uint8_t* pmcBuffer, uint32_t pmcBuffSz) { + // Update counter data buffer addr and size params + pmcDataSz_ = pmcBuffSz; + pmcData_ = (uint32_t*)pmcBuffer; + return true; +} + +// +// The logic is quite simple and is as follows +// +// Issue CsPartialFlush +// Issue Cmd to stop Perf Counters +// Issue Cmd to Disable & Reset Perf Counters +// +void ViPmu::ResetCounterBlocks(pm4_profile::DefaultCmdBuf* cmdBuff, + pm4_profile::CommandWriter* cmdWriter) { + // Waits until all outstanding commands have completed + // by issing CS Partial Flush command + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Program CP Perfmon Cntrl Rgstr to disable and reset counters + 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); +} + +bool ViPmu::begin(pm4_profile::DefaultCmdBuf* cmdBuff, pm4_profile::CommandWriter* cmdWriter, + bool reset_counter) { + if (profiler_state_ != ROCR_PMU_STATE_IDLE) { + error_code_ = kHsaPmuErrorCodeErrorState; + return false; + } + + // Reset Grbm to its default state - broadcast + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX__CI__VI, reset_grbm_); + + // Program CP Perfmon Cntrl Rgstr to disable and reset counters + 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); + + // Collect all the program counter blocks + uint32_t reg_val[MAX_REG_NUM], reg_addr[MAX_REG_NUM], reg_num; + + // Retrieve the list of blocks whose perf counters have been enabled + uint32_t blk_cnt = 0; + CounterBlock** blk_list = getAllCounterBlocks(blk_cnt); + + // Iterate through the list of blocks to generate Pm4 commands to + // program corresponding perf counters of each block + for (uint32_t blkIdx = 0; blkIdx < blk_cnt; blkIdx++) { + // Retrieve the list of perf counters and their count + uint32_t counter_num; + Counter** cntr_list; + cntr_list = blk_list[blkIdx]->getEnabledCounters(counter_num); + if (counter_num == 0) { + continue; + } + + // Retrieve the block Id of perf counters + void* p_data; + uint32_t block_id; + uint32_t data_size; + blk_list[blkIdx]->getInfo(GPU_BLK_INFO_ID, data_size, (void**)&p_data); + block_id = *(static_cast(p_data)); + + // Iterate through each enabled perf counter and building + // corresponding Pm4 commands to program the various control + // registers involved + for (uint32_t cntrIdx = 0; cntrIdx < counter_num; cntrIdx++) { + // Build the list of control registers to program which + // varies per perf counter block + reg_num = BuildCounterSelRegister(cntrIdx, reg_addr, reg_val, block_id, cntr_list[cntrIdx]); + + // Build the list of Pm4 commands that support control + // register programming + for (uint32_t regIdx = 0; regIdx < reg_num; regIdx++) { + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, reg_addr[regIdx], reg_val[regIdx]); + } + } + } + + // Reset Grbm to its default state - broadcast + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX__CI__VI, reset_grbm_); + + // Program Compute_Perfcount_Enable register to support perf counting + regCOMPUTE_PERFCOUNT_ENABLE__CI__VI cp_perfcount_enable; + cp_perfcount_enable.u32All = 0; + cp_perfcount_enable.bits.PERFCOUNT_ENABLE = 1; + cmdWriter->BuildWriteShRegPacket(cmdBuff, mmCOMPUTE_PERFCOUNT_ENABLE__CI__VI, + cp_perfcount_enable.u32All); + + // Start the counter list + cp_perfmon_cntl.u32All = 0; + cp_perfmon_cntl.bits.PERFMON_STATE = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmCP_PERFMON_CNTL__CI__VI, cp_perfmon_cntl.u32All); + + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + profiler_state_ = ROCR_PMU_STATE_START; + return true; +} + +bool ViPmu::end(pm4_profile::DefaultCmdBuf* cmdBuff, pm4_profile::CommandWriter* cmdWriter) { + if (profiler_state_ != ROCR_PMU_STATE_START) { + error_code_ = kHsaPmuErrorCodeErrorState; + return false; + } + + void* p_data; + regGRBM_GFX_INDEX grbm_gfx_index; + + // Issue CsPartialFlush command to wait for dispatch to complete + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Build PM4 packet for starting counters + regCP_PERFMON_CNTL cp_perfmon_cntl; + cp_perfmon_cntl.u32All = 0; + cp_perfmon_cntl.bits.PERFMON_STATE = 2; + cp_perfmon_cntl.bits.PERFMON_SAMPLE_ENABLE = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmCP_PERFMON_CNTL__CI__VI, cp_perfmon_cntl.u32All); + + // Collect all the program counter blocks + uint32_t i, j, k, reg_addr[MAX_REG_NUM], reg_val[MAX_REG_NUM], reg_num, data_size; + + uint32_t blk_cnt = 0; + CounterBlock** blk_list = getAllCounterBlocks(blk_cnt); + + uint32_t counter_num; + Counter** cntr_list; + uint32_t total_counter_num = 0; + for (i = 0; i < blk_cnt; i++) { + // Retrieve all enabled cntr_list in each counter block + cntr_list = blk_list[i]->getEnabledCounters(counter_num); + if (!blk_list[i]->getInfo(GPU_BLK_INFO_CONTROL_METHOD, data_size, &p_data)) { + return false; + } + + CntlMethod method; + method = static_cast(*(static_cast(p_data))); + + // Need to read counter values from each shader engine + if (method == CntlMethodBySe || method == CntlMethodBySeAndInstance) { + counter_num = counter_num * num_se_; + } + + total_counter_num += counter_num; + } + + size_t cntrSize = sizeof(int32_t) * 2 * total_counter_num; + if (cntrSize > pmcDataSz_) { + return false; + } + + // Reset Grbm to its default state - broadcast + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX__CI__VI, reset_grbm_); + + // Create PM4 packet to read counter values + total_counter_num = 0; + for (i = 0; i < blk_cnt; i++) { + // Retrieve all enabled cntr_list in each counter block + cntr_list = blk_list[i]->getEnabledCounters(counter_num); + if (counter_num > 0) { + uint32_t block_id; + uint32_t data_size; + if (!blk_list[i]->getInfo(GPU_BLK_INFO_ID, data_size, (void**)&p_data)) { + return false; + } + block_id = *(static_cast(p_data)); + + for (j = 0; j < counter_num; j++) { + // retrieve the registers to be set + reg_num = BuildCounterReadRegisters(j, block_id, reg_addr, reg_val); + for (k = 0; k < reg_num; k++) { + if (reg_val[k] == COPY_DATA_FLAG) { + cmdWriter->BuildCopyDataPacket(cmdBuff, COPY_DATA_SEL_REG, reg_addr[k], 0, + pmcData_ + total_counter_num, COPY_DATA_SEL_COUNT_1DW, + false); + total_counter_num++; + } else { + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, reg_addr[k], reg_val[k]); + } + } + } + } + } + + // Reset Grbm to its default state - broadcast + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX__CI__VI, reset_grbm_); + + profiler_state_ = ROCR_PMU_STATE_STOP; + return true; +} + +bool ViPmu::initCounterBlock() { + for (int i = 0; !(std::string(ViPmuHwBlocks[i].blockName).empty()); i++) { + // Override the value of max number of shader engines + ViPmuHwBlocks[i].maxShaderEngineCount = num_se_; + + // Instantiate a perf counter block and its properties + GpuCounterBlock* cntr_blk = new GpuCounterBlock(); + if (!cntr_blk) { + blk_map_.clear(); + return false; + } + + cntr_blk->setInfo(GPU_BLK_INFO_BLOCK_NAME, GPU_BLOCK_NAME_SIZE, + (void*)ViPmuHwBlocks[i].blockName); + + cntr_blk->setInfo(GPU_BLK_INFO_ID, sizeof(uint32_t), (void*)&ViPmuHwBlocks[i].counterGroupId); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_SHADER_ENGINE_COUNT, sizeof(uint32_t), + (void*)&(ViPmuHwBlocks[i].maxShaderEngineCount)); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_SHADER_ARRAY_COUNT, sizeof(uint32_t), + (void*)&(ViPmuHwBlocks[i].maxShaderArrayCount)); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_INSTANCE_COUNT, sizeof(uint32_t), + (void*)&(ViPmuHwBlocks[i].maxInstanceCount)); + + cntr_blk->setInfo(GPU_BLK_INFO_CONTROL_METHOD, sizeof(uint32_t), + (void*)&(ViPmuHwBlocks[i].method)); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_EVENT_ID, sizeof(uint32_t), + (void*)&(ViPmuHwBlocks[i].maxEventId)); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_SIMULTANEOUS_COUNTERS, sizeof(uint32_t), + (void*)&(ViPmuHwBlocks[i].maxSimultaneousCounters)); + + cntr_blk->setInfo(GPU_BLK_INFO_MAX_STREAMING_COUNTERS, sizeof(uint32_t), + (void*)&(ViPmuHwBlocks[i].maxStreamingCounters)); + + cntr_blk->setInfo(GPU_BLK_INFO_SHARED_HW_COUNTERS, sizeof(uint32_t), + (void*)&(ViPmuHwBlocks[i].sharedHWCounters)); + + cntr_blk->setInfo(GPU_BLK_INFO_HAS_FILTERS, sizeof(bool), + (void*)&(ViPmuHwBlocks[i].hasFilters)); + + // TODO: Need to fill in the Threadtrace stuff here + HsaViCounterBlockId blk_id; + blk_id = static_cast(ViPmuHwBlocks[i].counterGroupId); + blk_map_.insert(ViCounterBlockMap::value_type(blk_id, cntr_blk)); + } + + // Initiate the PMU state and error code + error_code_ = 0; + profiler_state_ = ROCR_PMU_STATE_IDLE; + return true; +} + +int ViPmu::getLastError() { return error_code_; } + +std::string ViPmu::getErrorString(int error) { + if ((error >= 0) && (error < kHsaPmuErrorCodeMax)) { + std::string err_string(errorString[error]); + return err_string; + } + return string("Error input code!"); +} + +bool ViPmu::getParameter(uint32_t param, uint32_t& retSize, void** ppData) { + return parameter_set_->getParameter(param, retSize, ppData); +} + +bool ViPmu::setParameter(uint32_t param, uint32_t paramSize, const void* p_data) { + return parameter_set_->setParameter(param, paramSize, p_data); +} + +bool ViPmu::getInfo(uint32_t info, uint32_t& retSize, void** ppData) { + return info_set_->getInfo(info, retSize, ppData); +} + +pm4_profile::CounterBlock* ViPmu::getCounterBlockById(uint32_t id) { + HsaViCounterBlockId block_id = static_cast(id); + + // Carrizo has only 8 instances of TA, TD, TCP Perf Blocks + /* + if (asic_ == HsaAmdDeviceAsicTypeCZ) { + if ( ((id >= kHsaViCounterBlockIdTa8) && (id <= kHsaViCounterBlockIdTa15)) || + ((id >= kHsaViCounterBlockIdTd8) && (id <= kHsaViCounterBlockIdTd15)) || + ((id >= kHsaViCounterBlockIdTcp8) && (id <= kHsaViCounterBlockIdTcp15))) { + return NULL; + } + } + */ + + return blk_map_[block_id]; +} + +pm4_profile::CounterBlock** ViPmu::getAllCounterBlocks(uint32_t& num_blocks) { + size_t block_size = blk_map_.size(); + + if (block_size <= 0) { + error_code_ = kHsaPmuErrorCodeNoCounterBlock; + return NULL; + } + + if (blk_list_) { + free(blk_list_); + blk_list_ = NULL; + } + + blk_list_size_ = (uint32_t)(sizeof(GpuCounterBlock*) * block_size); + blk_list_size_ = ((blk_list_size_ % 4096) != 0) ? 4096 : blk_list_size_; + blk_list_ = (CounterBlock**)malloc(blk_list_size_); + if (blk_list_ == NULL) { + return NULL; + } + + ViCounterBlockMap::iterator it; + uint32_t blk_cnt = 0; + for (it = blk_map_.begin(); it != blk_map_.end(); it++) { + blk_list_[blk_cnt] = it->second; + blk_cnt++; + } + + num_blocks = blk_cnt; + return blk_list_; +} + +uint32_t ViPmu::ProgramTcpCntrs(uint32_t tcpRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + regGRBM_GFX_INDEX grbm_gfx_index; + + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_INDEX = blkId - kHsaViCounterBlockIdTcp0; + + uint32_t regIdx = 0; + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX__CI__VI; + regIdx++; + + regTCP_PERFCOUNTER0_SELECT__CI__VI tcp_perf_counter_select; + tcp_perf_counter_select.u32All = 0; + tcp_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[regIdx] = tcp_perf_counter_select.u32All; + regAddr[regIdx] = ViTcpCounterRegAddr[tcpRegIdx].counterSelRegAddr; + regIdx++; + + return regIdx; +} + +uint32_t ViPmu::ProgramTdCntrs(uint32_t tdRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + regGRBM_GFX_INDEX grbm_gfx_index; + + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_INDEX = blkId - kHsaViCounterBlockIdTd0; + + uint32_t regIdx = 0; + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX__CI__VI; + regIdx++; + + regTD_PERFCOUNTER0_SELECT td_perf_counter_select; + td_perf_counter_select.u32All = 0; + td_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[regIdx] = td_perf_counter_select.u32All; + regAddr[regIdx] = ViTdCounterRegAddr[tdRegIdx].counterSelRegAddr; + regIdx++; + + return regIdx; +} + +uint32_t ViPmu::ProgramTccCntrs(uint32_t tccRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + regGRBM_GFX_INDEX grbm_gfx_index; + + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_INDEX = blkId - kHsaViCounterBlockIdTcc0; + + uint32_t regIdx = 0; + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX__CI__VI; + regIdx++; + + regTCC_PERFCOUNTER0_SELECT__CI__VI tcc_perf_counter_select; + tcc_perf_counter_select.u32All = 0; + tcc_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[regIdx] = tcc_perf_counter_select.u32All; + regAddr[regIdx] = ViTccCounterRegAddr[tccRegIdx].counterSelRegAddr; + regIdx++; + + return regIdx; +} + +uint32_t ViPmu::ProgramTcaCntrs(uint32_t tcaRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + regGRBM_GFX_INDEX grbm_gfx_index; + + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_INDEX = blkId - kHsaViCounterBlockIdTca0; + + uint32_t regIdx = 0; + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX__CI__VI; + regIdx++; + + regTCA_PERFCOUNTER0_SELECT__CI__VI tca_perf_counter_select; + tca_perf_counter_select.u32All = 0; + tca_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[regIdx] = tca_perf_counter_select.u32All; + regAddr[regIdx] = ViTcaCounterRegAddr[tcaRegIdx].counterSelRegAddr; + regIdx++; + return regIdx; +} + +uint32_t ViPmu::ProgramTaCntrs(uint32_t taRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + regGRBM_GFX_INDEX grbm_gfx_index; + + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_INDEX = blkId - kHsaViCounterBlockIdTa0; + + uint32_t regIdx = 0; + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX__CI__VI; + regIdx++; + + regTA_PERFCOUNTER0_SELECT ta_perf_counter_select; + ta_perf_counter_select.u32All = 0; + ta_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[regIdx] = ta_perf_counter_select.u32All; + regAddr[regIdx] = ViTaCounterRegAddr[taRegIdx].counterSelRegAddr; + regIdx++; + + return regIdx; +} + +uint32_t ViPmu::ProgramSQCntrs(uint32_t sqRegIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, uint32_t blkCntrIdx) { + uint32_t regIdx = 0; + + // Program the SQ Counter Select Register + regSQ_PERFCOUNTER0_SELECT__CI__VI sq_cntr_sel; + sq_cntr_sel.u32All = 0; + sq_cntr_sel.bits.SIMD_MASK = 0xF; + sq_cntr_sel.bits.SQC_BANK_MASK = 0xF; + sq_cntr_sel.bits.SQC_CLIENT_MASK = 0xF; + sq_cntr_sel.bits.PERF_SEL = blkCntrIdx; + regVal[regIdx] = sq_cntr_sel.u32All; + regAddr[regIdx] = ViSqCounterRegAddr[sqRegIdx].counterSelRegAddr; + regIdx++; + + // Program the SQ Counter Mask Register + regSQ_PERFCOUNTER_MASK__CI__VI sq_cntr_mask; + sq_cntr_mask.u32All = 0; + sq_cntr_mask.bits.SH0_MASK = 0xFFFF; + sq_cntr_mask.bits.SH1_MASK = 0xFFFF; + regVal[regIdx] = sq_cntr_mask.u32All; + regAddr[regIdx] = mmSQ_PERFCOUNTER_MASK__CI__VI; + regIdx++; + + // Initialize the register content + // Program the SQ Counter Control Register + regSQ_PERFCOUNTER_CTRL sq_cntr_ctrl; + sq_cntr_ctrl.u32All = 0; + if (blkId == kHsaViCounterBlockIdSq) { + sq_cntr_ctrl.bits.ES_EN = 0x1; + sq_cntr_ctrl.bits.GS_EN = 0x1; + sq_cntr_ctrl.bits.VS_EN = 0x1; + sq_cntr_ctrl.bits.PS_EN = 0x1; + sq_cntr_ctrl.bits.LS_EN = 0x1; + sq_cntr_ctrl.bits.HS_EN = 0x1; + sq_cntr_ctrl.bits.CS_EN = 0x1; + } else if (blkId == kHsaViCounterBlockIdSqEs) { + sq_cntr_ctrl.bits.ES_EN = 0x1; + } else if (blkId == kHsaViCounterBlockIdSqGs) { + sq_cntr_ctrl.bits.GS_EN = 0x1; + } else if (blkId == kHsaViCounterBlockIdSqVs) { + sq_cntr_ctrl.bits.VS_EN = 0x1; + } else if (blkId == kHsaViCounterBlockIdSqPs) { + sq_cntr_ctrl.bits.PS_EN = 0x1; + } else if (blkId == kHsaViCounterBlockIdSqLs) { + sq_cntr_ctrl.bits.LS_EN = 0x1; + } else if (blkId == kHsaViCounterBlockIdSqHs) { + sq_cntr_ctrl.bits.HS_EN = 0x1; + } else if (blkId == kHsaViCounterBlockIdSqCs) { + sq_cntr_ctrl.bits.CS_EN = 0x1; + } + + regVal[regIdx] = sq_cntr_ctrl.u32All; + regAddr[regIdx] = ViSqCounterRegAddr[sqRegIdx].counterCntlRegAddr; + regIdx++; + + return regIdx; +} + +uint32_t ViPmu::BuildCounterSelRegister(uint32_t cntrIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, pm4_profile::Counter* blkCntr) { + void* p_data; + uint32_t data_size; + uint32_t blkCntrIdx; + uint32_t instance_index; + regGRBM_GFX_INDEX grbm_gfx_index; + + // Get the blkCntr selection value + if (!blkCntr->getParameter(HSA_EXT_TOOLS_COUNTER_PARAMETER_EVENT_INDEX, data_size, + (void**)&p_data)) { + return 0; + } + blkCntrIdx = *(static_cast(p_data)); + + uint32_t regIdx = 0; + switch (blkId) { + // Program counters belonging to SQ block + case kHsaViCounterBlockIdSq: + case kHsaViCounterBlockIdSqEs: + case kHsaViCounterBlockIdSqGs: + case kHsaViCounterBlockIdSqVs: + case kHsaViCounterBlockIdSqPs: + case kHsaViCounterBlockIdSqLs: + case kHsaViCounterBlockIdSqHs: + case kHsaViCounterBlockIdSqCs: + return ProgramSQCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaViCounterBlockIdCb0: + case kHsaViCounterBlockIdCb1: + case kHsaViCounterBlockIdCb2: + case kHsaViCounterBlockIdCb3: { + regIdx = 0; + instance_index = blkId - kHsaViCounterBlockIdCb0; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER0_LO__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER0_HI__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER1_LO__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER1_HI__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER2_LO__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER2_HI__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER3_LO__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmCB_PERFCOUNTER3_HI__CI__VI; + regIdx++; + + regCB_PERFCOUNTER0_SELECT__CI__VI cb_perf_counter_select; + cb_perf_counter_select.u32All = 0; + cb_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[regIdx] = cb_perf_counter_select.u32All; + regAddr[regIdx] = ViCbCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx++; + + break; + } + + case kHsaViCounterBlockIdCpf: { + regCPF_PERFCOUNTER0_SELECT__CI__VI cpf_perf_counter_select; + cpf_perf_counter_select.u32All = 0; + cpf_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + + regVal[0] = cpf_perf_counter_select.u32All; + regAddr[0] = ViCpfCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaViCounterBlockIdDb0: + case kHsaViCounterBlockIdDb1: + case kHsaViCounterBlockIdDb2: + case kHsaViCounterBlockIdDb3: { + instance_index = blkId - kHsaViCounterBlockIdDb0; + regIdx = 0; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + + regVal[regIdx] = grbm_gfx_index.u32All; + regAddr[regIdx] = mmGRBM_GFX_INDEX__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER0_LO__CI__VI; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER0_HI__CI__VI; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER1_LO__CI__VI; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER1_HI__CI__VI; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER2_LO__CI__VI; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER2_HI__CI__VI; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER3_LO__CI__VI; + regIdx++; + regVal[regIdx] = 0; + regAddr[regIdx] = mmDB_PERFCOUNTER3_HI__CI__VI; + regIdx++; + + regDB_PERFCOUNTER0_SELECT db_perf_counter_select; + db_perf_counter_select.u32All = 0; + db_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[regIdx] = db_perf_counter_select.u32All; + regAddr[regIdx] = ViDbCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx++; + break; + } + + case kHsaViCounterBlockIdGrbm: { + regGRBM_PERFCOUNTER0_SELECT grbm_perf_counter_select; + grbm_perf_counter_select.u32All = 0; + grbm_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = grbm_perf_counter_select.u32All; + regAddr[0] = ViGrbmCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaViCounterBlockIdGrbmSe: { + regGRBM_SE0_PERFCOUNTER_SELECT grbm_se0_perf_counter_select; + grbm_se0_perf_counter_select.u32All = 0; + grbm_se0_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = grbm_se0_perf_counter_select.u32All; + regAddr[0] = ViGrbmSeCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaViCounterBlockIdPaSu: { + regPA_SU_PERFCOUNTER0_SELECT pa_su_perf_counter_select; + pa_su_perf_counter_select.u32All = 0; + pa_su_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = pa_su_perf_counter_select.u32All; + regAddr[0] = ViPaSuCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaViCounterBlockIdPaSc: { + regPA_SC_PERFCOUNTER0_SELECT pa_sc_perf_counter_select; + pa_sc_perf_counter_select.u32All = 0; + pa_sc_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = pa_sc_perf_counter_select.u32All; + regAddr[0] = ViPaScCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaViCounterBlockIdSpi: { + regSPI_PERFCOUNTER0_SELECT spi_perf_counter_select; + spi_perf_counter_select.u32All = 0; + spi_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = spi_perf_counter_select.u32All; + regAddr[0] = ViSpiCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaViCounterBlockIdSx: { + regIdx = 0; + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER0_LO__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER0_HI__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER1_LO__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER1_HI__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER2_LO__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER2_HI__CI__VI; + regIdx++; + + regVal[regIdx] = 0; + regAddr[regIdx] = mmSX_PERFCOUNTER3_LO__CI__VI; + regIdx++; + + regSX_PERFCOUNTER0_SELECT sx_perf_counter_select; + sx_perf_counter_select.u32All = 0; + sx_perf_counter_select.bits.PERFCOUNTER_SELECT = blkCntrIdx; + regVal[regIdx] = sx_perf_counter_select.u32All; + regAddr[regIdx] = ViSxCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx++; + break; + } + + case kHsaViCounterBlockIdTa0: + case kHsaViCounterBlockIdTa1: + case kHsaViCounterBlockIdTa2: + case kHsaViCounterBlockIdTa3: + case kHsaViCounterBlockIdTa4: + case kHsaViCounterBlockIdTa5: + case kHsaViCounterBlockIdTa6: + case kHsaViCounterBlockIdTa7: + case kHsaViCounterBlockIdTa8: + case kHsaViCounterBlockIdTa9: + case kHsaViCounterBlockIdTa10: + case kHsaViCounterBlockIdTa11: + case kHsaViCounterBlockIdTa12: + case kHsaViCounterBlockIdTa13: + case kHsaViCounterBlockIdTa14: + case kHsaViCounterBlockIdTa15: + return ProgramTaCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaViCounterBlockIdTca0: + case kHsaViCounterBlockIdTca1: + return ProgramTcaCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaViCounterBlockIdTcc0: + case kHsaViCounterBlockIdTcc1: + case kHsaViCounterBlockIdTcc2: + case kHsaViCounterBlockIdTcc3: + case kHsaViCounterBlockIdTcc4: + case kHsaViCounterBlockIdTcc5: + case kHsaViCounterBlockIdTcc6: + case kHsaViCounterBlockIdTcc7: + case kHsaViCounterBlockIdTcc8: + case kHsaViCounterBlockIdTcc9: + case kHsaViCounterBlockIdTcc10: + case kHsaViCounterBlockIdTcc11: + case kHsaViCounterBlockIdTcc12: + case kHsaViCounterBlockIdTcc13: + case kHsaViCounterBlockIdTcc14: + case kHsaViCounterBlockIdTcc15: + return ProgramTccCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaViCounterBlockIdTd0: + case kHsaViCounterBlockIdTd1: + case kHsaViCounterBlockIdTd2: + case kHsaViCounterBlockIdTd3: + case kHsaViCounterBlockIdTd4: + case kHsaViCounterBlockIdTd5: + case kHsaViCounterBlockIdTd6: + case kHsaViCounterBlockIdTd7: + case kHsaViCounterBlockIdTd8: + case kHsaViCounterBlockIdTd9: + case kHsaViCounterBlockIdTd10: + case kHsaViCounterBlockIdTd11: + case kHsaViCounterBlockIdTd12: + case kHsaViCounterBlockIdTd13: + case kHsaViCounterBlockIdTd14: + case kHsaViCounterBlockIdTd15: + return ProgramTdCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaViCounterBlockIdTcp0: + case kHsaViCounterBlockIdTcp1: + case kHsaViCounterBlockIdTcp2: + case kHsaViCounterBlockIdTcp3: + case kHsaViCounterBlockIdTcp4: + case kHsaViCounterBlockIdTcp5: + case kHsaViCounterBlockIdTcp6: + case kHsaViCounterBlockIdTcp7: + case kHsaViCounterBlockIdTcp8: + case kHsaViCounterBlockIdTcp9: + case kHsaViCounterBlockIdTcp10: + case kHsaViCounterBlockIdTcp11: + case kHsaViCounterBlockIdTcp12: + case kHsaViCounterBlockIdTcp13: + case kHsaViCounterBlockIdTcp14: + case kHsaViCounterBlockIdTcp15: + return ProgramTcpCntrs(cntrIdx, regAddr, regVal, blkId, blkCntrIdx); + + case kHsaViCounterBlockIdGds: { + regGDS_PERFCOUNTER0_SELECT gds_perf_counter_select; + gds_perf_counter_select.u32All = 0; + gds_perf_counter_select.bits.PERFCOUNTER_SELECT = blkCntrIdx; + regVal[0] = gds_perf_counter_select.u32All; + regAddr[0] = ViGdsCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaViCounterBlockIdVgt: { + regVGT_PERFCOUNTER0_SELECT__CI__VI vgt_perf_counter_select; + vgt_perf_counter_select.u32All = 0; + vgt_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = vgt_perf_counter_select.u32All; + regAddr[0] = ViVgtCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaViCounterBlockIdIa: { + regIA_PERFCOUNTER0_SELECT__CI__VI ia_perf_counter_select; + ia_perf_counter_select.u32All = 0; + ia_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = ia_perf_counter_select.u32All; + regAddr[0] = ViIaCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + /* + case kHsaViCounterBlockIdMc: { + // To be investigated later + //regMC_SEQ_PERF_SEQ_CTL mc_perfcounter_select; + //mc_perfcounter_select.u32All = 0; + //mc_perfcounter_select.bits.PERF_SEL = blkCntrIdx; + //regVal[0] = mc_perfcounter_select.u32All; + //regAddr[0] = ViMcCounterRegAddr[cntrIdx].counterSelRegAddr; + //regIdx = 1; + } + break; + */ + + case kHsaViCounterBlockIdSrbm: { + regSRBM_PERFCOUNTER0_SELECT srbm_perf_counter_select; + srbm_perf_counter_select.u32All = 0; + srbm_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = srbm_perf_counter_select.u32All; + regAddr[0] = ViSrbmCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + /* + case kHsaViCounterBlockIdTcs: { + regTCS_PERFCOUNTER0_SELECT__CI tcs_perf_counter_select; + tcs_perf_counter_select.u32All = 0; + tcs_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = tcs_perf_counter_select.u32All; + regAddr[0] = ViTcsCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + */ + + case kHsaViCounterBlockIdWd: { + regWD_PERFCOUNTER0_SELECT__CI__VI wd_perf_counter_select; + wd_perf_counter_select.u32All = 0; + wd_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = wd_perf_counter_select.u32All; + regAddr[0] = ViWdCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaViCounterBlockIdCpg: { + regCPG_PERFCOUNTER0_SELECT__CI__VI cpg_perf_counter_select; + cpg_perf_counter_select.u32All = 0; + cpg_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = cpg_perf_counter_select.u32All; + regAddr[0] = ViCpgCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + case kHsaViCounterBlockIdCpc: { + regCPC_PERFCOUNTER0_SELECT__CI__VI cpc_perf_counter_select; + cpc_perf_counter_select.u32All = 0; + cpc_perf_counter_select.bits.PERF_SEL = blkCntrIdx; + regVal[0] = cpc_perf_counter_select.u32All; + regAddr[0] = ViCpcCounterRegAddr[cntrIdx].counterSelRegAddr; + regIdx = 1; + break; + } + + /* + case kHsaViCounterBlockIdMc: { + AddPriviledgedCountersToList(ViBlockIdMc, blkCntrIdx); + //Num of regs equals to 0 means it is processed by KFD + regIdx = 0; + break; + } + + case kHsaViCounterBlockIdIommuV2: { + AddPriviledgedCountersToList(ViBlockIdIommuV2, blkCntrIdx); + //Num of regs equals to 0 means it is processed by KFD + regIdx = 0; + break; + } + + case kHsaViCounterBlockIdKernelDriver: { + AddPriviledgedCountersToList(ViBlockIdKernelDriver, blkCntrIdx); + //Num of regs equals to 0 means it is processed by KFD + regIdx = 0; + break; + } + */ + + default: { + regIdx = 0; + break; + } + } + + return regIdx; +} + +uint32_t ViPmu::BuildCounterReadRegisters(uint32_t reg_index, uint32_t block_id, uint32_t* reg_addr, + uint32_t* reg_val) { + uint32_t ii; + uint32_t reg_num = 0; + uint32_t instance_index; + regGRBM_GFX_INDEX grbm_gfx_index; + switch (block_id) { + case kHsaViCounterBlockIdSq: + case kHsaViCounterBlockIdSqEs: + case kHsaViCounterBlockIdSqGs: + case kHsaViCounterBlockIdSqVs: + case kHsaViCounterBlockIdSqPs: + case kHsaViCounterBlockIdSqLs: + case kHsaViCounterBlockIdSqHs: + case kHsaViCounterBlockIdSqCs: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViSqCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViSqCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaViCounterBlockIdCb0: + case kHsaViCounterBlockIdCb1: + case kHsaViCounterBlockIdCb2: + case kHsaViCounterBlockIdCb3: { + instance_index = block_id - kHsaViCounterBlockIdCb0; + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViCbCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViCbCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaViCounterBlockIdCpf: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = ViCpfCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViCpfCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaViCounterBlockIdDb0: + case kHsaViCounterBlockIdDb1: + case kHsaViCounterBlockIdDb2: + case kHsaViCounterBlockIdDb3: { + instance_index = block_id - kHsaViCounterBlockIdDb0; + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViDbCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViDbCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaViCounterBlockIdGrbm: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = ViGrbmCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViGrbmCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaViCounterBlockIdGrbmSe: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = ViGrbmSeCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViGrbmSeCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaViCounterBlockIdPaSu: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViPaSuCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViPaSuCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaViCounterBlockIdPaSc: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViPaScCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViPaScCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaViCounterBlockIdSpi: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViSpiCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViSpiCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaViCounterBlockIdSx: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViSxCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViSxCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaViCounterBlockIdTa0: + case kHsaViCounterBlockIdTa1: + case kHsaViCounterBlockIdTa2: + case kHsaViCounterBlockIdTa3: + case kHsaViCounterBlockIdTa4: + case kHsaViCounterBlockIdTa5: + case kHsaViCounterBlockIdTa6: + case kHsaViCounterBlockIdTa7: + case kHsaViCounterBlockIdTa8: + case kHsaViCounterBlockIdTa9: + case kHsaViCounterBlockIdTa10: + case kHsaViCounterBlockIdTa11: + case kHsaViCounterBlockIdTa12: + case kHsaViCounterBlockIdTa13: + case kHsaViCounterBlockIdTa14: + case kHsaViCounterBlockIdTa15: { + instance_index = block_id - kHsaViCounterBlockIdTa0; + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViTaCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViTaCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaViCounterBlockIdTca0: + case kHsaViCounterBlockIdTca1: { + instance_index = block_id - kHsaViCounterBlockIdTca0; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViTcaCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViTcaCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaViCounterBlockIdTcc0: + case kHsaViCounterBlockIdTcc1: + case kHsaViCounterBlockIdTcc2: + case kHsaViCounterBlockIdTcc3: + case kHsaViCounterBlockIdTcc4: + case kHsaViCounterBlockIdTcc5: + case kHsaViCounterBlockIdTcc6: + case kHsaViCounterBlockIdTcc7: + case kHsaViCounterBlockIdTcc8: + case kHsaViCounterBlockIdTcc9: + case kHsaViCounterBlockIdTcc10: + case kHsaViCounterBlockIdTcc11: + case kHsaViCounterBlockIdTcc12: + case kHsaViCounterBlockIdTcc13: + case kHsaViCounterBlockIdTcc14: + case kHsaViCounterBlockIdTcc15: { + instance_index = block_id - kHsaViCounterBlockIdTcc0; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViTccCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViTccCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaViCounterBlockIdTd0: + case kHsaViCounterBlockIdTd1: + case kHsaViCounterBlockIdTd2: + case kHsaViCounterBlockIdTd3: + case kHsaViCounterBlockIdTd4: + case kHsaViCounterBlockIdTd5: + case kHsaViCounterBlockIdTd6: + case kHsaViCounterBlockIdTd7: + case kHsaViCounterBlockIdTd8: + case kHsaViCounterBlockIdTd9: + case kHsaViCounterBlockIdTd10: + case kHsaViCounterBlockIdTd11: + case kHsaViCounterBlockIdTd12: + case kHsaViCounterBlockIdTd13: + case kHsaViCounterBlockIdTd14: + case kHsaViCounterBlockIdTd15: { + instance_index = block_id - kHsaViCounterBlockIdTd0; + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViTdCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViTdCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaViCounterBlockIdTcp0: + case kHsaViCounterBlockIdTcp1: + case kHsaViCounterBlockIdTcp2: + case kHsaViCounterBlockIdTcp3: + case kHsaViCounterBlockIdTcp4: + case kHsaViCounterBlockIdTcp5: + case kHsaViCounterBlockIdTcp6: + case kHsaViCounterBlockIdTcp7: + case kHsaViCounterBlockIdTcp8: + case kHsaViCounterBlockIdTcp9: + case kHsaViCounterBlockIdTcp10: + case kHsaViCounterBlockIdTcp11: + case kHsaViCounterBlockIdTcp12: + case kHsaViCounterBlockIdTcp13: + case kHsaViCounterBlockIdTcp14: + case kHsaViCounterBlockIdTcp15: { + instance_index = block_id - kHsaViCounterBlockIdTcp0; + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_INDEX = instance_index; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViTcpCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViTcpCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaViCounterBlockIdGds: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = ViGdsCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViGdsCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaViCounterBlockIdVgt: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViVgtCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViVgtCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + + case kHsaViCounterBlockIdIa: { + for (ii = 0; ii < num_se_; ii++) { + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_INDEX = ii; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = grbm_gfx_index.u32All; + reg_num++; + + reg_addr[reg_num] = ViIaCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViIaCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + } + break; + } + /* + case kHsaViCounterBlockIdMc: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = ViMcCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViMcCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + */ + case kHsaViCounterBlockIdSrbm: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = ViSrbmCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViSrbmCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + /* + case kHsaViCounterBlockIdTcs: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = ViTcsCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViTcsCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + */ + case kHsaViCounterBlockIdWd: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = ViWdCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViWdCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaViCounterBlockIdCpg: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = ViCpgCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViCpgCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + case kHsaViCounterBlockIdCpc: { + reg_addr[reg_num] = mmGRBM_GFX_INDEX__CI__VI; + reg_val[reg_num] = reset_grbm_; + reg_num++; + + reg_addr[reg_num] = ViCpcCounterRegAddr[reg_index].counterReadRegAddrLo; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + + reg_addr[reg_num] = ViCpcCounterRegAddr[reg_index].counterReadRegAddrHi; + reg_val[reg_num] = COPY_DATA_FLAG; + reg_num++; + break; + } + + // IommuV2, MC, kernel driver counters are retrieved via + // KFD implementation + case kHsaViCounterBlockIdMc: + case kHsaViCounterBlockIdIommuV2: + case kHsaViCounterBlockIdKernelDriver: { + reg_num = 0; + break; + } + + default: { break; } + } + + return reg_num; +} + +hsa_status_t ViPmu::RemoveCounterBlocks() { + ViCounterBlockMap::iterator it = blk_map_.begin(); + ViCounterBlockMap::iterator block_end = blk_map_.end(); + + for (; it != block_end; it++) { + delete it->second; + } + + return HSA_STATUS_SUCCESS; +} + + +} /* namespace */ diff --git a/runtime/hsa-ext-aql-profile/src/perfcounter/vi_pmu.h b/runtime/hsa-ext-aql-profile/src/perfcounter/vi_pmu.h new file mode 100644 index 0000000000..cd1a1dfb37 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/perfcounter/vi_pmu.h @@ -0,0 +1,141 @@ +#ifndef _VI_PMU_H_ +#define _VI_PMU_H_ + +#include "hsa.h" +#include "cmdwriter.h" +#include "hsa_perf.h" +#include "info_set.h" +#include "parameter_set.h" +#include "vi_blockinfo.h" +#include "rocr_profiler.h" + +#include +#include +#include + +namespace pm4_profile { +typedef std::map ViCounterBlockMap; + +// This class implement the VI PMU. It is responsible for setting up +// CounterGroups to represent each VI hardware block which exposes performance +// counters. +class ViPmu : public pm4_profile::Pmu { + public: + ViPmu(); + ~ViPmu(); + + // Returns number of shader engines per block + // for the blocks featured shader engines instancing + uint32_t getNumSe() { return num_se_; } + + // Initializes the handle of buffer used to collect PMC data + bool setPmcDataBuff(uint8_t* pmcBuffer, uint32_t pmcBuffSz); + + int getLastError(); + + std::string getErrorString(int error); + + virtual bool begin(pm4_profile::DefaultCmdBuf* cmdBuff, pm4_profile::CommandWriter* cmdWriter, + bool reset = true); + + virtual bool end(pm4_profile::DefaultCmdBuf* cmdBuff, pm4_profile::CommandWriter* cmdWriter); + + // IPMU inherits the IParameterSet and IInfoSetso we implement it + // through composition and function forwarding + bool getParameter(uint32_t param, uint32_t& ret_size, void** pp_data); + + bool setParameter(uint32_t param, uint32_t param_size, const void* p_data); + + bool getInfo(uint32_t info, uint32_t& ret_size, void** pp_data); + + pm4_profile::CounterBlock* getCounterBlockById(uint32_t id); + + rocr_pmu_state_t getCurrentState() { return profiler_state_; } + + pm4_profile::CounterBlock** getAllCounterBlocks(uint32_t& num_groups); + + private: + // Addr of Counter Data Buffer + uint32_t* pmcData_; + + // Size of Counter Data Buffer + uint32_t pmcDataSz_; + + void Init(); + + bool initCounterBlock(); + + bool isResultReady(); + + // Clear CounterBlockMap + void clearCounterBlockMap(); + + // Reset SQ and CB counters + void ResetCounterBlocks(pm4_profile::DefaultCmdBuf* cmdBuff, + pm4_profile::CommandWriter* cmdWriter); + + // Program SQ block related counters + uint32_t ProgramSQCntrs(uint32_t sqRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Program TA block related counters + uint32_t ProgramTaCntrs(uint32_t taRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Program TCA block related counters + uint32_t ProgramTcaCntrs(uint32_t tcaRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Program TCC block related counters + uint32_t ProgramTccCntrs(uint32_t tccRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Program TCP block related counters + uint32_t ProgramTcpCntrs(uint32_t tcpRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Program TD block related counters + uint32_t ProgramTdCntrs(uint32_t tdRegIdx, uint32_t* regAddr, uint32_t* regVal, uint32_t blkId, + uint32_t blkCntrIdx); + + // Build counter selection register, return how many registers are built + uint32_t BuildCounterSelRegister(uint32_t cntrIdx, uint32_t* regAddr, uint32_t* regVal, + uint32_t blkId, pm4_profile::Counter* blkCntr); + + // Build counter selection register, return how many registers are built + uint32_t BuildCounterReadRegisters(uint32_t reg_index, uint32_t block_id, uint32_t* reg_addr, + uint32_t* reg_val); + + private: + // Delete counter blocks in the PMU + hsa_status_t RemoveCounterBlocks(); + + private: + // This contains the available counter groups. + ViCounterBlockMap blk_map_; + + // This stores the current profiling state. + rocr_pmu_state_t profiler_state_; + + pm4_profile::ParameterSet* parameter_set_; + + pm4_profile::InfoSet* info_set_; + + int error_code_; + +// A flag to indicate the current packet is for copy register value +#define COPY_DATA_FLAG 0xFFFFFFFF +#define MAX_REG_NUM 100 + + // Pointer used to store counter block list internally + uint32_t blk_list_size_; + pm4_profile::CounterBlock** blk_list_; + + // Indicates the number of Shader Engines Present + uint32_t num_se_; + + // Used to reset GRBM to its default state + uint32_t reset_grbm_; +}; +} +#endif diff --git a/runtime/hsa-ext-aql-profile/src/threadtrace/CMakeLists.txt b/runtime/hsa-ext-aql-profile/src/threadtrace/CMakeLists.txt new file mode 100644 index 0000000000..a35358f0d8 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/threadtrace/CMakeLists.txt @@ -0,0 +1,18 @@ +# +# Source files for Rocr ThreadTrace +# +set ( LIB_SRC thread_trace.cpp ) +set ( LIB_SRC ${LIB_SRC} gfx8_thread_trace.cpp ) +set ( LIB_SRC ${LIB_SRC} gfx9_thread_trace.cpp ) + +# +# Header files include path(s). +# +include_directories ( $ENV{ROCR_INC_DIR} ) +include_directories ( ${PROJ_DIR}/commandwriter ) +include_directories ( ${HSA_RUNTIME_OSC_DIR} ) + +# +# Build ThreadTrace as a Static Library object +# +add_library ( ${SQTT_LIB} STATIC ${LIB_SRC} ) diff --git a/runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.cpp b/runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.cpp new file mode 100644 index 0000000000..14412e43c9 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.cpp @@ -0,0 +1,360 @@ + +#include +#include +#include +#include +#include + +#include "core/util/os.h" +#include "gfx8_thread_trace.h" + +/// @brief Returns the lower 32-bits of a value +inline uint32_t Low32(uint64_t u) { return (u & 0xFFFFFFFFUL); } + +/// @brief Returns the upper 32-bits of a value +inline uint32_t High32(uint64_t u) { return (u >> 32); } + +namespace pm4_profile { + +Gfx8ThreadTrace::Gfx8ThreadTrace() { + // Initialize the number of shader engines + numSE_ = 4; +} + +Gfx8ThreadTrace::~Gfx8ThreadTrace() {} + +bool Gfx8ThreadTrace::Init(const ThreadTraceConfig* config) { + // Initialize SQTT Configuration and Register objects + if (!ThreadTrace::Init(config)) return false; + InitThreadTraceCfgRegs(); + return true; +} + +void Gfx8ThreadTrace::InitThreadTraceCfgRegs() { + // Indicates the size of buffer to use per Shader Engine instance. + // The size is specified in terms of 4KB blocks + ttCfgRegs_.ttRegSize.u32All = 0; + + // Indicates various attributes of a thread trace session. + // + // MASK_CS: Which shader types should be enabled for data collection + // Enable CS Shader types. + // + // WRAP: How trace buffer should be used as a ring buffer or as a linear + // buffer - Disable WRAP mode i.e use it as a linear buffer + // + // MODE: Enables a thread trace session + // + // CAPTURE_MODE: When thread trace data is collected immediately after MODE + // is enabled or wait until a Thread Trace Start event is received + // + // AUTOFLUSH_EN: Flush thread trace data to buffer often automatically + // + ttCfgRegs_.ttRegMode.u32All = 0; + ttCfgRegs_.ttRegMode.bits.WRAP = 0; + ttCfgRegs_.ttRegMode.bits.CAPTURE_MODE = 0; + ttCfgRegs_.ttRegMode.bits.MASK_CS = 1; + ttCfgRegs_.ttRegMode.bits.AUTOFLUSH_EN = 1; + ttCfgRegs_.ttRegMode.bits.MODE = SQ_THREAD_TRACE_MODE_OFF; + + // Enable Thread Trace for all VM Id's + // Enable all of the SIMD's of the compute unit + // Enable Compute Unit (CU) at index Zero to be used for fine-grained data + // Enable Shader Array (SH) at index Zero to be used for fine-grained data + // + // @note: Not enabling REG_STALL_EN, SPI_STALL_EN and SQ_STALL_EN bits. They + // are useful if we wish to program buffer throttling. + // + ttCfgRegs_.ttRegMask.u32All = 0; + ttCfgRegs_.ttRegMask.bits.SH_SEL = 0x0; + ttCfgRegs_.ttRegMask.bits.SIMD_EN = 0xF; + ttCfgRegs_.ttRegMask.bits.CU_SEL = SetCuId(); + ttCfgRegs_.ttRegMask.bits.SQ_STALL_EN__CI__VI = 0x1; + ttCfgRegs_.ttRegMask.bits.SPI_STALL_EN__CI__VI = 0x1; + ttCfgRegs_.ttRegMask.bits.REG_STALL_EN__CI__VI = 0x1; + ttCfgRegs_.ttRegMask.bits.VM_ID_MASK = SetVmId(); + + // Override Mask value if a user value is available + uint32_t ttMask = SetMask(); + if (ttMask) { + ttCfgRegs_.ttRegMask.u32All = ttMask; + } + + // Mask of compute units to get thread trace data from + ttCfgRegs_.ttRegPerfMask.u32All = 0; + ttCfgRegs_.ttRegPerfMask.bits.SH0_MASK = 0xFFFF; + ttCfgRegs_.ttRegPerfMask.bits.SH1_MASK = 0xFFFF; + + // Indicate the different TT messages/tokens that should be enabled/logged + // Indicate the different TT tokens that specify register operations to be logged + ttCfgRegs_.ttRegTokenMask.u32All = 0; + ttCfgRegs_.ttRegTokenMask.bits.REG_MASK = 0xFF; + ttCfgRegs_.ttRegTokenMask.bits.TOKEN_MASK = 0xFFFF; + ttCfgRegs_.ttRegTokenMask.bits.REG_DROP_ON_STALL__CI__VI = 0x1; + + // Override TokenMask1 value if a user value is available + uint32_t tokenMask1 = SetTokenMask(); + if (tokenMask1) { + ttCfgRegs_.ttRegTokenMask.u32All = tokenMask1; + } + + // Indicate the different TT tokens that specify instruction operations to be logged + // Disabling specifically instruction operations updating Program Counter (PC). + // @note: The field is defined in the spec incorrectly as a 16-bit value + ttCfgRegs_.ttRegTokenMask2.u32All = 0; + ttCfgRegs_.ttRegTokenMask2.bits.INST_MASK = 0xFFFFFF7F; + + // Override TokenMask2 value if a user value is available + uint32_t tokenMask2 = SetTokenMask2(); + if (tokenMask2) { + ttCfgRegs_.ttRegTokenMask2.u32All = tokenMask2; + } +} + +void Gfx8ThreadTrace::setSqttDataBuff(uint8_t* sqttBuffer, uint32_t sqttBuffSz) { + // Compute the size of buffer available for each shader engine + ttBuffSize_ = sqttBuffSz / numSE_; + + // Populate the sqtt buffer array submitted to device + for (int idx = 0; idx < numSE_; idx++) { + uint64_t sqttSEAddr = uint64_t(sqttBuffer + (ttBuffSize_ * idx)); + devMemList_.push_back(sqttSEAddr); + } + + // Update the size bit-field of sqtt ctrl register + ttCfgRegs_.ttRegSize.bits.SIZE = ttBuffSize_ >> TT_BUFF_ALIGN_SHIFT; +} + +void Gfx8ThreadTrace::BeginSession(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter) { + // Program Grbm to broadcast messages to all shader engines + regGRBM_GFX_INDEX grbm_gfx_index; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX__CI__VI, grbm_gfx_index.u32All); + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Disable RLC Perfmon Clock Gating + // On Vega this is needed to collect Perf Cntrs + // cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmRLC_PERFMON_CLK_CNTL__VI, 1); + + // Program the Compute register to indicate SQTT is enabled + /* + regCOMPUTE_THREAD_TRACE_ENABLE__CI__VI enableTT = {0}; + enableTT.bits.THREAD_TRACE_ENABLE = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, + mmCOMPUTE_THREAD_TRACE_ENABLE__CI__VI, + enableTT.u32All); + */ + + // Program the thread trace mask - specifies SH, CU, SIMD and + // VM Id masks to apply. Enabling SQ/SPI/REG_STALL_EN bits + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_MASK__VI, + ttCfgRegs_.ttRegMask.u32All); + + // Program the thread trace Perf mask + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_PERF_MASK__VI, + ttCfgRegs_.ttRegPerfMask.u32All); + + // Program the thread trace token mask + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_TOKEN_MASK__VI, + ttCfgRegs_.ttRegTokenMask.u32All); + + // Program the thread trace token mask2 to specify the list of instruction + // tokens to record. Disabling INST_PC instruction tokens + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_TOKEN_MASK2__VI, + ttCfgRegs_.ttRegTokenMask2.u32All); + + // Program the thread trace mode register + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_MODE__VI, + ttCfgRegs_.ttRegMode.u32All); + + // Program the HiWaterMark register to support stalling + if ((ttCfgRegs_.ttRegMask.bits.SQ_STALL_EN__CI__VI) || + (ttCfgRegs_.ttRegMask.bits.SPI_STALL_EN__CI__VI) || + (ttCfgRegs_.ttRegMask.bits.REG_STALL_EN__CI__VI) || + (ttCfgRegs_.ttRegTokenMask.bits.REG_DROP_ON_STALL__CI__VI)) { + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_HIWATER__VI, 0x06); + } + + // Iterate through the list of SE's and program the register + // for carrying address of thread trace buffer which is aligned + // to 4KB per thread trace specification + uint64_t baseAddr = 0; + for (int idx = 0; idx < numSE_; idx++) { + // Program Grbm to direct writes to one SE + grbm_gfx_index.bitfields.SH_INDEX = 0; + grbm_gfx_index.bitfields.SE_INDEX = idx; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 0; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX__CI__VI, grbm_gfx_index.u32All); + + // Program base2 address of buffer to use for thread trace + // Encodes ATC bit, so the correct way to program is to use + // ATC Bit property of the device + /* + regSQ_THREAD_TRACE_BASE2__CI__VI sqttBase2 = {}; + sqttBase2.u32All = 0; + sqttBase2.bits.ATC = 0; + sqttBase2.bits.ADDR_HI = 0; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, + mmSQ_THREAD_TRACE_BASE2__VI, + sqttBase2.u32All); + */ + + // Program the base address to use + baseAddr = devMemList_[idx] >> TT_BUFF_ALIGN_SHIFT; + + // Program base address of buffer to use for thread trace + regSQ_THREAD_TRACE_BASE sqttBase = {}; + sqttBase.bits.ADDR = Low32(baseAddr); + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_BASE__VI, sqttBase.u32All); + + // Program the size of thread trace buffer + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_SIZE__VI, + ttCfgRegs_.ttRegSize.u32All); + + // Program the thread trace ctrl register + regSQ_THREAD_TRACE_CTRL sqttCtrl = {}; + sqttCtrl.u32All = 0; + sqttCtrl.bits.RESET_BUFFER = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_CTRL__VI, sqttCtrl.u32All); + } + + // Reset the GRBM to broadcast mode + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX__CI__VI, grbm_gfx_index.u32All); + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Program the thread trace mode register + ttCfgRegs_.ttRegMode.bits.MODE = SQ_THREAD_TRACE_MODE_ON; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_MODE__VI, + ttCfgRegs_.ttRegMode.u32All); + ttCfgRegs_.ttRegMode.bits.MODE = SQ_THREAD_TRACE_MODE_OFF; + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + return; +} + +void Gfx8ThreadTrace::StopSession(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter) { + // Program Grbm to broadcast messages to all shader engines + regGRBM_GFX_INDEX grbm_gfx_index; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX__CI__VI, grbm_gfx_index.u32All); + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Program the thread trace mode register to disable thread trace + // The MODE register is set to disable thread trace by default + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_MODE__VI, + ttCfgRegs_.ttRegMode.u32All); + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Iterate through the list of SE's and read the Status, Counter and + // Write Pointer registers of Thread Trace subsystem + uint64_t baseAddr = 0; + for (int idx = 0; idx < numSE_; idx++) { + // Program Grbm to direct writes to one SE + grbm_gfx_index.bitfields.SH_INDEX = 0; + grbm_gfx_index.bitfields.SE_INDEX = idx; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 0; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX__CI__VI, grbm_gfx_index.u32All); + + // Issue WaitRegMem command to wait until SQTT event has completed + bool funcEq = false; + bool memSpace = false; + uint32_t waitVal = 0x01; + uint32_t maskVal = 0x40000000L; + uint32_t statusOffset = mmSQ_THREAD_TRACE_STATUS__VI - UCONFIG_SPACE_START__CI__VI; + cmdWriter->BuildWaitRegMemCommand(cmdBuff, memSpace, statusOffset, funcEq, maskVal, waitVal); + + // Retrieve the values from various status registers + cmdWriter->BuildCopyDataPacket(cmdBuff, COPY_DATA_SEL_SRC_SYS_PERF_COUNTER, + mmSQ_THREAD_TRACE_STATUS__VI, 0, + ttStatus_ + ((TT_STATUS_IDX_MAX * idx) + TT_STATUS_IDX_STATUS), + COPY_DATA_SEL_COUNT_1DW, true); + + cmdWriter->BuildCopyDataPacket(cmdBuff, COPY_DATA_SEL_SRC_SYS_PERF_COUNTER, + mmSQ_THREAD_TRACE_CNTR, 0, + ttStatus_ + ((TT_STATUS_IDX_MAX * idx) + TT_STATUS_IDX_CNTR), + COPY_DATA_SEL_COUNT_1DW, true); + + uint32_t wptrIdx = ((TT_STATUS_IDX_MAX * idx) + TT_STATUS_IDX_WPTR); + cmdWriter->BuildCopyDataPacket(cmdBuff, COPY_DATA_SEL_SRC_SYS_PERF_COUNTER, + mmSQ_THREAD_TRACE_WPTR__VI, 0, ttStatus_ + wptrIdx, + COPY_DATA_SEL_COUNT_1DW, true); + } + + // Reset the GRBM to broadcast mode + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX__CI__VI, grbm_gfx_index.u32All); + + // Initialize cache flush request object + FlushCacheOptions flush; + flush.l1 = true; + flush.l2 = true; + flush.icache = true; + flush.kcache = true; + cmdWriter->BuildFlushCacheCmd(cmdBuff, &flush, NULL, 0); + + // Program the size of thread trace buffer + regSQ_THREAD_TRACE_SIZE ttRegSize = {0}; + ttRegSize.u32All = 0; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_SIZE__VI, ttRegSize.u32All); + + // Program the thread trace ctrl register + regSQ_THREAD_TRACE_CTRL sqttCtrl = {}; + sqttCtrl.u32All = 0; + sqttCtrl.bits.RESET_BUFFER = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_CTRL__VI, sqttCtrl.u32All); + + // Program the compute_thread_trace_enable register + /* + regCOMPUTE_THREAD_TRACE_ENABLE__CI__VI disableTT = {0}; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, + mmCOMPUTE_THREAD_TRACE_ENABLE__CI__VI, + disableTT.u32All); + */ + + // Disable RLC Perfmon Clock Gating + // On Vega this is needed to collect Perf Cntrs + // cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmRLC_PERFMON_CLK_CNTL__VI, 0); + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + return; +} + +bool Gfx8ThreadTrace::Validate() { + // Iterate through the list of SE to verify + for (int idx = 0; idx < numSE_; idx++) { + // Determine if the buffer has wrapped + uint32_t statusIdx = ((TT_STATUS_IDX_MAX * idx) + TT_STATUS_IDX_STATUS); + if (ttStatus_[statusIdx] & 0x80000000) { + return false; + } + + // Adjust the value of Write Ptr which is bits [29-0] + uint32_t wptrIdx = ((TT_STATUS_IDX_MAX * idx) + TT_STATUS_IDX_WPTR); + ttStatus_[wptrIdx] = (ttStatus_[wptrIdx] & TT_WRITE_PTR_MASK); + } + + return true; +} + +} // pm4_profile diff --git a/runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.h b/runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.h new file mode 100644 index 0000000000..fd3ca52da8 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/threadtrace/gfx8_thread_trace.h @@ -0,0 +1,101 @@ +#ifndef _GFX8_THREAD_TRACE_H_ +#define _GFX8_THREAD_TRACE_H_ + +#include "gfxip/gfx8/si_ci_vi_merged_typedef.h" +#include "gfxip/gfx8/si_ci_vi_merged_offset.h" +#include "gfxip/gfx8/si_ci_vi_merged_enum.h" +#include "gfxip/gfx8/si_pm4defs.h" +#include "thread_trace.h" + +#include + +namespace pm4_profile { + +typedef struct Gfx8ThreadTraceCfgRegs { + // Size of thread trace buffer + regSQ_THREAD_TRACE_SIZE ttRegSize; + // Thread trace mode + regSQ_THREAD_TRACE_MODE ttRegMode; + // Thread trace wave mask + regSQ_THREAD_TRACE_MASK ttRegMask; + // Thread trace token mask + regSQ_THREAD_TRACE_TOKEN_MASK ttRegTokenMask; + // Thread trace token mask2 + regSQ_THREAD_TRACE_TOKEN_MASK2__VI ttRegTokenMask2; + // Thread trace perf mask + regSQ_THREAD_TRACE_PERF_MASK ttRegPerfMask; +} Gfx8ThreadTraceCfgRegs; + +// Encapsulates the various Api and structures used to enable a thread +// trace session and collect its data +class Gfx8ThreadTrace : public ThreadTrace { + public: + Gfx8ThreadTrace(); + + ~Gfx8ThreadTrace(); + + // Initializes various data structures and handles that + // are needed to support a thread trace session + bool Init(const ThreadTraceConfig* config); + + // Builds Pm4 command stream to program hardware registers that + // enable a thread trace session, including the issue of an event + // to begin thread session + void BeginSession(pm4_profile::DefaultCmdBuf* cmdBuff, pm4_profile::CommandWriter* cmdWriter); + + // Builds Pm4 command stream to program hardware registers that + // disable a thread trace session, including the issue of an event + // to stop currently ongoing thread session + void StopSession(pm4_profile::DefaultCmdBuf* cmdBuff, pm4_profile::CommandWriter* cmdWriter); + + // Validates that thread trace session ran correctly i.e. did not + // encounter any errors. + bool Validate(); + + // Initializes the handle of buffer used to collect SQTT data + void setSqttDataBuff(uint8_t* sqttBuffer, uint32_t sqttBuffSz); + + // Initializes the handle of buffer used to read control data of SQTT + void setSqttCtrlBuff(uint32_t* ctrlBuff) { ttStatus_ = ctrlBuff; } + + // Return status info size + uint32_t StatusSizeInfo() const { return TT_STATUS_IDX_MAX * sizeof(uint32_t) * numSE_; } + + // Return number of Shader Engines + uint32_t getNumSe() { return numSE_; } + + private: + // Holds number of Shader Engines present on device + uint32_t numSE_; + + // Thread traces status register indices to determine + // status of thread trace run + typedef enum { + TT_STATUS_IDX_STATUS = 0, + TT_STATUS_IDX_CNTR = 1, + TT_STATUS_IDX_WPTR = 2, + TT_STATUS_IDX_MAX = 3 + } TTStatusReg; + + // A list of tuples of TT_STATUS_IDX_MAX size, + // giving status of thread trace + uint32_t* ttStatus_; + + // Size of thread trace buffer per shader engine + uint32_t ttBuffSize_; + + // Handles of Device memory used for thread trace + std::vector devMemList_; + + // Registers that need to be programmed for Thread Trace + Gfx8ThreadTraceCfgRegs ttCfgRegs_; + + // Initializes thread trace registers with default parameters. + // These are potentially updated based on updates to thread trace + // configuration object by user + void InitThreadTraceCfgRegs(); +}; + +} // pm4_profile + +#endif // _GFX8_THREAD_TRACE_H_ diff --git a/runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.cpp b/runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.cpp new file mode 100644 index 0000000000..2b344cf42a --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.cpp @@ -0,0 +1,356 @@ + +#include +#include +#include +#include +#include + +#include "core/util/os.h" +#include "gfx9_thread_trace.h" + +/// @brief Returns the lower 32-bits of a value +inline uint32_t Low32(uint64_t u) { return (u & 0xFFFFFFFFUL); } + +/// @brief Returns the upper 32-bits of a value +inline uint32_t High32(uint64_t u) { return (u >> 32); } + +namespace pm4_profile { + +Gfx9ThreadTrace::Gfx9ThreadTrace() { + // Initialize the number of shader engines + numSE_ = 4; +} + +Gfx9ThreadTrace::~Gfx9ThreadTrace() {} + +bool Gfx9ThreadTrace::Init(const ThreadTraceConfig* config) { + // Initialize SQTT Configuration and Register objects + if (!ThreadTrace::Init(config)) return false; + InitThreadTraceCfgRegs(); + return true; +} + +void Gfx9ThreadTrace::InitThreadTraceCfgRegs() { + // Indicates the size of buffer to use per Shader Engine instance. + // The size is specified in terms of 4KB blocks + ttCfgRegs_.ttRegSize.u32All = 0; + + // Indicates various attributes of a thread trace session. + // + // MASK_CS: Which shader types should be enabled for data collection + // Enable CS Shader types. + // + // WRAP: How trace buffer should be used as a ring buffer or as a linear + // buffer - Disable WRAP mode i.e use it as a linear buffer + // + // MODE: Enables a thread trace session + // + // CAPTURE_MODE: When thread trace data is collected immediately after MODE + // is enabled or wait until a Thread Trace Start event is received + // + // AUTOFLUSH_EN: Flush thread trace data to buffer often automatically + // + ttCfgRegs_.ttRegMode.u32All = 0; + ttCfgRegs_.ttRegMode.bits.WRAP = 0; + ttCfgRegs_.ttRegMode.bits.CAPTURE_MODE = 0; + ttCfgRegs_.ttRegMode.bits.MASK_CS = 1; + ttCfgRegs_.ttRegMode.bits.AUTOFLUSH_EN = 1; + ttCfgRegs_.ttRegMode.bits.MODE = SQ_THREAD_TRACE_MODE_OFF; + + // Enable Thread Trace for all VM Id's + // Enable all of the SIMD's of the compute unit + // Enable Compute Unit (CU) at index Zero to be used for fine-grained data + // Enable Shader Array (SH) at index Zero to be used for fine-grained data + // + // @note: Not enabling REG_STALL_EN, SPI_STALL_EN and SQ_STALL_EN bits. They + // are useful if we wish to program buffer throttling. + // + ttCfgRegs_.ttRegMask.u32All = 0; + ttCfgRegs_.ttRegMask.bits.SH_SEL = 0x0; + ttCfgRegs_.ttRegMask.bits.SIMD_EN = 0xF; + ttCfgRegs_.ttRegMask.bits.CU_SEL = SetCuId(); + ttCfgRegs_.ttRegMask.bits.SQ_STALL_EN = 0x1; + ttCfgRegs_.ttRegMask.bits.SPI_STALL_EN = 0x1; + ttCfgRegs_.ttRegMask.bits.REG_STALL_EN = 0x1; + ttCfgRegs_.ttRegMask.bits.VM_ID_MASK = SetVmId(); + + // Override Mask value if a user value is available + uint32_t ttMask = SetMask(); + if (ttMask) { + ttCfgRegs_.ttRegMask.u32All = ttMask; + } + + // Mask of compute units to get thread trace data from + ttCfgRegs_.ttRegPerfMask.u32All = 0; + ttCfgRegs_.ttRegPerfMask.bits.SH0_MASK = 0xFFFF; + ttCfgRegs_.ttRegPerfMask.bits.SH1_MASK = 0xFFFF; + + // Indicate the different TT messages/tokens that should be enabled/logged + // Indicate the different TT tokens that specify register operations to be logged + ttCfgRegs_.ttRegTokenMask.u32All = 0; + ttCfgRegs_.ttRegTokenMask.bits.REG_MASK = 0xFF; + ttCfgRegs_.ttRegTokenMask.bits.TOKEN_MASK = 0xFFFF; + ttCfgRegs_.ttRegTokenMask.bits.REG_DROP_ON_STALL = 0x1; + + // Override TokenMask1 value if a user value is available + uint32_t tokenMask1 = SetTokenMask(); + if (tokenMask1) { + ttCfgRegs_.ttRegTokenMask.u32All = tokenMask1; + } + + // Indicate the different TT tokens that specify instruction operations to be logged + // Disabling specifically instruction operations updating Program Counter (PC). + // @note: The field is defined in the spec incorrectly as a 16-bit value + ttCfgRegs_.ttRegTokenMask2.u32All = 0; + ttCfgRegs_.ttRegTokenMask2.bits.INST_MASK = 0xFFFFFF7F; + + // Override TokenMask2 value if a user value is available + uint32_t tokenMask2 = SetTokenMask2(); + if (tokenMask2) { + ttCfgRegs_.ttRegTokenMask2.u32All = tokenMask2; + } +} + +void Gfx9ThreadTrace::setSqttDataBuff(uint8_t* sqttBuffer, uint32_t sqttBuffSz) { + // Compute the size of buffer available for each shader engine + ttBuffSize_ = sqttBuffSz / numSE_; + + // Populate the sqtt buffer array submitted to device + for (int idx = 0; idx < numSE_; idx++) { + uint64_t sqttSEAddr = uint64_t(sqttBuffer + (ttBuffSize_ * idx)); + devMemList_.push_back(sqttSEAddr); + } + + // Update the size bit-field of sqtt ctrl register + ttCfgRegs_.ttRegSize.bits.SIZE = ttBuffSize_ >> TT_BUFF_ALIGN_SHIFT; +} + +void Gfx9ThreadTrace::BeginSession(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter) { + // Program Grbm to broadcast messages to all shader engines + regGRBM_GFX_INDEX grbm_gfx_index; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX, grbm_gfx_index.u32All); + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Disable RLC Perfmon Clock Gating + // On Vega this is needed to collect Perf Cntrs + // cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmRLC_PERFMON_CLK_CNTL, 1); + + // Program the Compute register to indicate SQTT is enabled + /* + regCOMPUTE_THREAD_TRACE_ENABLE enableTT = {0}; + enableTT.bits.THREAD_TRACE_ENABLE = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, + mmCOMPUTE_THREAD_TRACE_ENABLE, + enableTT.u32All); + */ + + // Program the thread trace mask - specifies SH, CU, SIMD and + // VM Id masks to apply. Enabling SQ/SPI/REG_STALL_EN bits + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_MASK, + ttCfgRegs_.ttRegMask.u32All); + + // Program the thread trace Perf mask + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_PERF_MASK, + ttCfgRegs_.ttRegPerfMask.u32All); + + // Program the thread trace token mask + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_TOKEN_MASK, + ttCfgRegs_.ttRegTokenMask.u32All); + + // Program the thread trace token mask2 to specify the list of instruction + // tokens to record. Disabling INST_PC instruction tokens + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_TOKEN_MASK2, + ttCfgRegs_.ttRegTokenMask2.u32All); + + // Program the thread trace mode register + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_MODE, + ttCfgRegs_.ttRegMode.u32All); + + // Program the HiWaterMark register to support stalling + if ((ttCfgRegs_.ttRegMask.bits.SQ_STALL_EN) || (ttCfgRegs_.ttRegMask.bits.SPI_STALL_EN) || + (ttCfgRegs_.ttRegMask.bits.REG_STALL_EN) || + (ttCfgRegs_.ttRegTokenMask.bits.REG_DROP_ON_STALL)) { + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_HIWATER, 0x06); + } + + // Iterate through the list of SE's and program the register + // for carrying address of thread trace buffer which is aligned + // to 4KB per thread trace specification + uint64_t baseAddr = 0; + for (int idx = 0; idx < numSE_; idx++) { + // Program Grbm to direct writes to one SE + grbm_gfx_index.bitfields.SH_INDEX = 0; + grbm_gfx_index.bitfields.SE_INDEX = idx; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 0; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX, grbm_gfx_index.u32All); + + // Program base2 address of buffer to use for thread trace + /* + regSQ_THREAD_TRACE_BASE2 sqttBase2 = {}; + sqttBase2.u32All = 0; + sqttBase2.bits.ADDR_HI = 0; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, + mmSQ_THREAD_TRACE_BASE2, + sqttBase2.u32All); + */ + + // Program the base address to use + baseAddr = devMemList_[idx] >> TT_BUFF_ALIGN_SHIFT; + + // Program base address of buffer to use for thread trace + regSQ_THREAD_TRACE_BASE sqttBase = {}; + sqttBase.bits.ADDR = Low32(baseAddr); + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_BASE, sqttBase.u32All); + + // Program the size of thread trace buffer + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_SIZE, + ttCfgRegs_.ttRegSize.u32All); + + // Program the thread trace ctrl register + regSQ_THREAD_TRACE_CTRL sqttCtrl = {}; + sqttCtrl.u32All = 0; + sqttCtrl.bits.RESET_BUFFER = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_CTRL, sqttCtrl.u32All); + } + + // Reset the GRBM to broadcast mode + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX, grbm_gfx_index.u32All); + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Program the thread trace mode register + ttCfgRegs_.ttRegMode.bits.MODE = SQ_THREAD_TRACE_MODE_ON; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_MODE, + ttCfgRegs_.ttRegMode.u32All); + ttCfgRegs_.ttRegMode.bits.MODE = SQ_THREAD_TRACE_MODE_OFF; + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + return; +} + +void Gfx9ThreadTrace::StopSession(DefaultCmdBuf* cmdBuff, CommandWriter* cmdWriter) { + // Program Grbm to broadcast messages to all shader engines + regGRBM_GFX_INDEX grbm_gfx_index; + grbm_gfx_index.u32All = 0; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.INSTANCE_BROADCAST_WRITES = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX, grbm_gfx_index.u32All); + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Program the thread trace mode register to disable thread trace + // The MODE register is set to disable thread trace by default + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_MODE, + ttCfgRegs_.ttRegMode.u32All); + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + + // Iterate through the list of SE's and read the Status, Counter and + // Write Pointer registers of Thread Trace subsystem + uint64_t baseAddr = 0; + for (int idx = 0; idx < numSE_; idx++) { + // Program Grbm to direct writes to one SE + grbm_gfx_index.bitfields.SH_INDEX = 0; + grbm_gfx_index.bitfields.SE_INDEX = idx; + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 0; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 0; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX, grbm_gfx_index.u32All); + + // Issue WaitRegMem command to wait until SQTT event has completed + bool funcEq = false; + bool memSpace = false; + uint32_t waitVal = 0x01; + uint32_t maskVal = 0x40000000L; + uint32_t statusOffset = mmSQ_THREAD_TRACE_STATUS - UCONFIG_SPACE_START; + cmdWriter->BuildWaitRegMemCommand(cmdBuff, memSpace, statusOffset, funcEq, maskVal, waitVal); + + // Retrieve the values from various status registers + cmdWriter->BuildCopyDataPacket(cmdBuff, COPY_DATA_SEL_SRC_SYS_PERF_COUNTER, + mmSQ_THREAD_TRACE_STATUS, 0, + ttStatus_ + ((TT_STATUS_IDX_MAX * idx) + TT_STATUS_IDX_STATUS), + COPY_DATA_SEL_COUNT_1DW, true); + + cmdWriter->BuildCopyDataPacket(cmdBuff, COPY_DATA_SEL_SRC_SYS_PERF_COUNTER, + mmSQ_THREAD_TRACE_CNTR, 0, + ttStatus_ + ((TT_STATUS_IDX_MAX * idx) + TT_STATUS_IDX_CNTR), + COPY_DATA_SEL_COUNT_1DW, true); + + uint32_t wptrIdx = ((TT_STATUS_IDX_MAX * idx) + TT_STATUS_IDX_WPTR); + cmdWriter->BuildCopyDataPacket(cmdBuff, COPY_DATA_SEL_SRC_SYS_PERF_COUNTER, + mmSQ_THREAD_TRACE_WPTR, 0, ttStatus_ + wptrIdx, + COPY_DATA_SEL_COUNT_1DW, true); + } + + // Reset the GRBM to broadcast mode + grbm_gfx_index.bitfields.SH_BROADCAST_WRITES = 1; + grbm_gfx_index.bitfields.SE_BROADCAST_WRITES = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmGRBM_GFX_INDEX, grbm_gfx_index.u32All); + + // Initialize cache flush request object + FlushCacheOptions flush; + flush.l1 = true; + flush.l2 = true; + flush.icache = true; + flush.kcache = true; + cmdWriter->BuildFlushCacheCmd(cmdBuff, &flush, NULL, 0); + + // Program the size of thread trace buffer + regSQ_THREAD_TRACE_SIZE ttRegSize = {0}; + ttRegSize.u32All = 0; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_SIZE, ttRegSize.u32All); + + // Program the thread trace ctrl register + regSQ_THREAD_TRACE_CTRL sqttCtrl = {}; + sqttCtrl.u32All = 0; + sqttCtrl.bits.RESET_BUFFER = 1; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmSQ_THREAD_TRACE_CTRL, sqttCtrl.u32All); + + // Program the compute_thread_trace_enable register + /* + regCOMPUTE_THREAD_TRACE_ENABLE disableTT = {0}; + cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, + mmCOMPUTE_THREAD_TRACE_ENABLE, + disableTT.u32All); + */ + + // Disable RLC Perfmon Clock Gating + // On Vega this is needed to collect Perf Cntrs + // cmdWriter->BuildWriteUConfigRegPacket(cmdBuff, mmRLC_PERFMON_CLK_CNTL, 0); + + // Issue a CSPartialFlush cmd including cache flush + cmdWriter->BuildWriteWaitIdlePacket(cmdBuff); + return; +} + +bool Gfx9ThreadTrace::Validate() { + // Iterate through the list of SE to verify + for (int idx = 0; idx < numSE_; idx++) { + // Determine if the buffer has wrapped + uint32_t statusIdx = ((TT_STATUS_IDX_MAX * idx) + TT_STATUS_IDX_STATUS); + if (ttStatus_[statusIdx] & 0x80000000) { + return false; + } + + // Adjust the value of Write Ptr which is bits [29-0] + uint32_t wptrIdx = ((TT_STATUS_IDX_MAX * idx) + TT_STATUS_IDX_WPTR); + ttStatus_[wptrIdx] = (ttStatus_[wptrIdx] & TT_WRITE_PTR_MASK); + } + + return true; +} + +} // pm4_profile diff --git a/runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.h b/runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.h new file mode 100644 index 0000000000..86e0db8734 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/threadtrace/gfx9_thread_trace.h @@ -0,0 +1,104 @@ +#ifndef _GFX9_THREAD_TRACE_H_ +#define _GFX9_THREAD_TRACE_H_ + +#include "gfxip/gfx9/gfx9_registers.h" +#include "gfxip/gfx9/gfx9_typedef.h" +#include "gfxip/gfx9/gfx9_enum.h" +#include "gfxip/gfx9/gfx9_offset.h" +#include "gfxip/gfx9/gfx9_pm4defs.h" +#include "thread_trace.h" + +#include + +using namespace pm4_profile::gfx9; + +namespace pm4_profile { + +typedef struct Gfx9ThreadTraceCfgRegs { + // Size of thread trace buffer + regSQ_THREAD_TRACE_SIZE ttRegSize; + // Thread trace mode + regSQ_THREAD_TRACE_MODE ttRegMode; + // Thread trace wave mask + regSQ_THREAD_TRACE_MASK ttRegMask; + // Thread trace token mask + regSQ_THREAD_TRACE_TOKEN_MASK ttRegTokenMask; + // Thread trace token mask2 + regSQ_THREAD_TRACE_TOKEN_MASK2 ttRegTokenMask2; + // Thread trace perf mask + regSQ_THREAD_TRACE_PERF_MASK ttRegPerfMask; +} Gfx9ThreadTraceCfgRegs; + +// Encapsulates the various Api and structures used to enable a thread +// trace session and collect its data +class Gfx9ThreadTrace : public ThreadTrace { + public: + Gfx9ThreadTrace(); + + ~Gfx9ThreadTrace(); + + // Initializes various data structures and handles that + // are needed to support a thread trace session + bool Init(const ThreadTraceConfig* config); + + // Builds Pm4 command stream to program hardware registers that + // enable a thread trace session, including the issue of an event + // to begin thread session + void BeginSession(pm4_profile::DefaultCmdBuf* cmdBuff, pm4_profile::CommandWriter* cmdWriter); + + // Builds Pm4 command stream to program hardware registers that + // disable a thread trace session, including the issue of an event + // to stop currently ongoing thread session + void StopSession(pm4_profile::DefaultCmdBuf* cmdBuff, pm4_profile::CommandWriter* cmdWriter); + + // Validates that thread trace session ran correctly i.e. did not + // encounter any errors. + bool Validate(); + + // Initializes the handle of buffer used to collect SQTT data + void setSqttDataBuff(uint8_t* sqttBuffer, uint32_t sqttBuffSz); + + // Initializes the handle of buffer used to read control data of SQTT + void setSqttCtrlBuff(uint32_t* ctrlBuff) { ttStatus_ = ctrlBuff; } + + // Return status info size + uint32_t StatusSizeInfo() const { return TT_STATUS_IDX_MAX * sizeof(uint32_t) * numSE_; } + + // Return number of Shader Engines + uint32_t getNumSe() { return numSE_; } + + private: + // Holds number of Shader Engines present on device + uint32_t numSE_; + + // Thread traces status register indices to determine + // status of thread trace run + typedef enum { + TT_STATUS_IDX_STATUS = 0, + TT_STATUS_IDX_CNTR = 1, + TT_STATUS_IDX_WPTR = 2, + TT_STATUS_IDX_MAX = 3 + } TTStatusReg; + + // A list of tuples of TT_STATUS_IDX_MAX size, + // giving status of thread trace + uint32_t* ttStatus_; + + // Size of thread trace buffer per shader engine + uint32_t ttBuffSize_; + + // Handles of Device memory used for thread trace + std::vector devMemList_; + + // Registers that need to be programmed for Thread Trace + Gfx9ThreadTraceCfgRegs ttCfgRegs_; + + // Initializes thread trace registers with default parameters. + // These are potentially updated based on updates to thread trace + // configuration object by user + void InitThreadTraceCfgRegs(); +}; + +} // pm4_profile + +#endif // _GFX9_THREAD_TRACE_H_ diff --git a/runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.cpp b/runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.cpp new file mode 100644 index 0000000000..cb1e4ff643 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.cpp @@ -0,0 +1,105 @@ +#include + +#include "core/util/os.h" +#include "thread_trace.h" + +namespace pm4_profile { + +bool ThreadTrace::Init(const ThreadTraceConfig* config) { + if (config) { + ttConfig_ = *config; + } else { + InitThreadTraceConfig(&ttConfig_); + } + return true; +} + +void ThreadTrace::InitThreadTraceConfig(ThreadTraceConfig* config) const { + memset(config, 0, sizeof(ThreadTraceConfig)); + + config->threadTraceTargetCu = 0; + config->threadTraceVmIdMask = 0; + config->threadTraceMask = 0; + config->threadTraceTokenMask = 0; + config->threadTraceTokenMask2 = 0; +} + +uint8_t ThreadTrace::SetCuId() { + uint32_t cuId = ttConfig_.threadTraceTargetCu; + + // Allow users to specify the CU to choose for Target tokens + std::string var = os::GetEnvVar("HSA_THREAD_TRACE_SELECT_CU"); + if (var.length() > 0) { + cuId = std::stol(var, nullptr, 16); + std::cout << "Using " << cuId << " as CUID for Thread Trace" << std::endl; + } + + assert((cuId <= 15) && "Cu Id must be between 0 and 15"); + + return cuId; +} + +uint8_t ThreadTrace::SetVmId() { + uint32_t vmId = ttConfig_.threadTraceVmIdMask; + + // Allow users to specify the VMID to choose for Target tokens + std::string var = os::GetEnvVar("HSA_THREAD_TRACE_SELECT_VMID"); + if (var.length() > 0) { + vmId = std::stol(var, nullptr, 16); + std::cout << "Using " << vmId << " as VMID for Thread Trace" << std::endl; + } + + assert((vmId <= 2) && "VmId must be between 0 and 2"); + + return vmId; +} + +uint32_t ThreadTrace::SetMask() { + uint32_t ttMask = ttConfig_.threadTraceMask; + const uint32_t validMask = 0x00C0D0; + + // Allow users to specify the Mask to choose for configuration parameters + std::string var = os::GetEnvVar("HSA_THREAD_TRACE_SELECT_MASK"); + if (var.length() > 0) { + ttMask = std::stol(var, nullptr, 16); + std::cout << "Using " << ttMask << " as Mask for Thread Trace" << std::endl; + } + + assert(((ttMask & validMask) == 0) && "Mask should have bits [4,6,7] set to Zero"); + + return ttMask; +} + +uint32_t ThreadTrace::SetTokenMask() { + uint32_t tokenMask = ttConfig_.threadTraceTokenMask; + const uint32_t validMask = 0xFF000000; + + // Allow users to specify the TokenMask to choose for Target tokens + std::string var = os::GetEnvVar("HSA_THREAD_TRACE_SELECT_TOKEN_MASK1"); + if (var.length() > 0) { + tokenMask = std::stol(var, nullptr, 16); + std::cout << "Using " << tokenMask << " as TokenMask for Thread Trace" << std::endl; + } + + assert(((tokenMask & validMask) == 0) && "TokenMask should have bits [31:25] set to Zero"); + + return tokenMask; +} + +uint32_t ThreadTrace::SetTokenMask2() { + uint32_t tokenMask2 = ttConfig_.threadTraceTokenMask2; + const uint32_t validMask = 0xFFFF0000; + + // Allow users to specify the TokenMask2 to choose for Target tokens + std::string var = os::GetEnvVar("HSA_THREAD_TRACE_SELECT_TOKEN_MASK2"); + if (var.length() > 0) { + tokenMask2 = std::stol(var, nullptr, 16); + std::cout << "Using " << tokenMask2 << " as TokenMask2 for Thread Trace" << std::endl; + } + + assert(((tokenMask2 & validMask) == 0) && "TokenMask2 should have bits [31:16] set to Zero"); + + return tokenMask2; +} + +} // pm4_profile diff --git a/runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.h b/runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.h new file mode 100644 index 0000000000..0c1dd1161b --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/threadtrace/thread_trace.h @@ -0,0 +1,104 @@ +#ifndef _THREAD_TRACE_H_ +#define _THREAD_TRACE_H_ + +#include + +#include "cmdwriter.h" + +// Move them as static variables later on +#define TT_WRITE_PTR_MASK (0x3FFFFFFF) +#define TT_DEFAULT_BUFF_SIZE_SCALE (16) +#define TT_DEFAULT_BUFF_SIZE (1024 * 1024 * 8) + +// Size of block in bytesper increment in WPTR +#define TT_WRITE_PTR_BLK (32) + +// Factor by which to shift buffer address +#define TT_BUFF_ALIGN_SHIFT (12) + +// Align address to 64 Kilobytes +#define TT_BUFF_ADDR_ALIGN (0x10000) + +namespace pm4_profile { + +// ThreadTrace config +typedef struct ThreadTraceConfig { + uint32_t threadTraceTargetCu; + uint32_t threadTraceVmIdMask; + uint32_t threadTraceMask; + uint32_t threadTraceTokenMask; + uint32_t threadTraceTokenMask2; +} ThreadTraceConfig; + +// Encapsulates the various Api and structures that are used to enable +// a thread trace session and collect its data. Implementations of this +// interface program device specific registers to realize the functionality +class ThreadTrace { + // Holds Thread Trace configuration information + // @note: Currently not used i.e. is not exposed to users + ThreadTraceConfig ttConfig_; + + public: + // Destructor of the thread trace service handle + virtual ~ThreadTrace(){}; + + // Obtain the CU id to use for thread tracing + uint8_t SetCuId(); + + // Obtain the VM id to use for thread tracing + uint8_t SetVmId(); + + // Obtain the Mask to use for thread tracing + uint32_t SetMask(); + + // Obtain the Token Mask 1 to use for thread tracing + uint32_t SetTokenMask(); + + // Obtain the Token Mask 2 to use for thread tracing + uint32_t SetTokenMask2(); + + // Initializes various data structures and handles that + // are needed to support a thread trace session + virtual bool Init(const ThreadTraceConfig* config); + + // Initializes thread trace configuration object with default + // parameters, that could potentially be overriden by user + // @note: Currently not used i.e. is not exposed to users + virtual void InitThreadTraceConfig(ThreadTraceConfig* config) const; + + // Allows user to configure various parameters of a thread trace session + // @note: Currently not used i.e. is not exposed to users + bool Config(uint32_t key, uint32_t value) { return true; }; + + // Builds Pm4 command stream to program hardware registers that + // enable a thread trace session, including the issue of an event + // to begin thread session + virtual void BeginSession(pm4_profile::DefaultCmdBuf* cmdBuff, + pm4_profile::CommandWriter* cmdWriter) = 0; + + // Builds Pm4 command stream to program hardware registers that + // disable a thread trace session, including the issue of an event + // to stop currently ongoing thread session + virtual void StopSession(pm4_profile::DefaultCmdBuf* cmdBuff, + pm4_profile::CommandWriter* cmdWriter) = 0; + + // Validates that thread trace session ran correctly i.e. did not + // encounter any errors. + virtual bool Validate() = 0; + + // Initializes the handle of buffer used to collect SQTT data + virtual void setSqttDataBuff(uint8_t* sqttBuffer, uint32_t sqttBuffSz) = 0; + + // Initializes the handle of buffer used to read control data of SQTT + virtual void setSqttCtrlBuff(uint32_t* ctrlBuff) = 0; + + // Return number of Shader Engines + virtual uint32_t getNumSe() = 0; + + // Return status info size + virtual uint32_t StatusSizeInfo() const = 0; +}; + +} // pm4_profile + +#endif // _THREAD_TRACE_H_ diff --git a/runtime/hsa-ext-aql-profile/src/util/CMakeLists.txt b/runtime/hsa-ext-aql-profile/src/util/CMakeLists.txt new file mode 100644 index 0000000000..38664f65a3 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/src/util/CMakeLists.txt @@ -0,0 +1,17 @@ +# +# Source files for Rocr Utils library +# +set ( MODULE_SRC ${CORE_UTIL_DIR}/lnx/os_linux.cpp ) + +# +# Header files include path(s). +# +include_directories ( $ENV{ROCR_INC_DIR} ) +include_directories ( ${HSA_RUNTIME_OSC_DIR} ) +include_directories ( ${CORE_UTIL_DIR} ) + +# +# Build Utils as a Static Library object +# +add_library( ${UTIL_LIB} STATIC ${MODULE_SRC} ) +target_link_libraries( ${UTIL_LIB} c stdc++ dl pthread rt ) diff --git a/runtime/hsa-ext-aql-profile/test/CMakeLists.txt b/runtime/hsa-ext-aql-profile/test/CMakeLists.txt new file mode 100644 index 0000000000..f310202398 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/CMakeLists.txt @@ -0,0 +1,48 @@ +# +# Header files include path(s). +# +include_directories ( $ENV{ROCR_INC_DIR} ) +include_directories ( ${API_DIR} ) +include_directories ( ${PROJ_DIR}/cmdwriter ) +include_directories ( ${PROJ_DIR}/perfcounter ) +include_directories ( ${PROJ_DIR}/threadtrace ) +include_directories ( ${PROJ_DIR}/aqlprofile ) +include_directories ( ${TEST_DIR}/common ) +include_directories ( ${TEST_DIR}/ctrl ) +include_directories ( ${CORE_UTIL_DIR} ) + +# +# Specify the directory containing the libraries of HsaRt +# to be linked against for building a Hsa Perf application +# +LINK_DIRECTORIES($ENV{ROCR_LIB_DIR}) +find_library ( ROCR_LIB NAMES hsa-runtime64 PATHS $ENV{ROCR_LIB_DIR} ) + +# +# Set Name for Common library and build it as a +# static library to be linked with others +# +set ( COMMON_LIB "common${ONLY64STR}" ) +add_subdirectory ( ${TEST_DIR}/common "${PROJECT_BINARY_DIR}/common" ) + +# +# Build the test library +# +set ( TEST_NAME simple_convolution ) +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} ) + +# +# Build the test control +# +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} ${COMMON_LIB} ${CORE_UTILS_LIB} ${ROCR_LIB} ${TARGET_LIB} ) +set ( EXE_NAME "ctrl" ) +add_executable ( ${EXE_NAME} ${SRC_LIST} ) +target_link_libraries( ${EXE_NAME} ${LIB_LIST} c stdc++ dl pthread rt ) diff --git a/runtime/hsa-ext-aql-profile/test/binary_search/binary_search.cc b/runtime/hsa-ext-aql-profile/test/binary_search/binary_search.cc new file mode 100755 index 0000000000..9d699abbc0 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/binary_search/binary_search.cc @@ -0,0 +1,876 @@ +/* + * ============================================================================= + * ROC Runtime Conformance Release License + * ============================================================================= + * The University of Illinois/NCSA + * Open Source License (NCSA) + * + * Copyright (c) 2017, Advanced Micro Devices, Inc. + * All rights reserved. + * + * Developed by: + * + * AMD Research and AMD ROC Software Development + * + * Advanced Micro Devices, Inc. + * + * www.amd.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal with the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimers. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimers in + * the documentation and/or other materials provided with the distribution. + * - Neither the names of , + * nor the names of its contributors may be used to endorse or promote + * products derived from this Software without specific prior written + * permission. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS WITH THE SOFTWARE. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "hsa/hsa.h" +#include "hsa/hsa_ext_amd.h" + +#define RET_IF_HSA_ERR(err) { \ + if ((err) != HSA_STATUS_SUCCESS) { \ + std::cout << "hsa api call failure at line " << __LINE__ << ", file: " << \ + __FILE__ << ". Call returned " << err << std::endl; \ + return (err); \ + } \ +} + +static const uint32_t kBinarySearchLength = 512; +static const uint32_t kBinarySearchFindMe = 108; +static const uint32_t kWorkGroupSize = 256; + +// Hold all the info specific to binary search +typedef struct BinarySearch { + // Binary Search parameters + uint32_t length; + uint32_t work_group_size; + uint32_t work_grid_size; + uint32_t num_sub_divisions; + uint32_t find_me; + + // Buffers needed for this application + uint32_t* input; + uint32_t* input_arr; + uint32_t* input_arr_local; + uint32_t* output; + // Keneral argument buffers and addresses + void* kern_arg_buffer; // Begin of allocated memory + // this pointer to be deallocated + void* kern_arg_address; // Properly aligned address to be used in aql + // packet (don't use for deallocation) + + // Kernel code + std::string kernel_file_name; + std::string kernel_name; + uint32_t kernarg_size; + uint32_t kernarg_align; + + // HSA/RocR objects needed for this application + hsa_agent_t gpu_dev; + hsa_agent_t cpu_dev; + hsa_signal_t signal; + hsa_queue_t* queue; + hsa_amd_memory_pool_t cpu_pool; + hsa_amd_memory_pool_t gpu_pool; + hsa_amd_memory_pool_t kern_arg_pool; + + // Other items we need to populate AQL packet + uint64_t kernel_object; + uint32_t group_segment_size; ///< Kernel group seg size + uint32_t private_segment_size; ///< Kernel private seg size +} BinarySearch; + +void InitializeBinarySearch(BinarySearch* bs) { + bs->kernel_file_name = "./binary_search_kernels.hsaco"; + bs->kernel_name = "binarySearch"; + bs->length = 512; + bs->find_me = 108; + bs->work_group_size = 256; + bs->num_sub_divisions = bs->length / bs->work_group_size; +} + +// This function is called by the call-back functions used to find an agent of +// the specified hsa_device_type_t. Note that it cannot be called directly from +// hsa_iterate_agents() as it does not match the prototype of the call-back +// function. It must be wrapped by a function with the correct prototype. +// +// Return values: +// HSA_STATUS_INFO_BREAK -- "agent" is of the specified type (dev_type) +// HSA_STATUS_SUCCESS -- "agent" is not of the specified type +// Other -- Some error occurred +static hsa_status_t FindAgent(hsa_agent_t agent, void* data, + hsa_device_type_t dev_type) { + if (data == nullptr) { + return HSA_STATUS_ERROR_INVALID_ARGUMENT; + } + + // See if the provided agent matches the input type (dev_type) + hsa_device_type_t hsa_device_type; + hsa_status_t hsa_error_code = hsa_agent_get_info(agent, HSA_AGENT_INFO_DEVICE, + &hsa_device_type); + RET_IF_HSA_ERR(hsa_error_code); + + if (hsa_device_type == dev_type) { + *(reinterpret_cast(data)) = agent; + return HSA_STATUS_INFO_BREAK; + } + + return HSA_STATUS_SUCCESS; +} + +// This is the call-back function used to find a GPU type agent. Note that the +// prototype of this function is dictated by the HSA specification +hsa_status_t FindGPUDevice(hsa_agent_t agent, void* data) { + return FindAgent(agent, data, HSA_DEVICE_TYPE_GPU); +} + +// This is the call-back function used to find a CPU type agent. Note that the +// prototype of this function is dictated by the HSA specification +hsa_status_t FindCPUDevice(hsa_agent_t agent, void* data) { + return FindAgent(agent, data, HSA_DEVICE_TYPE_CPU); +} + +// Find the CPU and GPU agents we need to run this sample, and save them in the +// BinarySearch structure for later use. +hsa_status_t FindDevices(BinarySearch* bs) { + hsa_status_t err; + + // Note that hsa_iterate_agents iterate through all known agents until + // HSA_STATUS_SUCCESS is not returned. The call-backs are implemented such + // that HSA_STATUS_INFO_BREAK means we found an agent of the specified type. + // This value is returned by hsa_iterate_agents. + bs->gpu_dev.handle = 0; + err = hsa_iterate_agents(FindGPUDevice, &bs->gpu_dev); + + if (err != HSA_STATUS_INFO_BREAK) { + return HSA_STATUS_ERROR; + } + + bs->cpu_dev.handle = 0; + err = hsa_iterate_agents(FindCPUDevice, &bs->cpu_dev); + + if (err != HSA_STATUS_INFO_BREAK) { + return HSA_STATUS_ERROR; + } + + if (0 == bs->gpu_dev.handle) { + std::cout << "GPU Device is not Created properly!" << std::endl; + RET_IF_HSA_ERR(HSA_STATUS_ERROR); + } + + if (0 == bs->cpu_dev.handle) { + std::cout << "CPU Device is not Created properly!" << std::endl; + RET_IF_HSA_ERR(HSA_STATUS_ERROR); + } + + return HSA_STATUS_SUCCESS; +} + +// This function checks to see if the provided +// pool has the HSA_AMD_SEGMENT_GLOBAL property. If the kern_arg flag is true, +// the function adds an additional requirement that the pool have the +// HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_KERNARG_INIT property. If kern_arg is false, +// pools must NOT have this property. +// Upon finding a pool that meets these conditions, HSA_STATUS_INFO_BREAK is +// returned. HSA_STATUS_SUCCESS is returned if no errors were encountered, but +// no pool was found meeting the requirements. If an error is encountered, we +// return that error. + +// Note that this function does not match the required prototype for the +// hsa_amd_agent_iterate_memory_pools call back function, and therefore must be +// wrapped by a function with the correct prototype. +static hsa_status_t +FindGlobalPool(hsa_amd_memory_pool_t pool, void* data, bool kern_arg) { + hsa_status_t err; + hsa_amd_segment_t segment; + uint32_t flag; + + if (nullptr == data) { + return HSA_STATUS_ERROR_INVALID_ARGUMENT; + } + + err = hsa_amd_memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_SEGMENT, + &segment); + RET_IF_HSA_ERR(err); + + if (HSA_AMD_SEGMENT_GLOBAL != segment) { + return HSA_STATUS_SUCCESS; + } + + err = hsa_amd_memory_pool_get_info(pool, + HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS, &flag); + RET_IF_HSA_ERR(err); + + uint32_t karg_st = flag & HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_KERNARG_INIT; + + if ((karg_st == 0 && kern_arg) || + (karg_st != 0 && !kern_arg)) { + return HSA_STATUS_SUCCESS; + } + + *(reinterpret_cast(data)) = pool; + return HSA_STATUS_INFO_BREAK; +} + +// This is the call-back function for hsa_amd_agent_iterate_memory_pools() that +// finds a pool with the properties of HSA_AMD_SEGMENT_GLOBAL and that is NOT +// HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_KERNARG_INIT +hsa_status_t FindStandardPool(hsa_amd_memory_pool_t pool, void* data) { + return FindGlobalPool(pool, data, false); +} + +// This is the call-back function for hsa_amd_agent_iterate_memory_pools() that +// finds a pool with the properties of HSA_AMD_SEGMENT_GLOBAL and that IS +// HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_KERNARG_INIT +hsa_status_t FindKernArgPool(hsa_amd_memory_pool_t pool, void* data) { + return FindGlobalPool(pool, data, true); +} + +// Find memory pools that we will need to allocate from for this sample +// application. We will need memory associated with the host CPU, the GPU +// executing the kernels, and for kernel arguments. This function will +// save the found pools to the BinarySearch structure for use elsewhere +// in this program. +hsa_status_t FindPools(BinarySearch* bs) { + hsa_status_t err; + + err = hsa_amd_agent_iterate_memory_pools(bs->cpu_dev, FindStandardPool, + &bs->cpu_pool); + + if (err != HSA_STATUS_INFO_BREAK) { + return HSA_STATUS_ERROR; + } + + err = hsa_amd_agent_iterate_memory_pools(bs->gpu_dev, FindStandardPool, + &bs->gpu_pool); + + if (err != HSA_STATUS_INFO_BREAK) { + return HSA_STATUS_ERROR; + } + + err = hsa_amd_agent_iterate_memory_pools(bs->cpu_dev, + FindKernArgPool, &bs->kern_arg_pool); + + if (err != HSA_STATUS_INFO_BREAK) { + return HSA_STATUS_ERROR; + } + + return HSA_STATUS_SUCCESS; +} + +// Once the needed memory pools have been found and the BinarySearch structure +// has been updated with these handles, this function is then used to allocate +// memory from those pools. +// Devices with which a pool is associated already have access to the pool. +// However, other devices may also need to read or write to that memory. Below, +// we see how we can grant access to other devices to address this issue. +hsa_status_t AllocateAndInitBuffers(BinarySearch* bs) { + hsa_status_t err; + uint32_t out_length = 4 * sizeof(uint32_t); + uint32_t in_length = bs->num_sub_divisions * 2 * sizeof(uint32_t); + + // In all of these examples, we want both the cpu and gpu to have access to + // the buffer in question. We use the array of agents below in the susequent + // calls to hsa_amd_agents_allow_access() for this purpose. + hsa_agent_t ag_list[2] = {bs->gpu_dev, bs->cpu_dev}; + + err = hsa_amd_memory_pool_allocate(bs->cpu_pool, in_length, 0, + reinterpret_cast(&bs->input)); + RET_IF_HSA_ERR(err); + err = hsa_amd_agents_allow_access(2, ag_list, NULL, bs->input); + RET_IF_HSA_ERR(err); + (void)memset(bs->input, 0, in_length); + + err = hsa_amd_memory_pool_allocate(bs->cpu_pool, out_length, 0, + reinterpret_cast(&bs->output)); + RET_IF_HSA_ERR(err); + err = hsa_amd_agents_allow_access(2, ag_list, NULL, bs->output); + RET_IF_HSA_ERR(err); + (void)memset(bs->input, 0, in_length); + + err = hsa_amd_memory_pool_allocate(bs->cpu_pool, in_length, 0, + reinterpret_cast(&bs->input_arr)); + RET_IF_HSA_ERR(err); + err = hsa_amd_agents_allow_access(2, ag_list, NULL, bs->input_arr); + RET_IF_HSA_ERR(err); + (void)memset(bs->input, 0, in_length); + + err = hsa_amd_memory_pool_allocate(bs->cpu_pool, in_length, 0, + reinterpret_cast(&bs->input_arr_local)); + RET_IF_HSA_ERR(err); + err = hsa_amd_agents_allow_access(2, ag_list, NULL, bs->input_arr_local); + RET_IF_HSA_ERR(err); + + // Binary-search application specific code... + // Initialize input buffer with random values in an increasing order + uint32_t max = bs->length * 20; + bs->input[0] = 0; + + uint32_t seed = (unsigned int)time(NULL); + srand(seed); + + for (uint32_t i = 1; i < bs->length; ++i) { + bs->input[i] = bs->input[i - 1] + + static_cast(max * rand_r(&seed) / static_cast(RAND_MAX)); + } + +// #define VERBOSE 1 +#ifdef VERBOSE + std::cout << "Input array values:" << std::endl; + + for (uint32_t i = 0; i < bs->length; ++i) { + std::cout << "input[" << i << "] = " << bs->input[i] << " "; + + if (i % 4 == 0) { + std::cout << std::endl; + } + } + + std::cout << std::endl; +#endif + + return err; +} + +// The code in this function illustrates how to load a kernel from +// pre-compiled code. The goal is to get a handle that can be later +// used in an AQL packet and also to extract information about kernel +// that we will need. All of the information hand kernel handle will +// be saved to the BinarySearch structure. It will be used when we +// populate the AQL packet. +hsa_status_t LoadKernelFromObjFile(BinarySearch* bs) { + hsa_status_t err; + hsa_code_object_reader_t code_obj_rdr = {0}; + hsa_executable_t executable = {0}; + + hsa_file_t file_handle = open(bs->kernel_file_name.c_str(), O_RDONLY); + + if (file_handle == -1) { + std::cout << "failed to open " << bs->kernel_file_name.c_str() << + " at line " << __LINE__ << ", errno: " << errno << std::endl; + return HSA_STATUS_ERROR; + } + + err = hsa_code_object_reader_create_from_file(file_handle, &code_obj_rdr); + RET_IF_HSA_ERR(err); + close(file_handle); + + err = hsa_executable_create_alt(HSA_PROFILE_FULL, + HSA_DEFAULT_FLOAT_ROUNDING_MODE_DEFAULT, NULL, &executable); + RET_IF_HSA_ERR(err); + + err = hsa_executable_load_agent_code_object(executable, bs->gpu_dev, + code_obj_rdr, NULL, NULL); + RET_IF_HSA_ERR(err); + + err = hsa_executable_freeze(executable, NULL); + RET_IF_HSA_ERR(err); + + hsa_executable_symbol_t kern_sym; + err = hsa_executable_get_symbol(executable, NULL, bs->kernel_name.c_str(), + bs->gpu_dev, 0, &kern_sym); + RET_IF_HSA_ERR(err); + + err = hsa_executable_symbol_get_info(kern_sym, + HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_OBJECT, + &bs->kernel_object); + RET_IF_HSA_ERR(err); + + err = hsa_executable_symbol_get_info(kern_sym, + HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE, + &bs->private_segment_size); + RET_IF_HSA_ERR(err); + + err = hsa_executable_symbol_get_info(kern_sym, + HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_GROUP_SEGMENT_SIZE, + &bs->group_segment_size); + RET_IF_HSA_ERR(err); + + err = hsa_executable_symbol_get_info(kern_sym, + HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_SIZE, + &bs->kernarg_size); + RET_IF_HSA_ERR(err); + + err = hsa_executable_symbol_get_info(kern_sym, + HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_ALIGNMENT, + &bs->kernarg_align); + RET_IF_HSA_ERR(err); + + return err; +} + +// This function shows how to do an asynchronous copy. We have to create a +// signal and use the signal to notify us when the copy has completed. +hsa_status_t AgentMemcpy(void* dst, const void* src, + size_t size, hsa_agent_t dst_ag, hsa_agent_t src_ag) { + hsa_signal_t s; + hsa_status_t err; + + err = hsa_signal_create(1, 0, NULL, &s); + RET_IF_HSA_ERR(err); + + err = hsa_amd_memory_async_copy(dst, dst_ag, src, src_ag, size, 0, NULL, s); + RET_IF_HSA_ERR(err); + + if (hsa_signal_wait_scacquire(s, HSA_SIGNAL_CONDITION_LT, 1, + UINT64_MAX, HSA_WAIT_STATE_BLOCKED) != 0) { + err = HSA_STATUS_ERROR; + std::cout << "Async copy signal error" << std::endl; + + RET_IF_HSA_ERR(err); + } + + err = hsa_signal_destroy(s); + + RET_IF_HSA_ERR(err); + + return err; +} + +// AlignDown and AlignUp are 2 utility functions we use to find an aligned +// boundary either below or above a given value (address). The function will +// return a value that has the specified alignment. +static intptr_t +AlignDown(intptr_t value, size_t alignment) { + return (intptr_t) (value & ~(alignment - 1)); +} +static void* +AlignUp(void* value, size_t alignment) { + return reinterpret_cast(AlignDown((uintptr_t) + (reinterpret_cast(value) + alignment - 1), alignment)); +} + +// This function populates the AQL patch with the information +// we have collected and stored in the BinarySearch structure thus far. +void PopulateAQLPacket(BinarySearch const* bs, + hsa_kernel_dispatch_packet_t* aql) { + aql->header = 0; // Dummy val. for now. Set this right before doorbell ring + aql->setup = 1; + aql->workgroup_size_x = bs->work_group_size; + aql->workgroup_size_y = 1; + aql->workgroup_size_z = 1; + aql->grid_size_x = bs->work_grid_size; + aql->grid_size_y = 1; + aql->grid_size_z = 1; + aql->private_segment_size = bs->private_segment_size; + aql->group_segment_size = bs->group_segment_size; + aql->kernel_object = bs->kernel_object; + aql->kernarg_address = bs->kern_arg_address; + aql->completion_signal = bs->signal; + + return; +} +/* + * Write everything in the provided AQL packet to the queue except the first 32 + * bits which include the header and setup fields. That should be done + * last. + */ +void WriteAQLToQueue(hsa_kernel_dispatch_packet_t const* in_aql, + hsa_queue_t* q) { + void* queue_base = q->base_address; + const uint32_t queue_mask = q->size - 1; + uint64_t que_idx = hsa_queue_add_write_index_relaxed(q, 1); + + hsa_kernel_dispatch_packet_t* queue_aql_packet; + + queue_aql_packet = + &(reinterpret_cast(queue_base)) + [que_idx & queue_mask]; + + queue_aql_packet->workgroup_size_x = in_aql->workgroup_size_x; + queue_aql_packet->workgroup_size_y = in_aql->workgroup_size_y; + queue_aql_packet->workgroup_size_z = in_aql->workgroup_size_z; + queue_aql_packet->grid_size_x = in_aql->grid_size_x; + queue_aql_packet->grid_size_y = in_aql->grid_size_y; + queue_aql_packet->grid_size_z = in_aql->grid_size_z; + queue_aql_packet->private_segment_size = in_aql->private_segment_size; + queue_aql_packet->group_segment_size = in_aql->group_segment_size; + queue_aql_packet->kernel_object = in_aql->kernel_object; + queue_aql_packet->kernarg_address = in_aql->kernarg_address; + queue_aql_packet->completion_signal = in_aql->completion_signal; +} + +// This function allocates memory from the kern_arg pool we already found, and +// then sets the argument values needed by the kernel code. +hsa_status_t AllocAndSetKernArgs(BinarySearch* bs, void* args, + size_t arg_size, void** aql_buf_ptr) { + void* kern_arg_buf = nullptr; + hsa_status_t err; + size_t buf_size; + size_t req_align; + + // The kernel code must be written to memory at the correct alignment. We + // already queried the executable to get the correct alignment, which is + // stored in bs->kernarg_align. In case the memory returned from + // hsa_amd_memory_pool is not of the correct alignment, we request a little + // more than what we need in case we need to adjust. + req_align = bs->kernarg_align; + // Allocate enough extra space for alignment adjustments if ncessary + buf_size = arg_size + (req_align << 1); + + err = hsa_amd_memory_pool_allocate(bs->kern_arg_pool, buf_size, 0, + reinterpret_cast(&kern_arg_buf)); + RET_IF_HSA_ERR(err); + + // Address of the allocated buffer + bs->kern_arg_buffer = kern_arg_buf; + + // Addr. of kern arg start. + bs->kern_arg_address = AlignUp(kern_arg_buf, req_align); + + assert(arg_size >= bs->kernarg_size); + assert(((uintptr_t)bs->kern_arg_address + arg_size) < + ((uintptr_t)bs->kern_arg_buffer + buf_size)); + + (void)memcpy(bs->kern_arg_address, args, arg_size); + RET_IF_HSA_ERR(err); + + // Make sure both the CPU and GPU can access the kernel arguments + hsa_agent_t ag_list[2] = {bs->gpu_dev, bs->cpu_dev}; + err = hsa_amd_agents_allow_access(2, ag_list, NULL, bs->kern_arg_buffer); + RET_IF_HSA_ERR(err); + + // Save this info in our BinarySearch structure for later. + *aql_buf_ptr = bs->kern_arg_address; + + return HSA_STATUS_SUCCESS; +} + +// This wrapper atomically writes the provided header and setup to the +// provided AQL packet. The provided AQL packet address should be in the +// queue memory space. +inline void AtomicSetPacketHeader(uint16_t header, uint16_t setup, + hsa_kernel_dispatch_packet_t* queue_packet) { + __atomic_store_n(reinterpret_cast(queue_packet), + header | (setup << 16), __ATOMIC_RELEASE); +} + +// Once all the required data for kernel execution is collected (in this +// application it is stored in the BinarySearch structure) we can put it in +// an AQL packet and ring the queue door bell to tell the command processor to +// execute it. +hsa_status_t Run(BinarySearch* bs) { + hsa_status_t err; + + std::cout << "Executing kernel " << bs->kernel_name << std::endl; + + // Adjust the size of workgroup + // This is mostly application specific. + if (bs->work_group_size > 64) { + bs->work_group_size = 64; + bs->num_sub_divisions = bs->length / bs->work_group_size; + + if (bs->num_sub_divisions < bs->work_group_size) { + bs->num_sub_divisions = bs->work_group_size; + } + + bs->work_grid_size = bs->num_sub_divisions; + } + + // Explanation of BinarySearch algorithm. + /* + * Since a plain binary search on the GPU would not achieve much benefit + * over the GPU we are doing an N'ary search. We split the array into N + * segments every pass and therefore get log (base N) passes instead of log + * (base 2) passes. + * + * In every pass, only the thread that can potentially have the element we + * are looking for writes to the output array. For ex: if we are looking to + * find 4567 in the array and every thread is searching over a segment of + * 1000 values and the input array is 1, 2, 3, 4,... then the first thread + * is searching in 1 to 1000, the second one from 1001 to 2000, etc. The + * first one does not write to the output. The second one doesn't either. + * The fifth one however is from 4001 to 5000. So it can potentially have + * the element 4567 which lies between them. + * + * This particular thread writes to the output the lower bound, upper bound + * and whether the element equals the lower bound element. So, it would be + * 4001, 5000, 0 + * + * The next pass would subdivide 4001 to 5000 into smaller segments and + * continue the same process from there. + * + * When a pass returns 1 in the third element, it means the element has been + * found and we can stop executing the kernel. If the element is not found, + * then the execution stops after looking at segment of size 1. + */ + + uint32_t global_lower_bound = 0; + uint32_t global_upper_bound = bs->length - 1; + uint32_t sub_div_size = (global_upper_bound - global_lower_bound + 1) / + bs->num_sub_divisions; + + if ((bs->input[0] > bs->find_me) || + (bs->input[bs->length - 1] < bs->find_me)) { + bs->output[0] = 0; + bs->output[1] = bs->length - 1; + bs->output[2] = 0; + std::cout << "Returning too early" << std::endl; + return HSA_STATUS_SUCCESS; + } + + bs->output[3] = 1; + + // Setup the kernel args + // See the meta-data for the compiled OpenCL kernel code to ascertain + // the sizes, padding and alignment required for kernel arguments. + // This can be seen by executing + // $ amdgcn-amd-amdhsa-readelf -aw ./binary_search_kernels.hsaco + // The kernel code will expect the following arguments aligned as shown. + typedef uint32_t uint2[2]; + typedef uint32_t uint4[4]; + struct __attribute__((aligned(16))) local_args_t { + uint4* outputArray; + uint2* sortedArray; + uint32_t findMe; + uint32_t pad; + uint64_t global_offset_x; + uint64_t global_offset_y; + uint64_t global_offset_z; + } local_args; + + local_args.outputArray = reinterpret_cast(bs->output); + local_args.sortedArray = reinterpret_cast(bs->input_arr_local); + local_args.findMe = bs->find_me; + local_args.global_offset_x = 0; + local_args.global_offset_y = 0; + local_args.global_offset_z = 0; + + // Copy the kernel args structure into kernel arg memory + err = AllocAndSetKernArgs(bs, &local_args, sizeof(local_args), + &bs->kern_arg_address); + RET_IF_HSA_ERR(err); + + // Populate an AQL packet with the info we've gathered + hsa_kernel_dispatch_packet_t aql; + PopulateAQLPacket(bs, &aql); + + uint32_t in_length = bs->num_sub_divisions * 2 * sizeof(uint32_t); + + while ((sub_div_size > 1) && (bs->output[3] != 0)) { + for (uint32_t i = 0 ; i < bs->num_sub_divisions; i++) { + int idx1 = i * sub_div_size; + int idx2 = ((i + 1) * sub_div_size) - 1; + bs->input_arr[2 * i] = bs->input[idx1]; + bs->input_arr[2 * i + 1] = bs->input[idx2]; + } + + // Copy kernel parameter from system memory to local memory + err = AgentMemcpy(reinterpret_cast(bs->input_arr_local), + reinterpret_cast(bs->input_arr), + in_length, bs->gpu_dev, bs->cpu_dev); + + RET_IF_HSA_ERR(err); + + // Reset output buffer to zero + bs->output[3] = 0; + + // Dispatch kernel with global work size, work group size with ONE dimesion + // and wait for kernel to complete + + // Compute the write index of queue and copy Aql packet into it + uint64_t que_idx = hsa_queue_load_write_index_relaxed(bs->queue); + + const uint32_t mask = bs->queue->size - 1; + + // This function simply copies the data we've collected so far into our + // local AQL packet, except the the setup and header fields. + WriteAQLToQueue(&aql, bs->queue); + + uint32_t aql_header = HSA_PACKET_TYPE_KERNEL_DISPATCH; + aql_header |= HSA_FENCE_SCOPE_SYSTEM << + HSA_PACKET_HEADER_ACQUIRE_FENCE_SCOPE; + aql_header |= HSA_FENCE_SCOPE_SYSTEM << + HSA_PACKET_HEADER_RELEASE_FENCE_SCOPE; + + // Set the packet's type, acquire and release fences. This should be done + // atomically after all the other fields have been set, using release + // memory ordering to ensure all the fields are set when the door bell + // signal is activated. + void* q_base = bs->queue->base_address; + + AtomicSetPacketHeader(aql_header, aql.setup, + &(reinterpret_cast + (q_base))[que_idx & mask]); + + // Increment the write index and ring the doorbell to dispatch kernel. + hsa_queue_store_write_index_relaxed(bs->queue, (que_idx + 1)); + hsa_signal_store_relaxed(bs->queue->doorbell_signal, que_idx); + + // Wait on the dispatch signal until the kernel is finished. + // Modify the wait condition to HSA_WAIT_STATE_ACTIVE (instead of + // HSA_WAIT_STATE_BLOCKED) if polling is needed instead of blocking, as we + // have below. + // The call below will block until the condition is met. Below we have said + // the condition is that the signal value (initiailzed to 1) associated with + // the queue is less than 1. When the kernel associated with the queued AQL + // packet has completed execution, the signal value is automatically + // decremented by the packet processor. + hsa_signal_value_t value = hsa_signal_wait_scacquire(bs->signal, + HSA_SIGNAL_CONDITION_LT, 1, + UINT64_MAX, HSA_WAIT_STATE_BLOCKED); + + // value should be 0, or we timed-out + if (value) { + std::cout << "Timed out waiting for kernel to complete?" << std::endl; + RET_IF_HSA_ERR(HSA_STATUS_ERROR); + } + + // Reset the signal to its initial value for the next iteration + hsa_signal_store_screlease(bs->signal, 1); + + // Binary search algorithm stuff... + global_lower_bound = bs->output[0] * sub_div_size; + global_upper_bound = global_lower_bound + sub_div_size - 1; + sub_div_size = (global_upper_bound - global_lower_bound + 1) / + bs->num_sub_divisions; + } + + uint32_t element_index = UINT_MAX; + + for (uint32_t i = global_lower_bound; i <= global_upper_bound; i++) { + if (bs->input[i] == bs->find_me) { + element_index = i; + bs->output[0] = i; + bs->output[1] = i + 1; + bs->output[2] = 1; + break; + } + + // Element is not found in region specified + // by global lower bound to global upper bound + bs->output[2] = 0; + } + + uint32_t is_elem_found = bs->output[2]; + + std::cout << "Lower bound = " << global_lower_bound << std::endl; + std::cout << "Upper bound = " << global_upper_bound << std::endl; + std::cout << "Element search for = " << bs->find_me << std::endl; + + + if (is_elem_found == 1) { + std::cout << "Element found at index " << element_index << std::endl; + } else { + std::cout << "Element value " << bs->find_me << " not found" << std::endl; + } + + return HSA_STATUS_SUCCESS; +} + +// Release all the RocR resources we have acquired in this application. +hsa_status_t CleanUp(BinarySearch* bs) { + hsa_status_t err; + + err = hsa_amd_memory_pool_free(bs->input); + RET_IF_HSA_ERR(err); + + err = hsa_amd_memory_pool_free(bs->output); + RET_IF_HSA_ERR(err); + + err = hsa_amd_memory_pool_free(bs->input_arr); + RET_IF_HSA_ERR(err); + + err = hsa_amd_memory_pool_free(bs->kern_arg_buffer); + RET_IF_HSA_ERR(err); + + err = hsa_queue_destroy(bs->queue); + RET_IF_HSA_ERR(err); + + err = hsa_signal_destroy(bs->signal); + RET_IF_HSA_ERR(err); + + err = hsa_shut_down(); + RET_IF_HSA_ERR(err); + + return HSA_STATUS_SUCCESS; +} + +int main(int argc, char* argv[]) { + // This BinarySearch structure (bs) below holds all of the appl. specific + // info we need to run the sample. This includes algorithm specific + // information as well as handles to RocR/HSA objects. + + // The basic structure of this sample is to fill in this structure with the + // required RocR/HSA handles to RocR resources (e.g., agents, memory pools, + // queues, etc.) and then dispatch the packets to the queue, and examine the + // output. + + BinarySearch bs; + hsa_status_t err; + + // Set some working values specific to this application + InitializeBinarySearch(&bs); + + // hsa_init() initializes internal data structures and causes devices + // (agents), memory pools and other resources to be discovered. + err = hsa_init(); + RET_IF_HSA_ERR(err); + + // Find the agents needed for the sample + err = FindDevices(&bs); + RET_IF_HSA_ERR(err); + + // Create the completion signal used when dispatching a packet + err = hsa_signal_create(1, 0, NULL, &bs.signal); + RET_IF_HSA_ERR(err); + + // Create a queue to submit our binary search AQL packets + err = hsa_queue_create(bs.gpu_dev, 128, HSA_QUEUE_TYPE_MULTI, NULL, NULL, + UINT32_MAX, UINT32_MAX, &bs.queue); + RET_IF_HSA_ERR(err); + + // Find the HSA memory pools we need to run this sample + err = FindPools(&bs); + RET_IF_HSA_ERR(err); + + // Allocate memory from the correct memory pool, and initialize them as + // neeeded for the algorihm. + err = AllocateAndInitBuffers(&bs); + RET_IF_HSA_ERR(err); + + // Create a kernel object from the pre-compiled kernel, and read some + // attributes associated with the kernel that we will need. + err = LoadKernelFromObjFile(&bs); + RET_IF_HSA_ERR(err); + + // Fill in the AQL packet, assign the kernel arguments, enqueue the packet, + // "ring" the doorbell, and wait for completion. + err = Run(&bs); + RET_IF_HSA_ERR(err); + + // Release all the RocR resources we've acquired and shutdown HSA. + err = CleanUp(&bs); + + return 0; +} + + +#undef RET_IF_HSA_ERR diff --git a/runtime/hsa-ext-aql-profile/test/binary_search/binary_search_kernels.cl b/runtime/hsa-ext-aql-profile/test/binary_search/binary_search_kernels.cl new file mode 100755 index 0000000000..eb3cca6c86 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/binary_search/binary_search_kernels.cl @@ -0,0 +1,127 @@ +/* + * ============================================================================= + * ROC Runtime Conformance Release License + * ============================================================================= + * The University of Illinois/NCSA + * Open Source License (NCSA) + * + * Copyright (c) 2017, Advanced Micro Devices, Inc. + * All rights reserved. + * + * Developed by: + * + * AMD Research and AMD ROC Software Development + * + * Advanced Micro Devices, Inc. + * + * www.amd.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal with the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimers. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimers in + * the documentation and/or other materials provided with the distribution. + * - Neither the names of , + * nor the names of its contributors may be used to endorse or promote + * products derived from this Software without specific prior written + * permission. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS WITH THE SOFTWARE. + * + */ + +/** + * One instance of this kernel call is a thread. + * Each thread finds out the segment in which it should look for the element. + * After that, it checks if the element is between the lower bound and upper + * bound of its segment. If yes, then this segment becomes the total + * searchspace for the next pass. + * + * To achieve this, it writes the lower bound and upper bound to the output + * array. In case the element at the left end (lower bound) matches the element + * we are looking for, that is marked in the output and we no longer need to + * look any further. + */ + +__kernel void +binarySearch(__global uint4 * outputArray, + __const __global uint2 * sortedArray, + const unsigned int findMe) { + unsigned int tid = get_global_id(0); + + // Then we find the elements for this thread + uint2 element = sortedArray[tid]; + + + // If the element to be found does not lie between + // them, then nothing left to do in this thread + if((element.x > findMe) || (element.y < findMe)) { + return; + } else { + // However, if the element does lie between the lower + // and upper bounds of this thread's searchspace + // we need to narrow down the search further in this + // search space + // The search space for this thread is marked in the + // output as being the total search space for the next pass + outputArray[0].x = tid; + outputArray[0].w = 1; + } +} + + +__kernel void +binarySearch_mulkeys(__global int *keys, + __global uint *input, + const unsigned int numKeys, + __global int *output) { + + int gid = get_global_id(0); + int lBound = gid * 256; + int uBound = lBound + 255; + + for(int i = 0; i < numKeys; i++) { + if(keys[i] >= input[lBound] && keys[i] <= input[uBound]) + output[i]=lBound; + } + +} + + +__kernel void +binarySearch_mulkeysConcurrent(__global uint *keys, + __global uint *input, + const unsigned int inputSize, // num. of inputs + const unsigned int numSubdivisions, + __global int *output) { + + int lBound = (get_global_id(0) % numSubdivisions) * (inputSize / numSubdivisions); + int uBound = lBound + inputSize / numSubdivisions; + int myKey = keys[get_global_id(0) / numSubdivisions]; + int mid; + + while(uBound >= lBound) { + mid = (lBound + uBound) / 2; + if(input[mid] == myKey) { + output[get_global_id(0) / numSubdivisions] = mid; + return; + } else if(input[mid] > myKey) { + uBound = mid - 1; + } else { + lBound = mid + 1; + } + } +} diff --git a/runtime/hsa-ext-aql-profile/test/common/CMakeLists.txt b/runtime/hsa-ext-aql-profile/test/common/CMakeLists.txt new file mode 100644 index 0000000000..a96d647976 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/common/CMakeLists.txt @@ -0,0 +1,15 @@ +# +# Source files for Rocr Utils library +# +file( GLOB MODULE_SRC "*.cpp" ) + +# +# Header files include path(s). +# +include_directories ( $ENV{ROCR_INC_DIR} ) + +# +# Build Utils as a Static Library object +# +add_library( ${COMMON_LIB} STATIC ${MODULE_SRC} ) +target_link_libraries( ${COMMON_LIB} c stdc++ dl pthread rt ) diff --git a/runtime/hsa-ext-aql-profile/test/common/common.cpp b/runtime/hsa-ext-aql-profile/test/common/common.cpp new file mode 100644 index 0000000000..19d7383407 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/common/common.cpp @@ -0,0 +1,45 @@ +#include "common.hpp" + +void ErrorCheck(hsa_status_t hsa_error_code) { + if (hsa_error_code != HSA_STATUS_SUCCESS) { + std::cerr << "HSA reported error!" << std::endl; + exit(EXIT_FAILURE); + } +} + +hsa_status_t FindGpuDevice(hsa_agent_t agent, void* data) { + if (data == NULL) { + return HSA_STATUS_ERROR_INVALID_ARGUMENT; + } + + hsa_device_type_t hsa_device_type; + hsa_status_t hsa_error_code = hsa_agent_get_info(agent, HSA_AGENT_INFO_DEVICE, &hsa_device_type); + if (hsa_error_code != HSA_STATUS_SUCCESS) { + return hsa_error_code; + } + + if (hsa_device_type == HSA_DEVICE_TYPE_GPU) { + *((hsa_agent_t*)data) = agent; + } + + return HSA_STATUS_SUCCESS; +} + +hsa_status_t FindHostRegion(hsa_region_t region, void* data) { + if (data == NULL) { + return HSA_STATUS_ERROR_INVALID_ARGUMENT; + } + + bool is_host_region = false; + hsa_status_t hsa_error_code = hsa_region_get_info( + region, (hsa_region_info_t)HSA_AMD_REGION_INFO_HOST_ACCESSIBLE, &is_host_region); + if (hsa_error_code != HSA_STATUS_SUCCESS) { + return hsa_error_code; + } + + if (is_host_region) { + *((hsa_region_t*)data) = region; + } + + return HSA_STATUS_SUCCESS; +} diff --git a/runtime/hsa-ext-aql-profile/test/common/common.hpp b/runtime/hsa-ext-aql-profile/test/common/common.hpp new file mode 100644 index 0000000000..ef9713831a --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/common/common.hpp @@ -0,0 +1,27 @@ +#ifndef COMMON_COMMON_HPP +#define COMMON_COMMON_HPP + +#include +#include + +#include "hsa.h" +#include "hsa_ext_finalize.h" +#include "hsa_ext_amd.h" + +#if defined(_MSC_VER) +#define ALIGNED_(x) __declspec(align(x)) +#else +#if defined(__GNUC__) +#define ALIGNED_(x) __attribute__((aligned(x))) +#endif // __GNUC__ +#endif // _MSC_VER + +#define MULTILINE(...) #__VA_ARGS__ + +void ErrorCheck(hsa_status_t hsa_error_code); + +hsa_status_t FindGpuDevice(hsa_agent_t agent, void* data); + +hsa_status_t FindHostRegion(hsa_region_t region, void* data); + +#endif // COMMON_COMMON_HPP diff --git a/runtime/hsa-ext-aql-profile/test/common/helper_funcs.cpp b/runtime/hsa-ext-aql-profile/test/common/helper_funcs.cpp new file mode 100644 index 0000000000..71f7d1cd33 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/common/helper_funcs.cpp @@ -0,0 +1,262 @@ +/********************************************************************** +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +• Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. +• Redistributions in binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +********************************************************************/ + +#include "helper_funcs.hpp" + +#ifndef _WIN32 +#include +#endif + + +/* + * Prints no more than 256 elements of the given array. + * Prints full array if length is less than 256. + * Prints Array name followed by elements. + */ +template +void printArray(const std::string header, const T* data, const int width, const int height) { + std::cout << header << " :\n"; + for (int i = 0; i < height; i++) { + std::cout << "> "; + for (int j = 0; j < width; j++) { + std::cout << data[i * width + j] << " "; + } + std::cout << "\n"; + } +} + +template +int fillRandom(T* arrayPtr, const int width, const int height, const T rangeMin, const T rangeMax, + unsigned int seed) { + if (!arrayPtr) { + error("Cannot fill array. NULL pointer."); + return HSA_SDK_FAILURE; + } + + if (!seed) seed = (unsigned int)time(NULL); + + srand(seed); + double range = double(rangeMax - rangeMin) + 1.0; + + /* random initialisation of input */ + for (int i = 0; i < height; i++) + for (int j = 0; j < width; j++) { + int index = i * width + j; + arrayPtr[index] = rangeMin + T(range * rand() / (RAND_MAX + 1.0)); + } + + return HSA_SDK_SUCCESS; +} + +template int fillPos(T* arrayPtr, const int width, const int height) { + if (!arrayPtr) { + error("Cannot fill array. NULL pointer."); + return HSA_SDK_FAILURE; + } + + /* initialisation of input with positions*/ + for (T i = 0; i < height; i++) + for (T j = 0; j < width; j++) { + T index = i * width + j; + arrayPtr[index] = index; + } + + return HSA_SDK_SUCCESS; +} + +template +int fillConstant(T* arrayPtr, const int width, const int height, const T val) { + if (!arrayPtr) { + error("Cannot fill array. NULL pointer."); + return HSA_SDK_FAILURE; + } + + /* initialisation of input with constant value*/ + for (int i = 0; i < height; i++) + for (int j = 0; j < width; j++) { + int index = i * width + j; + arrayPtr[index] = val; + } + + return HSA_SDK_SUCCESS; +} + +template T roundToPowerOf2(T val) { + int bytes = sizeof(T); + + val--; + for (int i = 0; i < bytes; i++) val |= val >> (1 << i); + val++; + + return val; +} + +template int isPowerOf2(T val) { + long long _val = val; + if ((_val & (-_val)) - _val == 0 && _val != 0) + return HSA_SDK_SUCCESS; + else + return HSA_SDK_FAILURE; +} + + +template bool checkVal(T input, T reference, std::string message, bool isAPIerror) { + if (input == reference) { + return true; + } else { + error(message); + return false; + } +} + + +template std::string toString(T t, std::ios_base& (*r)(std::ios_base&)) { + std::ostringstream output; + output << r << t; + return output.str(); +} + + +bool compare(const float* refData, const float* data, const int length, const float epsilon) { + float error = 0.0f; + float ref = 0.0f; + + for (int i = 1; i < length; ++i) { + float diff = refData[i] - data[i]; + error += diff * diff; + ref += refData[i] * refData[i]; + } + + float normRef = ::sqrtf((float)ref); + if (::fabs((float)ref) < 1e-7f) { + return false; + } + float normError = ::sqrtf((float)error); + error = normError / normRef; + + return error < epsilon; +} + +bool compare(const double* refData, const double* data, const int length, const double epsilon) { + double error = 0.0; + double ref = 0.0; + + for (int i = 1; i < length; ++i) { + double diff = refData[i] - data[i]; + error += diff * diff; + ref += refData[i] * refData[i]; + } + + double normRef = ::sqrt((double)ref); + if (::fabs((double)ref) < 1e-7) { + return false; + } + double normError = ::sqrt((double)error); + error = normError / normRef; + + return error < epsilon; +} + +void error(const char* errorMsg) { std::cout << "Error: " << errorMsg << std::endl; } + +void error(std::string errorMsg) { std::cout << "Error: " << errorMsg << std::endl; } + +void expectedError(const char* errorMsg) { + std::cout << "Expected Error: " << errorMsg << std::endl; +} + +void expectedError(std::string errorMsg) { + std::cout << "Expected Error: " << errorMsg << std::endl; +} + + +///////////////////////////////////////////////////////////////// +// Template Instantiations +///////////////////////////////////////////////////////////////// +template void printArray(const std::string, const short*, int, int); +template void printArray(const std::string, const unsigned char*, int, int); +template void printArray(const std::string, const unsigned int*, int, int); +template void printArray(const std::string, const int*, int, int); +template void printArray(const std::string, const long*, int, int); +template void printArray(const std::string, const float*, int, int); +template void printArray(const std::string, const double*, int, int); + +template int fillRandom(unsigned char* arrayPtr, const int width, const int height, + unsigned char rangeMin, unsigned char rangeMax, + unsigned int seed); +template int fillRandom(unsigned int* arrayPtr, const int width, const int height, + unsigned int rangeMin, unsigned int rangeMax, + unsigned int seed); +template int fillRandom(int* arrayPtr, const int width, const int height, int rangeMin, + int rangeMax, unsigned int seed); +template int fillRandom(long* arrayPtr, const int width, const int height, long rangeMin, + long rangeMax, unsigned int seed); +template int fillRandom(float* arrayPtr, const int width, const int height, float rangeMin, + float rangeMax, unsigned int seed); +template int fillRandom(double* arrayPtr, const int width, const int height, + double rangeMin, double rangeMax, unsigned int seed); + +template short roundToPowerOf2(short val); +template unsigned int roundToPowerOf2(unsigned int val); +template int roundToPowerOf2(int val); +template long roundToPowerOf2(long val); + +template int isPowerOf2(short val); +template int isPowerOf2(unsigned int val); +template int isPowerOf2(int val); +template int isPowerOf2(long val); + +template <> int fillPos(short* arrayPtr, const int width, const int height); +template <> int fillPos(unsigned int* arrayPtr, const int width, const int height); +template <> int fillPos(int* arrayPtr, const int width, const int height); +template <> int fillPos(long* arrayPtr, const int width, const int height); + +template <> +int fillConstant(short* arrayPtr, const int width, const int height, const short val); +template <> +int fillConstant(unsigned int* arrayPtr, const int width, const int height, const unsigned int val); +template <> int fillConstant(int* arrayPtr, const int width, const int height, const int val); +template <> int fillConstant(long* arrayPtr, const int width, const int height, const long val); +template <> int fillConstant(long* arrayPtr, const int width, const int height, const long val); +template <> int fillConstant(long* arrayPtr, const int width, const int height, const long val); + + +template bool checkVal(char input, char reference, std::string message, bool isAPIerror); +template bool checkVal(bool input, bool reference, std::string message, bool isAPIerror); +template bool checkVal(std::string input, std::string reference, std::string message, + bool isAPIerror); +template bool checkVal(short input, short reference, std::string message, bool isAPIerror); +template bool checkVal(unsigned int input, unsigned int reference, + std::string message, bool isAPIerror); +template bool checkVal(int input, int reference, std::string message, bool isAPIerror); +template bool checkVal(long input, long reference, std::string message, bool isAPIerror); + + +template std::string toString(char t, std::ios_base& (*r)(std::ios_base&)); +template std::string toString(short t, std::ios_base& (*r)(std::ios_base&)); +template std::string toString(unsigned int t, std::ios_base& (*r)(std::ios_base&)); +template std::string toString(int t, std::ios_base& (*r)(std::ios_base&)); +template std::string toString(long t, std::ios_base& (*r)(std::ios_base&)); +template std::string toString(float t, std::ios_base& (*r)(std::ios_base&)); +template std::string toString(double t, std::ios_base& (*r)(std::ios_base&)); diff --git a/runtime/hsa-ext-aql-profile/test/common/helper_funcs.hpp b/runtime/hsa-ext-aql-profile/test/common/helper_funcs.hpp new file mode 100644 index 0000000000..c5d0e7ca80 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/common/helper_funcs.hpp @@ -0,0 +1,141 @@ +/********************************************************************** +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +• Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. +• Redistributions in binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +********************************************************************/ +#ifndef HELPER_FUNCS_HPP_ +#define HELPER_FUNCS_HPP_ + +#define HSA_SDK_SUCCESS 0 +#define HSA_SDK_FAILURE 1 +#define HSA_SDK_EXPECTED_FAILURE 2 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * error + * constant function, Prints error messages + * @param errorMsg char* message + */ +void error(const char* errorMsg); + +/** + * error + * constant function, Prints error messages + * @param errorMsg std::string message + */ +void error(std::string errorMsg); + +/** + * expectedError + * constant function, Prints error messages + * @param errorMsg char* message + */ +void expectedError(const char* errorMsg); + +/** + * expectedError + * constant function, Prints error messages + * @param errorMsg string message + */ +void expectedError(std::string errorMsg); + +/** + * compare template version + * compare data to check error + * @param refData templated input + * @param data templated input + * @param length number of values to compare + * @param epsilon errorWindow + */ +bool compare(const float* refData, const float* data, const int length, + const float epsilon = 1e-6f); +bool compare(const double* refData, const double* data, const int length, + const double epsilon = 1e-6); + +/** + * printArray + * displays a array on std::out + */ +template +void printArray(const std::string header, const T* data, const int width, const int height); + + +/** + * fillRandom + * fill array with random values + */ +template +int fillRandom(T* arrayPtr, const int width, const int height, const T rangeMin, const T rangeMax, + unsigned int seed = 123); + +/** + * fillPos + * fill the specified positions + */ +template int fillPos(T* arrayPtr, const int width, const int height); + +/** + * fillConstant + * fill the array with constant value + */ +template int fillConstant(T* arrayPtr, const int width, const int height, const T val); + + +/** + * roundToPowerOf2 + * rounds to a power of 2 + */ +template T roundToPowerOf2(T val); + +/** + * isPowerOf2 + * checks if input is a power of 2 + */ +template int isPowerOf2(T val); + +/** + * checkVal + * Set default(isAPIerror) parameter to false + * if checkVaul is used to check otherthan OpenCL API error code + */ +template +bool checkVal(T input, T reference, std::string message, bool isAPIerror = true); + +/** + * toString + * convert a T type to string + */ +template std::string toString(T t, std::ios_base& (*r)(std::ios_base&)); + + +#endif diff --git a/runtime/hsa-ext-aql-profile/test/common/hsa_perf_cntrs.cpp b/runtime/hsa-ext-aql-profile/test/common/hsa_perf_cntrs.cpp new file mode 100644 index 0000000000..93e103ae9a --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/common/hsa_perf_cntrs.cpp @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "hsa.h" +#include "hsa_ext_profiler.h" +#include "amd_hsa_tools_interfaces.h" + +#include "hsa_perf_cntrs.hpp" + +using namespace std; + +void PreDispatchCallback(const hsa_dispatch_callback_t* dispParam, void* usrArg) { + assert((dispParam->pre_dispatch) && "Pre Dispatch Callback Param is Malformed"); + + hsa_ext_tools_pmu_t* perfMgr = reinterpret_cast(usrArg); + hsa_status_t status = + hsa_ext_tools_pmu_begin(*perfMgr, dispParam->queue, dispParam->aql_translation_handle, true); + assert((status == HSA_STATUS_SUCCESS) && "Error in beginning Perf Cntr Session"); +} + +void PostDispatchCallback(const hsa_dispatch_callback_t* dispParam, void* usrArg) { + assert((!dispParam->pre_dispatch) && "Post Dispatch Callback Param is Malformed"); + + hsa_ext_tools_pmu_t* perfMgr = reinterpret_cast(usrArg); + hsa_status_t status = + hsa_ext_tools_pmu_end(*perfMgr, dispParam->queue, dispParam->aql_translation_handle); + assert((status == HSA_STATUS_SUCCESS) && "Error in endning Perf Cntr Session"); +} + +// Constructor of the class +RocrPerfCntrApp::RocrPerfCntrApp() : perfMgr_(NULL) {} + +// Destructor of the class. Ideally it should delete the +// PMU and its counters +RocrPerfCntrApp::~RocrPerfCntrApp() {} + +// Return the number of perf counters +uint32_t RocrPerfCntrApp::GetNumPerfCntrs() { return uint32_t(cntrList_.size()); } + +// Return the handle of perf counter at specified index +CntrInfo* RocrPerfCntrApp::GetPerfCntr(uint32_t idx) { return cntrList_[idx]; } + +// Print the various fields of Perf Cntrs being programmed +bool RocrPerfCntrApp::PrintCntrs() { + CntrInfo* info; + int size = uint32_t(cntrList_.size()); + for (int idx = 0; idx < size; idx++) { + info = cntrList_[idx]; + std::cout << std::endl; + std::cout << "Rocr Perf Cntr Id: " << info->cntrId << std::endl; + std::cout << "Rocr Perf Cntr Name: " << info->cntrName << std::endl; + std::cout << "Rocr Perf Cntr Blk Id: " << info->blkId << std::endl; + std::cout << "Rocr Perf Cntr Value: " << info->cntrResult << std::endl; + std::cout << "Rocr Perf Cntr Validation: " << info->cnfType << std::endl; + std::cout << std::endl; + } + return true; +} + +// Initialize the list of perf counters +// block id of kHsaAiCounterBlockSQ = 14 == 0x0E +hsa_status_t RocrPerfCntrApp::Init(hsa_agent_t agent) { + // Initialize the list of Perf Cntrs + // Add SQ counter for number of waves + CntrInfo* info = NULL; + cntrList_.reserve(23); + + // Event for number of Waves + info = new CntrInfo(0x4, "SQ_SQ_PERF_SEL_WAVES", NULL, 0x0E, NULL, 0x00, 0xFFFFFFFF, + CntrValCnf_Exact); + cntrList_.push_back(info); + + // Event for number of Threads + info = new CntrInfo(0xE, "SQ_SQ_PERF_SEL_ITEMS", NULL, 0x0E, NULL, 0x00, 0xFFFFFFFF, + CntrValCnf_Exact); + cntrList_.push_back(info); + + + // Create an instance of Perf Mgr + hsa_status_t status; + status = hsa_ext_tools_create_pmu(agent, &perfMgr_); + assert((status == HSA_STATUS_SUCCESS) && "Error in creating Perf Cntr Mgr"); + + // Process each counter from the list as necessary + // each counter descriptor with its perf block handle + // and create an instance of counter in that block + uint32_t size = GetNumPerfCntrs(); + for (uint32_t idx = 0; idx < size; idx++) { + info = GetPerfCntr(idx); + + // Obtain the handle of perf block + if (info->blkHndl == NULL) { + status = hsa_ext_tools_get_counter_block_by_id(perfMgr_, info->blkId, &info->blkHndl); + assert((status == HSA_STATUS_SUCCESS) && "Error in getting Perf Cntr Blk Hndl"); + } + + // Create an instance of counter in the perf block + status = hsa_ext_tools_create_counter(info->blkHndl, &info->cntrHndl); + assert((status == HSA_STATUS_SUCCESS) && "Error in creating Perf Cntr in Perf Blk"); + + // Update the Event Index property of counter + uint32_t cntrProp = HSA_EXT_TOOLS_COUNTER_PARAMETER_EVENT_INDEX; + status = hsa_ext_tools_set_counter_parameter(info->cntrHndl, cntrProp, sizeof(uint32_t), + (void*)&info->cntrId); + assert((status == HSA_STATUS_SUCCESS) && "Error in updating Perf Cntr Property Event Index"); + + // Enable the updated perf counter + status = hsa_ext_tools_set_counter_enabled(info->cntrHndl, true); + assert((status == HSA_STATUS_SUCCESS) && "Error in enabing Perf Cntr"); + } + + return status; +} + +// Register Pre and Post dispatch callbacks +void RocrPerfCntrApp::RegisterCallbacks(hsa_queue_t* queue) { + hsa_status_t status; + status = hsa_ext_tools_set_callback_functions(queue, PreDispatchCallback, PostDispatchCallback); + assert((status == HSA_STATUS_SUCCESS) && "Error in registering Pre & Post Dispatch Callbacks"); + status = hsa_ext_tools_set_callback_arguments(queue, &perfMgr_, &perfMgr_); + assert((status == HSA_STATUS_SUCCESS) && + "Error in registering Pre & Post Dispatch Callback Params"); + return; +} + +// Wait for perf counter collection to complete +hsa_status_t RocrPerfCntrApp::Wait() { + hsa_status_t status; + status = hsa_ext_tools_pmu_wait_for_completion(perfMgr_, 5000); + assert((status == HSA_STATUS_SUCCESS) && "Error in Waiting for Perf Cntr Completion"); + return status; +} + +// Validate perf counter values +hsa_status_t RocrPerfCntrApp::Validate() { + // Retrieve the results of the different Perf Cntrs + // and validate them as configured + CntrInfo* info = NULL; + hsa_status_t status = HSA_STATUS_SUCCESS; + uint32_t size = GetNumPerfCntrs(); + for (uint32_t idx = 0; idx < size; idx++) { + info = GetPerfCntr(idx); + status = hsa_ext_tools_get_counter_result(info->cntrHndl, &info->cntrResult); + std::cout << "Value of Perf Cntr is: " << info->cntrResult << std::endl; + } + + return status; +} diff --git a/runtime/hsa-ext-aql-profile/test/common/hsa_perf_cntrs.hpp b/runtime/hsa-ext-aql-profile/test/common/hsa_perf_cntrs.hpp new file mode 100644 index 0000000000..3a2a2fbd42 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/common/hsa_perf_cntrs.hpp @@ -0,0 +1,110 @@ +#ifndef ROCR_PERF_CNTR_APP_H_ +#define ROCR_PERF_CNTR_APP_H_ + +#include +#include +#include +#include + +#include +#include +#include + +#include "hsa.h" +#include "hsa_ext_profiler.h" + +typedef enum CntrValCnfType { + + ///< no counter value validation should be performed + CntrValCnf_None, + + ///< counter value should be an exact match to expectedResult + CntrValCnf_Exact, + + ///< counter value should be greater than expectedResult + CntrValCnf_GreaterThan, + + ///< counter value should be less than expectedResult + CntrValCnf_LessThan + +} CntrValCnfType; + +/// Struct used to encapsulate Counter Info +typedef struct CntrInfo { + ///< Id of counter in hardware block + uint32_t cntrId; + + ///< Name of counter + char cntrName[72]; + + ///< Handle of perf counter + hsa_ext_tools_counter_t cntrHndl; + + ///< Id of hardware block containing the counter + uint32_t blkId; + + ///< Handle of counter block + hsa_ext_tools_counter_block_t blkHndl; + + ///< Expected value of perf counte + uint64_t expectedResult; + + ///< Value of perf counter expected + uint64_t cntrResult; + + ///< Type of validation upon completion of dispatch + CntrValCnfType cnfType; + + CntrInfo(uint32_t cntrId, char* cntrName, void* cntrHndl, uint32_t blkId, void* blkHndl, + uint64_t expResult, uint64_t result, CntrValCnfType cnfType) { + this->cntrId = cntrId; + this->cntrHndl = cntrHndl; + this->blkId = blkId; + this->blkHndl = blkHndl; + this->expectedResult = expResult; + this->cntrResult = result; + this->cnfType = cnfType; + memcpy(this->cntrName, cntrName, strlen(cntrName)); + } + +} CntrInfo; + +class RocrPerfCntrApp { + public: + // Constructor of the class. Will initialize the list of perf counters + // that will be used to program the device + RocrPerfCntrApp(); + + // Destructor of the class + ~RocrPerfCntrApp(); + + // Return the number of perf counters + uint32_t GetNumPerfCntrs(); + + // Return the handle of perf counter at specified index + CntrInfo* GetPerfCntr(uint32_t idx); + + // Print the list of perf counters + bool PrintCntrs(); + + // Initialize the list of perf counters + hsa_status_t Init(hsa_agent_t agent); + + // Register Pre and Post dispatch callbacks + void RegisterCallbacks(hsa_queue_t* queue); + + // Wait for perf counter collection to complete + hsa_status_t Wait(); + + // Validate perf counter values + hsa_status_t Validate(); + + private: + // Number of queues to create + std::vector cntrList_; + + // Handle of Perf Cntr Manager + hsa_ext_tools_pmu_t perfMgr_; +}; + +#endif // ROCR_PERF_CNTR_APP_H_ diff --git a/runtime/hsa-ext-aql-profile/test/common/hsa_rsrc_factory.cpp b/runtime/hsa-ext-aql-profile/test/common/hsa_rsrc_factory.cpp new file mode 100644 index 0000000000..75c2614495 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/common/hsa_rsrc_factory.cpp @@ -0,0 +1,476 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "hsa.h" +#include "hsa_rsrc_factory.hpp" +#include "hsa_ext_finalize.h" +#include "hsa_ext_profiler.h" + +#include "common.hpp" + +using namespace std; + +// Provide access to command line arguments passed in by user +uint32_t hsa_cmdline_arg_cnt; +char** hsa_cmdline_arg_list; + +// Callback function to find and bind kernarg region of an agent +static hsa_status_t find_memregions(hsa_region_t region, void* data) { + hsa_region_global_flag_t flags; + hsa_region_segment_t segment_id; + + hsa_region_get_info(region, HSA_REGION_INFO_SEGMENT, &segment_id); + if (segment_id != HSA_REGION_SEGMENT_GLOBAL) { + return HSA_STATUS_SUCCESS; + } + + AgentInfo* agent_info = (AgentInfo*)data; + hsa_region_get_info(region, HSA_REGION_INFO_GLOBAL_FLAGS, &flags); + if (flags & HSA_REGION_GLOBAL_FLAG_COARSE_GRAINED) { + agent_info->coarse_region = region; + } + + if (flags & HSA_REGION_GLOBAL_FLAG_KERNARG) { + agent_info->kernarg_region = region; + } + + return HSA_STATUS_SUCCESS; +} + +// Callback function to get the number of agents +static hsa_status_t get_hsa_agents(hsa_agent_t agent, void* data) { + // Copy handle of agent and increment number of agents reported + HsaRsrcFactory* rsrcFactory = reinterpret_cast(data); + + // Determine if device is a Gpu agent + hsa_status_t status; + hsa_device_type_t type; + status = hsa_agent_get_info(agent, HSA_AGENT_INFO_DEVICE, &type); + if (type == HSA_DEVICE_TYPE_DSP) { + return HSA_STATUS_SUCCESS; + } + + if (type == HSA_DEVICE_TYPE_CPU) { + AgentInfo* agent_info = reinterpret_cast(malloc(sizeof(AgentInfo))); + agent_info->dev_id = agent; + agent_info->dev_type = HSA_DEVICE_TYPE_CPU; + rsrcFactory->AddAgentInfo(agent_info, false); + return HSA_STATUS_SUCCESS; + } + + // Device is a Gpu agent, build an instance of AgentInfo + AgentInfo* agent_info = reinterpret_cast(malloc(sizeof(AgentInfo))); + agent_info->dev_id = agent; + agent_info->dev_type = HSA_DEVICE_TYPE_GPU; + hsa_agent_get_info(agent, HSA_AGENT_INFO_NAME, agent_info->name); + agent_info->max_wave_size = 0; + hsa_agent_get_info(agent, HSA_AGENT_INFO_WAVEFRONT_SIZE, &agent_info->max_wave_size); + agent_info->max_queue_size = 0; + hsa_agent_get_info(agent, HSA_AGENT_INFO_QUEUE_MAX_SIZE, &agent_info->max_queue_size); + agent_info->profile = hsa_profile_t(108); + hsa_agent_get_info(agent, HSA_AGENT_INFO_PROFILE, &agent_info->profile); + + // Initialize memory regions to zero + agent_info->kernarg_region.handle = 0; + agent_info->coarse_region.handle = 0; + + // Find and Bind Memory regions of the Gpu agent + hsa_agent_iterate_regions(agent, find_memregions, agent_info); + + // Save the instance of AgentInfo + rsrcFactory->AddAgentInfo(agent_info, true); + return HSA_STATUS_SUCCESS; +} + +// Definitions for Static Data members of the class +char* HsaRsrcFactory::brig_path_ = NULL; +uint32_t HsaRsrcFactory::num_cus_ = 4; +uint32_t HsaRsrcFactory::num_waves_; +uint32_t HsaRsrcFactory::num_workitems_; +uint32_t HsaRsrcFactory::kernel_loop_count_; +bool HsaRsrcFactory::print_debug_info_ = false; + +char* HsaRsrcFactory::num_cus_key_ = "num_cus"; +char* HsaRsrcFactory::brig_path_key_ = "brig_path"; +char* HsaRsrcFactory::num_waves_key_ = "waves_per_cu"; +char* HsaRsrcFactory::num_workitems_key_ = "workitems_per_wave"; +char* HsaRsrcFactory::print_debug_key_ = "print_debug"; +char* HsaRsrcFactory::kernel_loop_count_key_ = "kernel_loop_count"; + +// Constructor of the class +HsaRsrcFactory::HsaRsrcFactory() { + // Initialize the Hsa Runtime + hsa_status_t status = hsa_init(); + check("Error in hsa_init", status); + + // Discover the set of Gpu devices available on the platform + status = hsa_iterate_agents(get_hsa_agents, this); + check("Error Calling hsa_iterate_agents", status); + + // Process command line arguments + ProcessCmdline(); +} + +// Destructor of the class +HsaRsrcFactory::~HsaRsrcFactory() {} + +// Get the count of Hsa Gpu Agents available on the platform +// +// @return uint32_t Number of Gpu agents on platform +// +uint32_t HsaRsrcFactory::GetCountOfGpuAgents() { return uint32_t(gpu_list_.size()); } + +// Get the count of Hsa Cpu Agents available on the platform +// +// @return uint32_t Number of Cpu agents on platform +// +uint32_t HsaRsrcFactory::GetCountOfCpuAgents() { return uint32_t(cpu_list_.size()); } + +// Get the AgentInfo handle of a Gpu device +// +// @param idx Gpu Agent at specified index +// +// @param agent_info Output parameter updated with AgentInfo +// +// @return bool true if successful, false otherwise +// +bool HsaRsrcFactory::GetGpuAgentInfo(uint32_t idx, AgentInfo** agent_info) { + // Determine if request is valid + uint32_t size = uint32_t(gpu_list_.size()); + if (idx >= size) { + return false; + } + + // Copy AgentInfo from specified index + *agent_info = gpu_list_[idx]; + return true; +} + +// Get the AgentInfo handle of a Cpu device +// +// @param idx Cpu Agent at specified index +// +// @param agent_info Output parameter updated with AgentInfo +// +// @return bool true if successful, false otherwise +// +bool HsaRsrcFactory::GetCpuAgentInfo(uint32_t idx, AgentInfo** agent_info) { + // Determine if request is valid + uint32_t size = uint32_t(cpu_list_.size()); + if (idx >= size) { + return false; + } + + // Copy AgentInfo from specified index + *agent_info = cpu_list_[idx]; + return true; +} + +// Create a Queue object and return its handle. The queue object is expected +// to support user requested number of Aql dispatch packets. +// +// @param agent_info Gpu Agent on which to create a queue object +// +// @param num_Pkts Number of packets to be held by queue +// +// @param queue Output parameter updated with handle of queue object +// +// @return bool true if successful, false otherwise +// +bool HsaRsrcFactory::CreateQueue(AgentInfo* agent_info, uint32_t num_pkts, hsa_queue_t** queue) { + hsa_status_t status; + status = hsa_queue_create(agent_info->dev_id, num_pkts, HSA_QUEUE_TYPE_MULTI, NULL, NULL, + UINT32_MAX, UINT32_MAX, queue); + return (status == HSA_STATUS_SUCCESS); +} + +// Create a Signal object and return its handle. +// +// @param value Initial value of signal object +// +// @param signal Output parameter updated with handle of signal object +// +// @return bool true if successful, false otherwise +// +bool HsaRsrcFactory::CreateSignal(uint32_t value, hsa_signal_t* signal) { + hsa_status_t status; + status = hsa_signal_create(value, 0, NULL, signal); + return (status == HSA_STATUS_SUCCESS); +} + +// Allocate memory for use by a kernel of specified size in specified +// agent's memory region. Currently supports Global segment whose Kernarg +// flag set. +// +// @param agent_info Agent from whose memory region to allocate +// +// @param size Size of memory in terms of bytes +// +// @return uint8_t* Pointer to buffer, null if allocation fails. +// +uint8_t* HsaRsrcFactory::AllocateLocalMemory(AgentInfo* agent_info, size_t size) { + hsa_status_t status; + uint8_t* buffer = NULL; + + if (agent_info->coarse_region.handle != 0) { + // Allocate in local memory if it is available + status = hsa_memory_allocate(agent_info->coarse_region, size, (void**)&buffer); + if (status == HSA_STATUS_SUCCESS) { + status = hsa_memory_assign_agent(buffer, agent_info->dev_id, HSA_ACCESS_PERMISSION_RW); + } + } else { + // Allocate in system memory if local memory is not available + status = hsa_memory_allocate(agent_info->kernarg_region, size, (void**)&buffer); + } + + return (status == HSA_STATUS_SUCCESS) ? buffer : NULL; +} + +// Allocate memory tp pass kernel parameters. +// +// @param agent_info Agent from whose memory region to allocate +// +// @param size Size of memory in terms of bytes +// +// @return uint8_t* Pointer to buffer, null if allocation fails. +// +uint8_t* HsaRsrcFactory::AllocateSysMemory(AgentInfo* agent_info, size_t size) { + hsa_status_t status; + uint8_t* buffer = NULL; + status = hsa_memory_allocate(agent_info->kernarg_region, size, (void**)&buffer); + return (status == HSA_STATUS_SUCCESS) ? buffer : NULL; +} + +bool HsaRsrcFactory::TransferData(uint8_t* dest_buff, uint8_t* src_buff, uint32_t length, + bool host_to_dev) { + hsa_status_t status; + status = hsa_memory_copy(dest_buff, src_buff, length); + return (status == HSA_STATUS_SUCCESS); +} + +// Fake method for compilation steps only +uint8_t* HsaRsrcFactory::AllocateMemory(AgentInfo* agent_info, size_t size) { + hsa_status_t status; + uint8_t* buffer = NULL; + status = hsa_memory_allocate(agent_info->kernarg_region, size, (void**)&buffer); + return (status == HSA_STATUS_SUCCESS) ? buffer : NULL; +} + +// Loads an Assembled Brig file and Finalizes it into Device Isa +// +// @param agent_info Gpu device for which to finalize +// +// @param brig_path File path of the Assembled Brig file +// +// @param kernel_name Name of the kernel to finalize +// +// @param code_desc Handle of finalized Code Descriptor that could +// be used to submit for execution +// +// @return bool true if successful, false otherwise +// +bool HsaRsrcFactory::LoadAndFinalize(AgentInfo* agent_info, const char* brig_path, + char* kernel_name, hsa_executable_symbol_t* code_desc) { + // Finalize the Hsail object into code object + hsa_status_t status; + hsa_code_object_t code_object; + + // Build the code object filename + std::string filename(brig_path); + std::cout << "Code object filename: " << filename << std::endl; + + // Open the file containing code object + std::ifstream codeStream(filename.c_str(), std::ios::binary | std::ios::ate); + if (!codeStream) { + std::cout << "Error: failed to load " << filename << std::endl; + assert(false); + return false; + } + + // Allocate memory to read in code object from file + size_t size = std::string::size_type(codeStream.tellg()); + char* codeBuff = (char*)AllocateSysMemory(agent_info, size); + if (!codeBuff) { + std::cout << "Error: failed to allocate memory for code object." << std::endl; + assert(false); + return false; + } + + // Read the code object into allocated memory + codeStream.seekg(0, std::ios::beg); + std::copy(std::istreambuf_iterator(codeStream), std::istreambuf_iterator(), codeBuff); + + // De-Serialize the code object that has been read into memory + status = hsa_code_object_deserialize(codeBuff, size, NULL, &code_object); + if (status != HSA_STATUS_SUCCESS) { + std::cout << "Failed to deserialize code object" << std::endl; + return false; + } + + // Create executable. + hsa_executable_t hsaExecutable; + // status = hsa_executable_create(agent_info->profile, + status = + hsa_executable_create(HSA_PROFILE_FULL, HSA_EXECUTABLE_STATE_UNFROZEN, "", &hsaExecutable); + check("Error in creating executable object", status); + + // Load code object. + status = hsa_executable_load_code_object(hsaExecutable, agent_info->dev_id, code_object, ""); + check("Error in loading executable object", status); + + // Freeze executable. + status = hsa_executable_freeze(hsaExecutable, ""); + check("Error in freezing executable object", status); + + // Get symbol handle. + hsa_executable_symbol_t kernelSymbol; + status = hsa_executable_get_symbol(hsaExecutable, NULL, kernel_name, agent_info->dev_id, 0, + &kernelSymbol); + check("Error in looking up kernel symbol", status); + + // Update output parameter + *code_desc = kernelSymbol; + return true; +} + +// Add an instance of AgentInfo representing a Hsa Gpu agent +void HsaRsrcFactory::AddAgentInfo(AgentInfo* agent_info, bool gpu) { + // Add input to Gpu list + if (gpu) { + gpu_list_.push_back(agent_info); + return; + } + + // Add input to Cpu list + cpu_list_.push_back(agent_info); +} + +// Print the various fields of Hsa Gpu Agents +bool HsaRsrcFactory::PrintGpuAgents(const std::string& header) { + std::cout << header << " :" << std::endl; + + AgentInfo* agent_info; + int size = uint32_t(gpu_list_.size()); + for (int idx = 0; idx < size; idx++) { + agent_info = gpu_list_[idx]; + + std::cout << "> agent[" << idx << "] :" << std::endl; + std::cout << ">> Name : " << agent_info->name << std::endl; + std::cout << ">> Max Wave Size : " << agent_info->max_wave_size << std::endl; + std::cout << ">> Max Queue Size : " << agent_info->max_queue_size << std::endl; + std::cout << ">> Kernarg Region Id : " << agent_info->coarse_region.handle << std::endl; + } + return true; +} + +// Returns the file path where brig files is located. Value is +// available only after an instance has been built. +char* HsaRsrcFactory::GetBrigPath() { return HsaRsrcFactory::brig_path_; } + +// Returns the number of compute units present on platform +// Value is available only after an instance has been built. +uint32_t HsaRsrcFactory::GetNumOfCUs() { return HsaRsrcFactory::num_cus_; } + +// Returns the maximum number of waves that can be launched +// per compute unit. The actual number that can be launched +// is affected by resource availability +// +// Value is available only after an instance has been built. +uint32_t HsaRsrcFactory::GetNumOfWavesPerCU() { return HsaRsrcFactory::num_waves_; } + +// Returns the number of work-items that can execute per wave +// Value is available only after an instance has been built. +uint32_t HsaRsrcFactory::GetNumOfWorkItemsPerWave() { return HsaRsrcFactory::num_workitems_; } + +// Returns the number of times kernel loop body should execute. +// Value is available only after an instance has been built. +uint32_t HsaRsrcFactory::GetKernelLoopCount() { return HsaRsrcFactory::kernel_loop_count_; } + +// Returns boolean flag to indicate if debug info should be printed +// Value is available only after an instance has been built. +uint32_t HsaRsrcFactory::GetPrintDebugInfo() { return HsaRsrcFactory::print_debug_info_; } + +// Process command line arguments. The method will capture +// various user command line parameters for tests to use +void HsaRsrcFactory::ProcessCmdline() { + // Command line arguments are given + uint32_t idx; + uint32_t arg_idx; + for (idx = 1; idx < hsa_cmdline_arg_cnt; idx += 2) { + arg_idx = GetArgIndex((char*)hsa_cmdline_arg_list[idx]); + switch (arg_idx) { + case 0: + HsaRsrcFactory::brig_path_ = hsa_cmdline_arg_list[idx + 1]; + break; + case 1: + HsaRsrcFactory::num_cus_ = atoi(hsa_cmdline_arg_list[idx + 1]); + break; + case 2: + HsaRsrcFactory::num_waves_ = atoi(hsa_cmdline_arg_list[idx + 1]); + break; + case 3: + HsaRsrcFactory::num_workitems_ = atoi(hsa_cmdline_arg_list[idx + 1]); + break; + case 4: + HsaRsrcFactory::kernel_loop_count_ = atoi(hsa_cmdline_arg_list[idx + 1]); + break; + case 5: + HsaRsrcFactory::print_debug_info_ = true; + break; + } + } +} + +uint32_t HsaRsrcFactory::GetArgIndex(char* arg_value) { + // Map Brig file path to index zero + if (!strcmp(HsaRsrcFactory::brig_path_key_, arg_value)) { + return 0; + } + + // Map Number of Compute Units to index one + if (!strcmp(HsaRsrcFactory::num_cus_key_, arg_value)) { + return 1; + } + + // Map Number of Waves per CU to index two + if (!strcmp(HsaRsrcFactory::num_waves_key_, arg_value)) { + return 2; + } + + // Map Number of Workitems per Wave to index three + if (!strcmp(HsaRsrcFactory::num_workitems_key_, arg_value)) { + return 3; + } + + // Map Kernel Loop Count to index four + if (!strcmp(HsaRsrcFactory::kernel_loop_count_key_, arg_value)) { + return 4; + } + + // Map print debug info parameter + if (!strcmp(HsaRsrcFactory::print_debug_key_, arg_value)) { + return 5; + } + + return 108; +} + +void HsaRsrcFactory::PrintHelpMsg() { + std::cout << "Key for passing Brig filepath: " << HsaRsrcFactory::brig_path_key_ << std::endl; + std::cout << "Key for passing Number of Compute Units: " << HsaRsrcFactory::num_cus_key_ + << std::endl; + std::cout << "Key for passing Number of Waves per CU: " << HsaRsrcFactory::num_waves_key_ + << std::endl; + std::cout << "Key for passing Number of Workitems per Wave: " + << HsaRsrcFactory::num_workitems_key_ << std::endl; + std::cout << "Key for passing Kernel Loop Count: " << HsaRsrcFactory::kernel_loop_count_key_ + << std::endl; +} diff --git a/runtime/hsa-ext-aql-profile/test/common/hsa_rsrc_factory.hpp b/runtime/hsa-ext-aql-profile/test/common/hsa_rsrc_factory.hpp new file mode 100644 index 0000000000..5bab803783 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/common/hsa_rsrc_factory.hpp @@ -0,0 +1,262 @@ +#ifndef HSA_RSRC_FACTORY_H_ +#define HSA_RSRC_FACTORY_H_ + +#include +#include +#include +#include + +#include +#include +#include + +#include "hsatimer.h" +#include "hsa.h" +#include "hsa_ext_finalize.h" + +#define HSA_ARGUMENT_ALIGN_BYTES 16 +#define HSA_QUEUE_ALIGN_BYTES 64 +#define HSA_PACKET_ALIGN_BYTES 64 + +#define check(msg, status) \ + if (status != HSA_STATUS_SUCCESS) { \ + const char* emsg = 0; \ + hsa_status_string(status, &emsg); \ + printf("%s: %s\n", msg, emsg ? emsg : ""); \ + exit(1); \ + } + +#define check_build(msg, status) \ + if (status != STATUS_SUCCESS) { \ + printf("%s\n", msg); \ + exit(1); \ + } + +// Provide access to command line arguments passed in by user +extern uint32_t hsa_cmdline_arg_cnt; +extern char** hsa_cmdline_arg_list; + +// Encapsulates information about a Hsa Agent such as its +// handle, name, max queue size, max wavefront size, etc. +typedef struct { + // Handle of Agent + hsa_agent_t dev_id; + + // Agent type - Cpu = 0, Gpu = 1 or Dsp = 2 + uint32_t dev_type; + + // Name of Agent whose length is less than 64 + char name[64]; + + // Max size of Wavefront size + uint32_t max_wave_size; + + // Max size of Queue buffer + uint32_t max_queue_size; + + // Hsail profile supported by agent + hsa_profile_t profile; + + // Memory region supporting kernel parameters + hsa_region_t coarse_region; + + // Memory region supporting kernel arguments + hsa_region_t kernarg_region; + +} AgentInfo; + +class HsaRsrcFactory { + public: + // Constructor of the class. Will initialize the Hsa Runtime and + // query the system topology to get the list of Cpu and Gpu devices + HsaRsrcFactory(); + + // Destructor of the class + ~HsaRsrcFactory(); + + // Get the count of Hsa Gpu Agents available on the platform + // + // @return uint32_t Number of Gpu agents on platform + // + uint32_t GetCountOfGpuAgents(); + + // Get the count of Hsa Cpu Agents available on the platform + // + // @return uint32_t Number of Cpu agents on platform + // + uint32_t GetCountOfCpuAgents(); + + // Get the AgentInfo handle of a Gpu device + // + // @param idx Gpu Agent at specified index + // + // @param agent_info Output parameter updated with AgentInfo + // + // @return bool true if successful, false otherwise + // + bool GetGpuAgentInfo(uint32_t idx, AgentInfo** agent_info); + + // Get the AgentInfo handle of a Cpu device + // + // @param idx Cpu Agent at specified index + // + // @param agent_info Output parameter updated with AgentInfo + // + // @return bool true if successful, false otherwise + // + bool GetCpuAgentInfo(uint32_t idx, AgentInfo** agent_info); + + // Create a Queue object and return its handle. The queue object is expected + // to support user requested number of Aql dispatch packets. + // + // @param agent_info Gpu Agent on which to create a queue object + // + // @param num_Pkts Number of packets to be held by queue + // + // @param queue Output parameter updated with handle of queue object + // + // @return bool true if successful, false otherwise + // + bool CreateQueue(AgentInfo* agent_info, uint32_t num_pkts, hsa_queue_t** queue); + + // Create a Signal object and return its handle. + // + // @param value Initial value of signal object + // + // @param signal Output parameter updated with handle of signal object + // + // @return bool true if successful, false otherwise + // + bool CreateSignal(uint32_t value, hsa_signal_t* signal); + + // Allocate memory for use by a kernel of specified size in specified + // agent's memory region. Currently supports Global segment whose Kernarg + // flag set. + // + // @param agent_info Agent from whose memory region to allocate + // + // @param size Size of memory in terms of bytes + // + // @return uint8_t* Pointer to buffer, null if allocation fails. + // + uint8_t* AllocateLocalMemory(AgentInfo* agent_info, size_t size); + uint8_t* AllocateMemory(AgentInfo* agent_info, size_t size); + + bool TransferData(uint8_t* dest_buff, uint8_t* src_buff, uint32_t length, bool host_to_dev); + + // Allocate memory tp pass kernel parameters. + // + // @param agent_info Agent from whose memory region to allocate + // + // @param size Size of memory in terms of bytes + // + // @return uint8_t* Pointer to buffer, null if allocation fails. + // + uint8_t* AllocateSysMemory(AgentInfo* agent_info, size_t size); + + // Loads an Assembled Brig file and Finalizes it into Device Isa + // + // @param agent_info Gpu device for which to finalize + // + // @param brig_path File path of the Assembled Brig file + // + // @param kernel_name Name of the kernel to finalize + // + // @param code_desc Handle of finalized Code Descriptor that could + // be used to submit for execution + // + // @return bool true if successful, false otherwise + // + bool LoadAndFinalize(AgentInfo* agent_info, const char* brig_path, char* kernel_name, + hsa_executable_symbol_t* code_desc); + + // Add an instance of AgentInfo representing a Hsa Gpu agent + void AddAgentInfo(AgentInfo* agent_info, bool gpu); + + // Returns the file path where brig files is located + static char* GetBrigPath(); + + // Returns the number of compute units present on platform + static uint32_t GetNumOfCUs(); + + // Returns the maximum number of waves that can be launched + // per compute unit. The actual number that can be launched + // is affected by resource availability + static uint32_t GetNumOfWavesPerCU(); + + // Returns the number of work-items that can execute per wave + static uint32_t GetNumOfWorkItemsPerWave(); + + // Returns the number of times kernel loop body should execute. + static uint32_t GetKernelLoopCount(); + + // Returns boolean flag to indicate if debug info should be printed + static uint32_t GetPrintDebugInfo(); + + // Print the various fields of Hsa Gpu Agents + bool PrintGpuAgents(const std::string& header); + + private: + // Number of queues to create + uint32_t num_queues_; + + // Used to maintain a list of Hsa Queue handles + std::vector queue_list_; + + // Number of Signals to create + uint32_t num_signals_; + + // Used to maintain a list of Hsa Signal handles + std::vector signal_list_; + + // Number of agents reported by platform + uint32_t num_agents_; + + // Used to maintain a list of Hsa Gpu Agent Info + std::vector gpu_list_; + + // Used to maintain a list of Hsa Cpu Agent Info + std::vector cpu_list_; + + // Records the file path where Brig file is located. + // Value is available only after an instance has been built. + static char* brig_path_; + static char* brig_path_key_; + + // Records the number of Compute units present on system. + // Value is available only after an instance has been built. + static uint32_t num_cus_; + static char* num_cus_key_; + + // Records the number of waves that can be launched per Compute unit + // Value is available only after an instance has been built. + static uint32_t num_waves_; + static char* num_waves_key_; + + // Records the number of work-items that can be packed into a wave + // Value is available only after an instance has been built. + static uint32_t num_workitems_; + static char* num_workitems_key_; + + // Records the number of times kernel loop body should run. Value + // is available only after an instance has been built. + static uint32_t kernel_loop_count_; + static char* kernel_loop_count_key_; + + // Records the number of times kernel loop body should run. Value + // is available only after an instance has been built. + static bool print_debug_info_; + static char* print_debug_key_; + + // Process command line arguments. The method will capture + // various user command line parameters for tests to use + static void ProcessCmdline(); + + // Prints the help banner on user arg keys + static void PrintHelpMsg(); + + // Maps an index for the user argument + static uint32_t GetArgIndex(char* arg_value); +}; + +#endif // HSA_RSRC_FACTORY_H_ diff --git a/runtime/hsa-ext-aql-profile/test/common/hsatimer.cpp b/runtime/hsa-ext-aql-profile/test/common/hsatimer.cpp new file mode 100644 index 0000000000..fafaa77ef1 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/common/hsatimer.cpp @@ -0,0 +1,168 @@ +#include "hsatimer.h" + +PerfTimer::PerfTimer() { freq_in_100mhz = MeasureTSCFreqHz(); } + +PerfTimer::~PerfTimer() { + while (!_timers.empty()) { + Timer* temp = _timers.back(); + _timers.pop_back(); + delete temp; + } +} + +// a new cretaed timer instantance index will be returned +int PerfTimer::CreateTimer() { + Timer* newTimer = new Timer; + newTimer->_start = 0; + newTimer->_clocks = 0; + +#ifdef _WIN32 + QueryPerformanceFrequency((LARGE_INTEGER*)&newTimer->_freq); +#else + newTimer->_freq = (long long)1.0E3; +#endif + + /* Push back the address of new Timer instance created */ + _timers.push_back(newTimer); + return (int)(_timers.size() - 1); +} + +int PerfTimer::StartTimer(int index) { + if (index >= (int)_timers.size()) { + Error("Cannot reset timer. Invalid handle."); + return HSA_FAILURE; + } + +#ifdef _WIN32 +// General Windows timing method +#ifndef _AMD + long long tmpStart; + QueryPerformanceCounter((LARGE_INTEGER*)&(tmpStart)); + _timers[index]->_start = (double)tmpStart; +#else +// AMD Windows timing method + +#endif + +#else +// General Linux timing method +#ifndef _AMD + struct timeval s; + gettimeofday(&s, 0); + _timers[index]->_start = s.tv_sec * 1.0E3 + ((double)(s.tv_usec / 1.0E3)); +#else + + // AMD timing method + + unsigned int unused; + _timers[index]->_start = __rdtscp(&unused); + +#endif + +#endif + + return HSA_SUCCESS; +} + + +int PerfTimer::StopTimer(int index) { + double n = 0; + if (index >= (int)_timers.size()) { + Error("Cannot reset timer. Invalid handle."); + return HSA_FAILURE; + } +#ifdef _WIN32 +#ifndef _AMD + long long n1; + QueryPerformanceCounter((LARGE_INTEGER*)&(n1)); + n = (double)n1; +#else + +// AMD Window Timing + +#endif + +#else +// General Linux timing method +#ifndef _AMD + struct timeval s; + gettimeofday(&s, 0); + n = s.tv_sec * 1.0E3 + (double)(s.tv_usec / 1.0E3); +#else + // AMD Linux timing + + unsigned int unused; + n = __rdtscp(&unused); +#endif + +#endif + + n -= _timers[index]->_start; + _timers[index]->_start = 0; + +#ifndef _AMD + _timers[index]->_clocks += n; +#else + //_timers[index]->_clocks += 10 * n /freq_in_100mhz; // unit is ns + _timers[index]->_clocks += 1.0E-6 * 10 * n / freq_in_100mhz; // convert to ms + cout << "_AMD is enabled!!!" << endl; +#endif + + return HSA_SUCCESS; +} + +void PerfTimer::Error(string str) { cout << str << endl; } + + +double PerfTimer::ReadTimer(int index) { + if (index >= (int)_timers.size()) { + Error("Cannot read timer. Invalid handle."); + return HSA_FAILURE; + } + + double reading = double(_timers[index]->_clocks); + + reading = double(reading / _timers[index]->_freq); + + return reading; +} + + +uint64_t PerfTimer::CoarseTimestampUs() { +#ifdef _WIN32 + uint64_t freqHz, ticks; + QueryPerformanceFrequency((LARGE_INTEGER*)&freqHz); + QueryPerformanceCounter((LARGE_INTEGER*)&ticks); + + // Scale numerator and divisor until (ticks * 1000000) fits in uint64_t. + while (ticks > (1ULL << 44)) { + ticks /= 16; + freqHz /= 16; + } + + return (ticks * 1000000) / freqHz; +#else + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC_RAW, &ts); + return uint64_t(ts.tv_sec) * 1000000 + ts.tv_nsec / 1000; +#endif +} + +uint64_t PerfTimer::MeasureTSCFreqHz() { + // Make a coarse interval measurement of TSC ticks for 1 gigacycles. + unsigned int unused; + uint64_t tscTicksEnd; + + uint64_t coarseBeginUs = CoarseTimestampUs(); + uint64_t tscTicksBegin = __rdtscp(&unused); + do { + tscTicksEnd = __rdtscp(&unused); + } while (tscTicksEnd - tscTicksBegin < 1000000000); + + uint64_t coarseEndUs = CoarseTimestampUs(); + + // Compute the TSC frequency and round to nearest 100MHz. + uint64_t coarseIntervalNs = (coarseEndUs - coarseBeginUs) * 1000; + uint64_t tscIntervalTicks = tscTicksEnd - tscTicksBegin; + return (tscIntervalTicks * 10 + (coarseIntervalNs / 2)) / coarseIntervalNs; +} diff --git a/runtime/hsa-ext-aql-profile/test/common/hsatimer.h b/runtime/hsa-ext-aql-profile/test/common/hsatimer.h new file mode 100644 index 0000000000..a8dd66d54f --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/common/hsatimer.h @@ -0,0 +1,68 @@ +#ifndef __MYTIME__ +#define __MYTIME__ + +// Will use AMD timer and general Linux timer based on users' need --> compilation flag +// need to consider platform is Windows or Linux + +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +#if defined(_MSC_VER) +#include +#include +#include +#else +#if defined(__GNUC__) +#include +#include +#endif // __GNUC__ +#endif //_MSC_VER + +#define HSA_FAILURE 1 +#define HSA_SUCCESS 0 + +class PerfTimer { + private: + struct Timer { + string name; /* < name name of time object*/ + long long _freq; /* < _freq frequency*/ + double _clocks; /* < _clocks number of ticks at end*/ + double _start; /* < _start start point ticks*/ + }; + + std::vector _timers; /*< _timers vector to Timer objects */ + double freq_in_100mhz; + + public: + PerfTimer(); + ~PerfTimer(); + + private: + // AMD timing method + uint64_t CoarseTimestampUs(); + uint64_t MeasureTSCFreqHz(); + + // General Linux timing method + + public: + int CreateTimer(); + int StartTimer(int index); + int StopTimer(int index); + + public: + // retrieve time + double ReadTimer(int index); + // write into a file + double WriteTimer(int index); + + public: + void Error(string str); +}; + +#endif diff --git a/runtime/hsa-ext-aql-profile/test/ctrl/test.cpp b/runtime/hsa-ext-aql-profile/test/ctrl/test.cpp new file mode 100644 index 0000000000..5da9952fd1 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/ctrl/test.cpp @@ -0,0 +1,91 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#include +#include "simple_convolution.h" +#include "test_hsa.h" +#include "test_pgen_pmc.h" +#include "test_pgen_sqtt.h" + +int main(int argc, char* argv[]) { +#if defined(NDEBUG) + clog.rdbuf(NULL); +#endif + + bool ret_val = true; + + // Create SimpleConvolution test object + TestKernel* test_kernel = new SimpleConvolution(); + TestAql* test_aql = new TestHSA(test_kernel); + + const bool pmc_enable = (getenv("ROCR_ENABLE_PMC") != NULL); + const bool sqtt_enable = (getenv("ROCR_ENABLE_SQTT") != NULL); + if (pmc_enable) + test_aql = new TestPGenPMC(test_aql); + else if (sqtt_enable) + test_aql = new TestPGenSQTT(test_aql); + assert(test_aql != NULL); + if (test_aql == NULL) return 1; + + // Initialization of Hsa Runtime + ret_val = test_aql->initialize(argc, argv); + if (ret_val == false) { + std::cout << "Error in the test initialization" << std::endl; + assert(ret_val); + return 1; + } + + // Setup Hsa resources needed for execution + ret_val = test_aql->setup(); + if (ret_val == false) { + std::cout << "Error in creating hsa resources" << std::endl; + assert(ret_val); + return 1; + } + + // Run SimpleConvolution kernel + ret_val = test_aql->run(); + if (ret_val == false) { + std::cout << "Error in running the test kernel" << std::endl; + assert(ret_val); + return 1; + } + + // Verify the results of the execution + ret_val = test_aql->verify_results(); + if (ret_val) { + std::cout << "Test : Passed" << std::endl; + } else { + std::cout << "Test : Failed" << std::endl; + } + + // Print time taken by sample + test_aql->print_time(); + test_aql->cleanup(); + + return (ret_val) ? 0 : 1; +} diff --git a/runtime/hsa-ext-aql-profile/test/ctrl/test_aql.h b/runtime/hsa-ext-aql-profile/test/ctrl/test_aql.h new file mode 100644 index 0000000000..a7ac177e20 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/ctrl/test_aql.h @@ -0,0 +1,87 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#ifndef _TESTAQL_H_ +#define _TESTAQL_H_ + +#include "hsa.h" +#include "hsa_rsrc_factory.hpp" +#include "hsa_ext_amd_aql_profile.h" + +#define test_assert(cond) \ + { \ + if (cond) { \ + std::cout << "ASSERT FAILED: " << #cond << " : " << __FILE__ << "(" << __LINE__ << ")" \ + << std::endl; \ + abort(); \ + } \ + } + +// Test AQL interface +class TestAql { + TestAql* const test_aql; + + public: + TestAql(TestAql* t = 0) : test_aql(t) {} + virtual ~TestAql() {} + + TestAql* testAql() { return test_aql; } + virtual AgentInfo* getAgentInfo() { return (test_aql) ? test_aql->getAgentInfo() : 0; } + virtual hsa_queue_t* getQueue() { return (test_aql) ? test_aql->getQueue() : 0; } + virtual HsaRsrcFactory* getRsrcFactory() { return (test_aql) ? test_aql->getRsrcFactory() : 0; } + + // Initialize application environment including setting + // up of various configuration parameters based on + // command line arguments + // @return bool true on success and false on failure + virtual bool initialize(int argc, char** argv) { + return (test_aql) ? test_aql->initialize(argc, argv) : true; + } + + // Setup application parameters for exectuion + // @return bool true on success and false on failure + virtual bool setup() { return (test_aql) ? test_aql->setup() : true; } + + // Run the kernel + // @return bool true on success and false on failure + virtual bool run() { return (test_aql) ? test_aql->run() : true; } + + // Verify results + // @return bool true on success and false on failure + virtual bool verify_results() { return (test_aql) ? test_aql->verify_results() : true; } + + // Print to console the time taken to execute kernel + virtual void print_time() { + if (test_aql) test_aql->print_time(); + } + + // Release resources e.g. memory allocations + // @return bool true on success and false on failure + virtual bool cleanup() { return (test_aql) ? test_aql->cleanup() : true; } +}; + +#endif // _TESTAQL_H_ diff --git a/runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.cpp b/runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.cpp new file mode 100644 index 0000000000..06c589b70d --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.cpp @@ -0,0 +1,234 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#include "os.h" +#include "helper_funcs.hpp" +#include "hsa_rsrc_factory.hpp" +#include "test_hsa.h" + +bool TestHSA::initialize(int arg_cnt, char** arg_list) { + std::cout << "TestHSA::initialize :" << std::endl; + // Initialize command line arguments + hsa_cmdline_arg_cnt = arg_cnt; + hsa_cmdline_arg_list = arg_list; + + // Instantiate a Timer object + setup_timer_idx_ = hsa_timer_.CreateTimer(); + dispatch_timer_idx_ = hsa_timer_.CreateTimer(); + + // Instantiate an instance of Hsa Resources Factory + hsa_rsrc_ = new HsaRsrcFactory(); + + // Print properties of the agents + hsa_rsrc_->PrintGpuAgents("> GPU agents"); + + // Create an instance of Gpu agent + const char* p = getenv("ROCR_AGENT_IND"); + const uint32_t agent_ind = (p == NULL) ? 0 : atol(p); + if (!hsa_rsrc_->GetGpuAgentInfo(agent_ind, &agent_info_)) { + std::cout << "> error: agent[" << agent_ind << "] is not found" << std::endl; + return false; + } + std::cout << "> Using agent[" << agent_ind << "] : " << agent_info_->name << std::endl; + + // Create an instance of Aql Queue + uint32_t num_pkts = 128; + hsa_rsrc_->CreateQueue(agent_info_, num_pkts, &hsa_queue_); + + // Obtain handle of signal + hsa_rsrc_->CreateSignal(1, &hsa_signal_); + + // Obtain the code object file name + std::string agentName(agent_info_->name); + if (agentName.compare(0, 4, "gfx8") == 0) { + brig_path_obj_.append("gfx8"); + } else if (agentName.compare(0, 4, "gfx9") == 0) { + brig_path_obj_.append("gfx9"); + } else { + assert(false); + return false; + } + brig_path_obj_.append("_" + name_ + ".hsaco"); + + return true; +} + +bool TestHSA::setup() { + std::cout << "TestHSA::setup :" << std::endl; + + // Start the timer object + hsa_timer_.StartTimer(setup_timer_idx_); + + mem_map_t& mem_map = test_->get_mem_map(); + for (mem_it_t it = mem_map.begin(); it != mem_map.end(); ++it) { + mem_descr_t& des = it->second; + void* ptr = (des.local) ? hsa_rsrc_->AllocateLocalMemory(agent_info_, des.size) + : hsa_rsrc_->AllocateSysMemory(agent_info_, des.size); + des.ptr = ptr; + assert(ptr != NULL); + if (ptr == NULL) return false; + } + test_->init(); + + // Load and Finalize Kernel Code Descriptor + char* brig_path = (char*)brig_path_obj_.c_str(); + const bool ret_val = + hsa_rsrc_->LoadAndFinalize(agent_info_, brig_path, strdup(name_.c_str()), &kernel_code_desc_); + if (ret_val == false) { + std::cout << "Error in loading and finalizing Kernel" << std::endl; + return ret_val; + } + + // Stop the timer object + hsa_timer_.StopTimer(setup_timer_idx_); + setup_time_taken_ = hsa_timer_.ReadTimer(setup_timer_idx_); + total_time_taken_ = setup_time_taken_; + + return true; +} + +bool TestHSA::run() { + std::cout << "TestHSA::run :" << std::endl; + + const uint32_t work_group_size = 64; + const uint32_t work_grid_size = test_->get_elements_count(); + uint32_t group_segment_size = 0; + uint32_t private_segment_size = 0; + const size_t kernarg_segment_size = test_->get_kernarg_size(); + uint64_t code_handle = 0; + + // Retrieve the amount of group memory needed + hsa_executable_symbol_get_info( + kernel_code_desc_, HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_GROUP_SEGMENT_SIZE, &group_segment_size); + + // Retrieve the amount of private memory needed + hsa_executable_symbol_get_info(kernel_code_desc_, + HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE, + &private_segment_size); + + // Check the kernel args size + size_t size_info = 0; + hsa_executable_symbol_get_info( + kernel_code_desc_, HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_SIZE, &size_info); + assert(kernarg_segment_size == size_info); + if (kernarg_segment_size != size_info) return false; + + // Retrieve handle of the code block + hsa_executable_symbol_get_info(kernel_code_desc_, HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_OBJECT, + &code_handle); + + // Initialize the dispatch packet. + hsa_kernel_dispatch_packet_t aql; + memset(&aql, 0, sizeof(aql)); + // Set the packet's type, acquire and release fences + aql.header = HSA_PACKET_TYPE_KERNEL_DISPATCH; + aql.header |= HSA_FENCE_SCOPE_SYSTEM << HSA_PACKET_HEADER_ACQUIRE_FENCE_SCOPE; + aql.header |= HSA_FENCE_SCOPE_SYSTEM << HSA_PACKET_HEADER_RELEASE_FENCE_SCOPE; + // Populate Aql packet with default values + aql.setup = 1; + aql.grid_size_x = work_grid_size; + aql.grid_size_y = 1; + aql.grid_size_z = 1; + aql.workgroup_size_x = work_group_size; + aql.workgroup_size_y = 1; + aql.workgroup_size_z = 1; + // Bind the kernel code descriptor and arguments + aql.kernel_object = code_handle; + aql.kernarg_address = test_->get_kernarg_ptr(); + aql.group_segment_size = group_segment_size; + aql.private_segment_size = private_segment_size; + // Initialize Aql packet with handle of signal + aql.completion_signal = hsa_signal_; + + // Compute the write index of queue and copy Aql packet into it + const uint64_t que_idx = hsa_queue_load_write_index_relaxed(hsa_queue_); + const uint32_t mask = hsa_queue_->size - 1; + + std::cout << "> Executing kernel: \"" << name_ << "\"" << std::endl; + + // Start the timer object + hsa_timer_.StartTimer(dispatch_timer_idx_); + + // Disable packet so that submission to HW is complete + const auto header = aql.header; + const uint8_t packet_type_mask = (1 << HSA_PACKET_HEADER_WIDTH_TYPE) - 1; + aql.header &= (~packet_type_mask) << HSA_PACKET_HEADER_TYPE; + aql.header |= HSA_PACKET_TYPE_INVALID << HSA_PACKET_HEADER_TYPE; + + // Copy Aql packet into queue buffer + ((hsa_kernel_dispatch_packet_t*)(hsa_queue_->base_address))[que_idx & mask] = aql; + + // After AQL packet is fully copied into queue buffer + // update packet header from invalid state to valid state + std::atomic_thread_fence(std::memory_order_release); + ((hsa_kernel_dispatch_packet_t*)(hsa_queue_->base_address))[que_idx & mask].header = header; + + // Increment the write index and ring the doorbell to dispatch the kernel. + hsa_queue_store_write_index_relaxed(hsa_queue_, (que_idx + 1)); + hsa_signal_store_relaxed(hsa_queue_->doorbell_signal, que_idx); + + std::cout << "> Waiting on kernel dispatch signal" << std::endl; + + // Wait on the dispatch signal until the kernel is finished. + // Update wait condition to HSA_WAIT_STATE_ACTIVE for Polling + hsa_signal_value_t value = hsa_signal_wait_acquire(hsa_signal_, HSA_SIGNAL_CONDITION_LT, 1, + (uint64_t)-1, HSA_WAIT_STATE_BLOCKED); + + // Stop the timer object + hsa_timer_.StopTimer(dispatch_timer_idx_); + dispatch_time_taken_ = hsa_timer_.ReadTimer(dispatch_timer_idx_); + total_time_taken_ += dispatch_time_taken_; + + // Copy kernel buffers from local memory into system memory + hsa_rsrc_->TransferData((uint8_t*)test_->get_output_ptr(), (uint8_t*)test_->get_local_ptr(), + test_->get_output_size(), false); + test_->print_output(); + + return true; +} + +bool TestHSA::verify_results() { + // Compare the results and see if they match + const int32_t cmp_val = + memcmp(test_->get_output_ptr(), test_->get_refout_ptr(), test_->get_output_size()); + return (cmp_val == 0); +} + +void TestHSA::print_time() { + std::cout << "Time taken for Setup by " << this->name_ << " : " << this->setup_time_taken_ + << std::endl; + std::cout << "Time taken for Dispatch by " << this->name_ << " : " << this->dispatch_time_taken_ + << std::endl; + std::cout << "Time taken in Total by " << this->name_ << " : " << this->total_time_taken_ + << std::endl; +} + +bool TestHSA::cleanup() { + // shutdown Hsa Runtime system + hsa_status_t ret_val = hsa_shut_down(); + return (HSA_STATUS_SUCCESS == ret_val); +} diff --git a/runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.h b/runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.h new file mode 100644 index 0000000000..342d4be8bf --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/ctrl/test_hsa.h @@ -0,0 +1,115 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#ifndef _TEST_HSA_H_ +#define _TEST_HSA_H_ + +#include "test_aql.h" +#include "test_kernel.h" +#include "hsa_rsrc_factory.hpp" + +// Class implements HSA test +class TestHSA : public TestAql { + public: + // Constructor + TestHSA(TestKernel* test) : test_(test), name_(test->Name()) { + total_time_taken_ = 0; + setup_time_taken_ = 0; + dispatch_time_taken_ = 0; + } + + // Get methods for Agent Info, HAS queue, HSA Resourcse Manager + AgentInfo* getAgentInfo() { return agent_info_; } + hsa_queue_t* getQueue() { return hsa_queue_; } + HsaRsrcFactory* getRsrcFactory() { return hsa_rsrc_; } + + // Initialize application environment including setting + // up of various configuration parameters based on + // command line arguments + // @return bool true on success and false on failure + bool initialize(int argc, char** argv); + + // Setup application parameters for exectuion + // @return bool true on success and false on failure + bool setup(); + + // Run the BinarySearch kernel + // @return bool true on success and false on failure + bool run(); + + // Verify against reference implementation + // @return bool true on success and false on failure + bool verify_results(); + + // Print to console the time taken to execute kernel + void print_time(); + + // Release resources e.g. memory allocations + // @return bool true on success and false on failure + bool cleanup(); + + private: + typedef TestKernel::mem_descr_t mem_descr_t; + typedef TestKernel::mem_map_t mem_map_t; + typedef TestKernel::mem_it_t mem_it_t; + + // Test object + TestKernel* test_; + + // Path of Brig file + std::string brig_path_obj_; + + // Used to track time taken to run the sample + double total_time_taken_; + double setup_time_taken_; + double dispatch_time_taken_; + + // Handle to an Hsa Gpu Agent + AgentInfo* agent_info_; + + // Handle to an Hsa Queue + hsa_queue_t* hsa_queue_; + + // Handle of signal + hsa_signal_t hsa_signal_; + + // Handle of Kernel Code Descriptor + hsa_executable_symbol_t kernel_code_desc_; + + // Instance of timer object + uint32_t setup_timer_idx_; + uint32_t dispatch_timer_idx_; + PerfTimer hsa_timer_; + + // Instance of Hsa Resources Factory + HsaRsrcFactory* hsa_rsrc_; + + // Test kernel name + std::string name_; +}; + +#endif // _TEST_HSA_H_ diff --git a/runtime/hsa-ext-aql-profile/test/ctrl/test_kernel.h b/runtime/hsa-ext-aql-profile/test/ctrl/test_kernel.h new file mode 100644 index 0000000000..7af51e3c1f --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/ctrl/test_kernel.h @@ -0,0 +1,105 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#ifndef _TEST_KERNEL_H_ +#define _TEST_KERNEL_H_ + +#include +#include + +// Class implements Kernel test +class TestKernel { + public: + // Memory descriptors IDs + enum { INPUT_DES_ID, OUTPUT_DES_ID, LOCAL_DES_ID, MASK_DES_ID, KERNARG_DES_ID, REFOUT_DES_ID }; + + // Memory descriptors vector declaration + struct mem_descr_t { + void* ptr; + uint32_t size; + bool local; + }; + + // Memory map declaration + typedef std::map mem_map_t; + typedef mem_map_t::iterator mem_it_t; + typedef mem_map_t::const_iterator mem_const_it_t; + + // Initialize method + virtual void init() = 0; + + // Return kernel memory map + mem_map_t& get_mem_map() { return mem_map_; } + + // Return NULL descriptor + static mem_descr_t null_descriptor() { return {0, 0, 0}; } + + // Methods to get the kernel attributes + void* get_kernarg_ptr() const { return get_descr(KERNARG_DES_ID).ptr; } + uint32_t get_kernarg_size() const { return get_descr(KERNARG_DES_ID).size; } + void* get_output_ptr() const { return get_descr(OUTPUT_DES_ID).ptr; } + uint32_t get_output_size() const { return get_descr(OUTPUT_DES_ID).size; } + void* get_local_ptr() const { return get_descr(LOCAL_DES_ID).ptr; } + void* get_refout_ptr() const { return get_descr(REFOUT_DES_ID).ptr; } + virtual uint32_t get_elements_count() const = 0; + + // Print output + virtual void print_output() const = 0; + + // Return name + virtual std::string Name() const = 0; + + protected: + // Set system memory descriptor + bool set_sys_descr(const uint32_t& id, const uint32_t& size) { + return set_mem_descr(id, size, false); + } + + // Set local memory descriptor + bool set_local_descr(const uint32_t& id, const uint32_t& size) { + return set_mem_descr(id, size, true); + } + + // Get memory descriptor + mem_descr_t get_descr(const uint32_t& id) const { + mem_const_it_t it = mem_map_.find(id); + return (it != mem_map_.end()) ? it->second : null_descriptor(); + } + + private: + // Set memory descriptor + bool set_mem_descr(const uint32_t& id, const uint32_t& size, const bool& local) { + const mem_descr_t des = {NULL, size, local}; + auto ret = mem_map_.insert(mem_map_t::value_type(id, des)); + return ret.second; + } + + // Kernel memory map object + mem_map_t mem_map_; +}; + +#endif // _TEST_KERNEL_H_ diff --git a/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen.h b/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen.h new file mode 100644 index 0000000000..8102c3cf0f --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen.h @@ -0,0 +1,46 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#ifndef _TEST_PGEN_H_ +#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 { + 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) {} +}; + +#endif // _TEST_PGEN_H_ diff --git a/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_pmc.h b/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_pmc.h new file mode 100644 index 0000000000..b3f5239c8b --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_pmc.h @@ -0,0 +1,142 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#ifndef _TEST_PGEN_PMC_H_ +#define _TEST_PGEN_PMC_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, + void* callback_data) { + hsa_status_t status = HSA_STATUS_SUCCESS; + typedef std::vector passed_data_t; + reinterpret_cast(callback_data)->push_back(*info_data); + return status; +} + +// SimpleConvolution: Class implements OpenCL SimpleConvolution sample +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]; + + bool buildPackets() { return true; } + + bool dumpData() { + std::cout << "TestPGenPMC::dumpData :" << std::endl; + + typedef std::vector callback_data_t; + + callback_data_t data; + hsa_ext_amd_aql_profile_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; + } + + return true; + } + + public: + 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; + + hsa_status_t status; + hsa_agent_t agent; + uint32_t command_buffer_alignment; + uint32_t command_buffer_size; + uint32_t output_buffer_alignment; + uint32_t output_buffer_size; + + // GPU identificator + agent = getAgentInfo()->dev_id; + + // 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 + + // Initialization the profile + memset(&profile, 0, sizeof(profile)); + profile.agent = agent; + profile.type = HSA_EXT_AQL_PROFILE_EVENT_PMC; + + // set enabled events list + profile.events = events; + profile.event_count = 2; + + // 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); + 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); + assert(status == HSA_STATUS_SUCCESS); + + // Application is allocating the command buffer + // Allocate(command_buffer_alignment, command_buffer_size, + // MODE_HOST_ACC|MODE_DEV_ACC|MODE_EXEC_DATA) + profile.command_buffer.ptr = + getRsrcFactory()->AllocateSysMemory(getAgentInfo(), command_buffer_size); + profile.command_buffer.size = command_buffer_size; + + // Application is allocating the output buffer + // Allocate(output_buffer_alignment, output_buffer_size, + // MODE_HOST_ACC|MODE_DEV_ACC) + profile.output_buffer.ptr = + getRsrcFactory()->AllocateSysMemory(getAgentInfo(), output_buffer_size); + profile.output_buffer.size = output_buffer_size; + memset(profile.output_buffer.ptr, 0x77, output_buffer_size); + + // Populating the AQL start packet + status = hsa_ext_amd_aql_profile_start(&profile, PrePacket()); + 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()); + assert(status == HSA_STATUS_SUCCESS); + + return (status == HSA_STATUS_SUCCESS); + } +}; + +#endif // _TEST_PGEN_PMC_H_ diff --git a/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_sqtt.h b/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_sqtt.h new file mode 100644 index 0000000000..c4728258c7 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/ctrl/test_pgen_sqtt.h @@ -0,0 +1,160 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#ifndef _TEST_PGEN_SQTT_H_ +#define _TEST_PGEN_SQTT_H_ + +#include +#include +#include + +#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, + void* callback_data) { + hsa_status_t status = HSA_STATUS_SUCCESS; + typedef std::vector passed_data_t; + reinterpret_cast(callback_data)->push_back(*info_data); + return status; +} + +// SimpleConvolution: Class implements OpenCL SimpleConvolution sample +class TestPGenSQTT : public TestPGen { + const static uint32_t buffer_alignment = 0x1000; // 4K + const static uint32_t buffer_size = 0x2000000; // 32M + + hsa_agent_t agent; + hsa_ext_amd_aql_profile_profile_t profile; + + bool buildPackets() { return true; } + + bool dumpData() { + std::cout << "TestPGenSQTT::dumpData :" << std::endl; + + typedef std::vector callback_data_t; + + callback_data_t data; + hsa_ext_amd_aql_profile_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; + + void* sys_buf = getRsrcFactory()->AllocateSysMemory(getAgentInfo(), it->sqtt_data.size); + assert(sys_buf != NULL); + if (sys_buf == NULL) return HSA_STATUS_ERROR; + + hsa_status_t status = hsa_memory_copy(sys_buf, it->sqtt_data.ptr, it->sqtt_data.size); + assert(status == HSA_STATUS_SUCCESS); + if (status != HSA_STATUS_SUCCESS) return status; + + std::string file_name; + file_name.append("sqtt_dump_"); + file_name.append(std::to_string(it->sample_id)); + file_name.append(".txt"); + std::ofstream out_file; + out_file.open(file_name); + + // Write the buffer in terms of shorts (16 bits) + short* sqtt_data = (short*)sys_buf; + for (int i = 0; i < (it->sqtt_data.size / sizeof(short)); ++i) { + out_file << std::setw(4) << std::setfill('0') << std::hex << sqtt_data[i] << "\n"; + } + + out_file.close(); + } + + return true; + } + + public: + 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; + + hsa_status_t status; + hsa_agent_t agent; + uint32_t command_buffer_alignment; + uint32_t command_buffer_size; + uint32_t output_buffer_alignment; + uint32_t output_buffer_size; + + // GPU identificator + agent = getAgentInfo()->dev_id; + + // Instantiation of the profile object + // ////////////////////////////////////////////////////////////// + // Set the parameters + // parameters = ....; + + // Initialization the profile + memset(&profile, 0, sizeof(profile)); + profile.agent = agent; + profile.type = HSA_EXT_AQL_PROFILE_EVENT_SQTT; + + // set parameters + // profile.parameters = &event; + // profile.parameter_count = 1; + + // 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); + assert(status == HSA_STATUS_SUCCESS); + + output_buffer_alignment = buffer_alignment; + output_buffer_size = buffer_size; + + // Application is allocating the command buffer + // AllocateSystem(command_buffer_alignment, command_buffer_size, + // MODE_HOST_ACC|MODE_DEV_ACC|MODE_EXEC_DATA) + profile.command_buffer.ptr = + getRsrcFactory()->AllocateSysMemory(getAgentInfo(), command_buffer_size); + profile.command_buffer.size = command_buffer_size; + + // Application is allocating the output buffer + // AllocateLocal(output_buffer_alignment, output_buffer_size, + // MODE_DEV_ACC) + profile.output_buffer.ptr = + getRsrcFactory()->AllocateLocalMemory(getAgentInfo(), output_buffer_size); + profile.output_buffer.size = output_buffer_size; + + // Populating the AQL start packet + status = hsa_ext_amd_aql_profile_start(&profile, PrePacket()); + 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()); + assert(status == HSA_STATUS_SUCCESS); + + return (status == HSA_STATUS_SUCCESS); + } +}; + +#endif // _TEST_PGEN_SQTT_H_ diff --git a/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.cpp b/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.cpp new file mode 100644 index 0000000000..33c071bc17 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.cpp @@ -0,0 +1,98 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#include +#include + +#include "test_pmgr.h" + +bool TestPMgr::addPacket(const packet_t* packet) { + packet_t aql_packet = *packet; + + // Compute the write index of queue and copy Aql packet into it + uint64_t que_idx = hsa_queue_load_write_index_relaxed(getQueue()); + const uint32_t mask = getQueue()->size - 1; + + // Disable packet so that submission to HW is complete + const auto header = HSA_PACKET_TYPE_VENDOR_SPECIFIC << HSA_PACKET_HEADER_TYPE; + aql_packet.header &= (~((1 << HSA_PACKET_HEADER_WIDTH_TYPE) - 1)) << HSA_PACKET_HEADER_TYPE; + aql_packet.header |= HSA_PACKET_TYPE_INVALID << HSA_PACKET_HEADER_TYPE; + + // Copy Aql packet into queue buffer + ((packet_t*)(getQueue()->base_address))[que_idx & mask] = aql_packet; + + // After AQL packet is fully copied into queue buffer + // update packet header from invalid state to valid state + std::atomic_thread_fence(std::memory_order_release); + ((packet_t*)(getQueue()->base_address))[que_idx & mask].header = header; + + // Increment the write index and ring the doorbell to dispatch the kernel. + hsa_queue_store_write_index_relaxed(getQueue(), (que_idx + 1)); + hsa_signal_store_relaxed(getQueue()->doorbell_signal, que_idx); + + return true; +} + +bool TestPMgr::run() { + // Build Aql Pkts + const bool active = buildPackets(); + if (active) { + // Submit Pre-Dispatch Aql packet + addPacket(&prePacket); + } + + testAql()->run(); + + if (active) { + // Set post packet completion signal + postPacket.completion_signal = postSignal; + + // Submit Post-Dispatch Aql packet + addPacket(&postPacket); + + // Wait for Post-Dispatch packet to complete + hsa_signal_wait_acquire(postSignal, HSA_SIGNAL_CONDITION_LT, 1, (uint64_t)-1, + HSA_WAIT_STATE_BLOCKED); + + // Dumping profiling data + dumpData(); + } + + return true; +} + +bool TestPMgr::initialize(int argc, char** argv) { + TestAql::initialize(argc, argv); + hsa_status_t status = hsa_signal_create(1, 0, NULL, &postSignal); + assert(status == HSA_STATUS_SUCCESS); + return (status == HSA_STATUS_SUCCESS); +} + +TestPMgr::TestPMgr(TestAql* t) : TestAql(t) { + dummySignal.handle = 0; + postSignal = dummySignal; +} diff --git a/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.h b/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.h new file mode 100644 index 0000000000..274fa9ab47 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/ctrl/test_pmgr.h @@ -0,0 +1,57 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#ifndef _TEST_SMGR_H_ +#define _TEST_SMGR_H_ + +#include "test_aql.h" +#include "amd_aql_pm4_ib_packet.h" + +// SimpleConvolution: Class implements OpenCL SimpleConvolution sample +class TestPMgr : public TestAql { + public: + typedef amd_aql_pm4_ib_packet_t packet_t; + + private: + bool addPacket(const packet_t* packet); + + protected: + packet_t prePacket; + packet_t postPacket; + hsa_signal_t dummySignal; + hsa_signal_t postSignal; + + virtual bool buildPackets() { return false; } + virtual bool dumpData() { return false; } + virtual bool initialize(int argc, char** argv); + + public: + TestPMgr(TestAql* t); + bool run(); +}; + +#endif // _TEST_SMGR_H_ diff --git a/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cl b/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cl new file mode 100644 index 0000000000..23db8cc84f --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cl @@ -0,0 +1,81 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +********************************************************************************/ + +/** + * SimpleConvolution is where each pixel of the output image + * is the weighted sum of the neighborhood pixels of the input image + * The neighborhood is defined by the dimensions of the mask and + * weight of each neighbor is defined by the mask itself. + * @param output Output matrix after performing convolution + * @param input Input matrix on which convolution is to be performed + * @param mask mask matrix using which convolution was to be performed + * @param inputDimensions dimensions of the input matrix + * @param maskDimensions dimensions of the mask matrix + */ +__kernel void simpleConvolution(__global uint * output, + __global uint * input, + __global float * mask, + const uint2 inputDimensions, + const uint2 maskDimensions) { + + uint tid = get_global_id(0); + + uint width = inputDimensions.x; + uint height = inputDimensions.y; + + uint x = tid%width; + uint y = tid/width; + + uint maskWidth = maskDimensions.x; + uint maskHeight = maskDimensions.y; + + uint vstep = (maskWidth -1)/2; + uint hstep = (maskHeight -1)/2; + + // find the left, right, top and bottom indices such that + // the indices do not go beyond image boundaires + uint left = (x < vstep) ? 0 : (x - vstep); + uint right = ((x + vstep) >= width) ? width - 1 : (x + vstep); + uint top = (y < hstep) ? 0 : (y - hstep); + uint bottom = ((y + hstep) >= height)? height - 1: (y + hstep); + + // initializing wighted sum value + float sumFX = 0; + + for(uint i = left; i <= right; ++i) { + for(uint j = top ; j <= bottom; ++j) { + // performing wighted sum within the mask boundaries + uint maskIndex = (j - (y - hstep)) * maskWidth + (i - (x - vstep)); + uint index = j * width + i; + sumFX += ((float)input[index] * mask[maskIndex]); + } + } + + // To round to the nearest integer + sumFX += 0.5f; + output[tid] = (uint)sumFX; +} diff --git a/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cpp b/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cpp new file mode 100644 index 0000000000..e4e5704337 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.cpp @@ -0,0 +1,157 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#include "helper_funcs.hpp" +#include "simple_convolution.h" + +SimpleConvolution::SimpleConvolution() { + width_ = 64; + height_ = 64; + mask_width_ = 3; + mask_height_ = mask_width_; + + if (!isPowerOf2(width_)) { + width_ = roundToPowerOf2(width_); + } + + if (!isPowerOf2(height_)) { + height_ = roundToPowerOf2(height_); + } + + if (!(mask_width_ % 2)) { + mask_width_++; + } + + if (!(mask_height_ % 2)) { + mask_height_++; + } + + if (width_ * height_ < 256) { + width_ = 64; + height_ = 64; + } + + const uint32_t input_size_bytes = width_ * height_ * sizeof(uint32_t); + const uint32_t mask_size_bytes = mask_width_ * mask_height_ * sizeof(float); + + set_sys_descr(KERNARG_DES_ID, sizeof(kernel_args_t)); + set_sys_descr(INPUT_DES_ID, input_size_bytes); + set_sys_descr(OUTPUT_DES_ID, input_size_bytes); + set_local_descr(LOCAL_DES_ID, input_size_bytes); + set_sys_descr(MASK_DES_ID, mask_size_bytes); + set_sys_descr(REFOUT_DES_ID, input_size_bytes); +} + +void SimpleConvolution::init() { + std::cout << "SimpleConvolution::init :" << std::endl; + + mem_descr_t input_des = get_descr(INPUT_DES_ID); + mem_descr_t local_des = get_descr(LOCAL_DES_ID); + mem_descr_t mask_des = get_descr(MASK_DES_ID); + mem_descr_t refout_des = get_descr(REFOUT_DES_ID); + mem_descr_t kernarg_des = get_descr(KERNARG_DES_ID); + + uint32_t* input = (uint32_t*)input_des.ptr; + uint32_t* output_local = (uint32_t*)local_des.ptr; + float* mask = (float*)mask_des.ptr; + kernel_args_t* kernel_args = (kernel_args_t*)kernarg_des.ptr; + + // random initialisation of input + fillRandom(input, width_, height_, 0, 255); + + // Fill a blurr filter or some other filter of your choice + const float val = 1.0f / (mask_width_ * 2.0f - 1.0f); + for (uint32_t i = 0; i < (mask_width_ * mask_height_); i++) { + mask[i] = 0; + } + for (uint32_t i = 0; i < mask_width_; i++) { + uint32_t y = mask_height_ / 2; + mask[y * mask_width_ + i] = val; + } + for (uint32_t i = 0; i < mask_height_; i++) { + uint32_t x = mask_width_ / 2; + mask[i * mask_width_ + x] = val; + } + + // Print the INPUT array. + printArray("> Input[0]", input, width_, 1); + printArray("> Mask", mask, mask_width_, mask_height_); + + // Fill the kernel args + kernel_args->arg1 = output_local; + kernel_args->arg2 = input; + kernel_args->arg3 = mask; + kernel_args->arg4 = width_; + kernel_args->arg41 = height_; + kernel_args->arg5 = mask_width_; + kernel_args->arg51 = mask_height_; + + // Calculate the reference output + memset(refout_des.ptr, 0, refout_des.size); + reference_impl((uint32_t*)refout_des.ptr, input, mask, width_, height_, mask_width_, + mask_height_); +} + +void SimpleConvolution::print_output() const { + printArray("> Output[0]", (uint32_t*)get_output_ptr(), width_, 1); +} + +bool SimpleConvolution::reference_impl(uint32_t* output, const uint32_t* input, const float* mask, + const uint32_t width, const uint32_t height, + const uint32_t mask_width, const uint32_t mask_height) { + const uint32_t vstep = (mask_width - 1) / 2; + const uint32_t hstep = (mask_height - 1) / 2; + + // for each pixel in the input + for (uint32_t x = 0; x < width; x++) { + for (uint32_t y = 0; y < height; y++) { + // find the left, right, top and bottom indices such that + // the indices do not go beyond image boundaires + const uint32_t left = (x < vstep) ? 0 : (x - vstep); + const uint32_t right = ((x + vstep) >= width) ? width - 1 : (x + vstep); + const uint32_t top = (y < hstep) ? 0 : (y - hstep); + const uint32_t bottom = ((y + hstep) >= height) ? height - 1 : (y + hstep); + + // initializing wighted sum value + float sum_fx = 0; + for (uint32_t i = left; i <= right; ++i) { + for (uint32_t j = top; j <= bottom; ++j) { + // performing wighted sum within the mask boundaries + uint32_t mask_idx = (j - (y - hstep)) * mask_width + (i - (x - vstep)); + uint32_t index = j * width + i; + + // to round to the nearest integer + sum_fx += ((float)input[index] * mask[mask_idx]); + } + } + sum_fx += 0.5f; + output[y * width + x] = uint32_t(sum_fx); + } + } + + return true; +} diff --git a/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.h b/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.h new file mode 100644 index 0000000000..27f3271428 --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.h @@ -0,0 +1,90 @@ +/****************************************************************************** + +Copyright ©2013 Advanced Micro Devices, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#ifndef _SIMPLE_CONVOLUTION_H_ +#define _SIMPLE_CONVOLUTION_H_ + +#include +#include + +#include "test_kernel.h" + +// SimpleConvolution: Class implements OpenCL SimpleConvolution sample +class SimpleConvolution : public TestKernel { + public: + // Constructor + SimpleConvolution(); + + // Initialize method + void init(); + + // Return number of compute elements + uint32_t get_elements_count() const { return width_ * height_; } + + // Print output + void print_output() const; + + // Return name + std::string Name() const { return std::string("simpleConvolution"); } + + private: + // Local kernel arguments declaration + struct kernel_args_t { + void* arg1; + void* arg2; + void* arg3; + uint32_t arg4; + uint32_t arg41; + uint32_t arg5; + uint32_t arg51; + }; + + // Width of the Input array + uint32_t width_; + + // Height of the Input array + uint32_t height_; + + // Mask dimensions + uint32_t mask_width_; + + // Mask dimensions + uint32_t mask_height_; + + // Reference CPU implementation of Simple Convolution + // @param output Output matrix after performing convolution + // @param input Input matrix on which convolution is to be performed + // @param mask mask matrix using which convolution was to be performed + // @param input_dimensions dimensions of the input matrix + // @param mask_dimensions dimensions of the mask matrix + // @return bool true on success and false on failure + bool reference_impl(uint32_t* output, const uint32_t* input, const float* mask, + const uint32_t width, const uint32_t height, const uint32_t maskWidth, + const uint32_t maskHeight); +}; + +#endif // _SIMPLE_CONVOLUTION_H_ diff --git a/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.hsail b/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.hsail new file mode 100644 index 0000000000..223ef8eddb --- /dev/null +++ b/runtime/hsa-ext-aql-profile/test/simple_convolution/simple_convolution.hsail @@ -0,0 +1,154 @@ +module &m:1:0:$full:$large:$default; +extension "amd:gcn"; +extension "IMAGE"; + +decl prog function &abort()(); + +prog kernel &__OpenCL_SimpleConvolution(kernarg_u64 %__global_offset_0, + kernarg_u64 %output, + kernarg_u64 %input, + kernarg_u64 %mask, + kernarg_u32 %inputDimensions[2], + kernarg_u32 %maskDimensions[2]) { + + pragma "AMD RTI", "ARGSTART:__OpenCL_SimpleConvolution"; + pragma "AMD RTI", "version:3:1:104"; + pragma "AMD RTI", "device:generic"; + pragma "AMD RTI", "uniqueid:1024"; + pragma "AMD RTI", "memory:private:0"; + pragma "AMD RTI", "memory:region:0"; + pragma "AMD RTI", "memory:local:0"; + pragma "AMD RTI", "value:__global_offset_0:u64:1:1:0"; + pragma "AMD RTI", "pointer:output:u32:1:1:96:uav:7:4:RW:0:0:0"; + pragma "AMD RTI", "pointer:input:u32:1:1:112:uav:7:4:RW:0:0:0"; + pragma "AMD RTI", "pointer:mask:float:1:1:128:uav:7:4:RW:0:0:0"; + pragma "AMD RTI", "value:inputDimensions:u32:2:1:144"; + pragma "AMD RTI", "constarg:4:inputDimensions"; + pragma "AMD RTI", "value:maskDimensions:u32:2:1:160"; + pragma "AMD RTI", "constarg:5:maskDimensions"; + pragma "AMD RTI", "function:1:0"; + pragma "AMD RTI", "memory:64bitABI"; + pragma "AMD RTI", "privateid:8"; + pragma "AMD RTI", "enqueue_kernel:0"; + pragma "AMD RTI", "kernel_index:0"; + pragma "AMD RTI", "reflection:0:size_t"; + pragma "AMD RTI", "reflection:1:uint*"; + pragma "AMD RTI", "reflection:2:uint*"; + pragma "AMD RTI", "reflection:3:float*"; + pragma "AMD RTI", "reflection:4:uint2"; + pragma "AMD RTI", "reflection:5:uint2"; + pragma "AMD RTI", "ARGEND:__OpenCL_SimpleConvolution"; + + @__OpenCL_SimpleConvolution_Entry: + + // BB#0: // %entry + + workitemabsid_u32 $s6, 0; + cvt_u64_u32 $d0, $s6; + ld_kernarg_align(8)_width(all)_u64 $d4, [%__global_offset_0]; + add_u64 $d0, $d0, $d4; + cvt_u32_u64 $s5, $d0; + ld_v2_kernarg_align(4)_width(all)_u32 ($s0, $s4), [%inputDimensions]; + ld_v2_kernarg_align(4)_width(all)_u32 ($s1, $s9), [%maskDimensions]; + rem_u32 $s7, $s5, $s0; + add_u32 $s2, $s1, 4294967295; + shr_u32 $s8, $s2, 1; + add_u32 $s2, $s7, $s8; + add_u32 $s3, $s0, 4294967295; + cmp_ge_b1_u32 $c0, $s2, $s0; + cmov_b32 $s2, $c0, $s3, $s2; + sub_u32 $s3, $s7, $s8; + cmp_lt_b1_u32 $c0, $s7, $s8; + cmov_b32 $s3, $c0, 0, $s3; + ld_kernarg_align(8)_width(all)_u64 $d1, [%output]; + cmp_le_b1_u32 $c0, $s3, $s2; + cbr_b1 $c0, @BB0_2; + + // BB#1: + + mov_b32 $s6, 0; + br @BB0_6; + + // @BB0_2: // %for.cond32.preheader.lr.ph + + @BB0_2: + + div_u32 $s5, $s5, $s0; + add_u32 $s9, $s9, 4294967295; + shr_u32 $s9, $s9, 1; + add_u32 $s10, $s5, $s9; + add_u32 $s11, $s4, 4294967295; + cmp_ge_b1_u32 $c0, $s10, $s4; + cmov_b32 $s4, $c0, $s11, $s10; + sub_u32 $s10, $s5, $s9; + cmp_lt_b1_u32 $c0, $s5, $s9; + cmov_b32 $s5, $c0, 0, $s10; + ld_kernarg_align(8)_width(all)_u64 $d2, [%mask]; + ld_kernarg_align(8)_width(all)_u64 $d3, [%input]; + cvt_u64_u32 $d5, $s6; + add_u64 $d4, $d4, $d5; + cvt_u32_u64 $s6, $d4; + div_u32 $s6, $s6, $s0; + max_u32 $s10, $s9, $s6; + sub_u32 $s12, $s10, $s6; + max_u32 $s11, $s7, $s8; + mov_b32 $s6, 0; + mad_u32 $s12, $s1, $s12, $s11; + sub_u32 $s7, $s12, $s7; + sub_u32 $s9, $s10, $s9; + mad_u32 $s9, $s0, $s9, $s11; + sub_u32 $s8, $s9, $s8; + + // @BB0_3: // %for.cond32.preheader + + @BB0_3: + + cmp_gt_b1_u32 $c0, $s5, $s4; + mov_b32 $s9, $s7; + mov_b32 $s10, $s8; + mov_b32 $s11, $s5; + cbr_b1 $c0, @BB0_5; + + // @BB0_4: // %for.body35 + + @BB0_4: + + cvt_u64_u32 $d4, $s9; + shl_u64 $d4, $d4, 2; + add_u64 $d4, $d2, $d4; + ld_global_align(4)_f32 $s12, [$d4]; + cvt_u64_u32 $d4, $s10; + shl_u64 $d4, $d4, 2; + add_u64 $d4, $d3, $d4; + ld_global_align(4)_u32 $s13, [$d4]; + cvt_f32_u32 $s13, $s13; + mul_ftz_f32 $s12, $s13, $s12; + add_u32 $s9, $s9, $s1; + add_u32 $s10, $s10, $s0; + add_u32 $s11, $s11, 1; + add_ftz_f32 $s6, $s6, $s12; + cmp_le_b1_u32 $c0, $s11, $s4; + cbr_b1 $c0, @BB0_4; + + // @BB0_5: // %for.inc48 + + @BB0_5: + + add_u32 $s7, $s7, 1; + add_u32 $s8, $s8, 1; + add_u32 $s3, $s3, 1; + cmp_le_b1_u32 $c0, $s3, $s2; + cbr_b1 $c0, @BB0_3; + + // @BB0_6: // %for.end50 + + @BB0_6: + + and_b64 $d0, $d0, 4294967295; + shl_u64 $d0, $d0, 2; + add_u64 $d0, $d1, $d0; + add_ftz_f32 $s0, $s6, 0F3f000000; + cvt_ftz_u32_f32 $s0, $s0; + st_global_align(4)_u32 $s0, [$d0]; + ret; +};

|27@Z#h?=-BfJ*FCt?Llz-e3P&hBD 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%0DGxRvIz>wvSY}kKPzO&V@pHC*H17QO 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 z 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