[aqlprofile] Add verison info to public header (#706)

Add versioning information to public aqlprofile headers, and add API to query version at runtime
This commit is contained in:
Mythreya Kuricheti
2025-09-22 11:02:42 -07:00
committad av GitHub
förälder a4effb81a9
incheckning 09c0470ed4
13 ändrade filer med 368 tillägg och 109 borttagningar
+3
Visa fil
@@ -27,6 +27,8 @@ set ( BUILD_VERSION_MINOR ${VERSION_MINOR} )
set ( BUILD_VERSION_PATCH ${VERSION_PATCH} )
set ( BUILD_VERSION_STRING "${BUILD_VERSION_MAJOR}.${BUILD_VERSION_MINOR}.${BUILD_VERSION_PATCH}" )
get_git_rev(AQLPROFILE_GIT_REVISION)
set ( LIB_VERSION_MAJOR ${VERSION_MAJOR} )
set ( LIB_VERSION_MINOR ${VERSION_MINOR} )
if ( ${ROCM_PATCH_VERSION} )
@@ -41,6 +43,7 @@ set ( TARGET_NAME "${AQLPROFILE_TARGET}" )
set ( ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}" )
set ( LIB_DIR "${ROOT_DIR}/src" )
set ( TEST_DIR "${ROOT_DIR}/test" )
set ( AQLPROFILE_BUILD_ROOT "${PROJECT_BINARY_DIR}" )
## Build library
include ( ${LIB_DIR}/CMakeLists.txt )
@@ -74,3 +74,33 @@ function ( get_version DEFAULT_VERSION_STRING )
set( VERSION_BUILD "${VERSION_BUILD}" PARENT_SCOPE )
endfunction()
function(get_git_rev GIT_REVISION_OUT)
find_package(Git)
if(Git_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --tags
OUTPUT_VARIABLE GIT_DESCRIBE
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE _GIT_DESCRIBE_RESULT
ERROR_QUIET)
if(NOT _GIT_DESCRIBE_RESULT EQUAL 0)
execute_process(
COMMAND ${GIT_EXECUTABLE} describe
OUTPUT_VARIABLE GIT_DESCRIBE
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE _GIT_DESCRIBE_RESULT
ERROR_QUIET)
endif()
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
set(${GIT_REVISION_OUT} "${GIT_REVISION}" PARENT_SCOPE)
else()
set(${GIT_REVISION_OUT} "" PARENT_SCOPE)
endif()
endfunction()
+13 -2
Visa fil
@@ -25,8 +25,19 @@ set ( LIB_SRC
)
add_library ( ${TARGET_LIB} SHARED ${LIB_SRC} )
target_include_directories ( ${TARGET_LIB} PRIVATE ${LIB_DIR} ${API_PATH} ${LIB_DIR}/core/include)
target_link_libraries( ${TARGET_LIB} PRIVATE pthread hsa-runtime64::hsa-runtime64 )
add_library (aqlprofile::aqlprofile-lib ALIAS ${TARGET_LIB})
target_include_directories ( ${TARGET_LIB}
PRIVATE ${LIB_DIR}
${API_PATH}
${LIB_DIR}/core/include
)
target_link_libraries( ${TARGET_LIB}
PRIVATE
pthread
hsa-runtime64::hsa-runtime64
PUBLIC
aqlprofile::headers
)
## Generating definitions
set ( SCRIPT_DIR "${ROOT_DIR}/script" )
+11
Visa fil
@@ -256,6 +256,17 @@ hsa_status_t _internal_aqlprofile_pmc_create_packets(
extern "C" {
PUBLIC_API hsa_status_t aqlprofile_get_version(aqlprofile_version_t* info) {
if (info != nullptr) {
*info = {.major = AQLPROFILE_VERSION_MAJOR,
.minor = AQLPROFILE_VERSION_MINOR,
.patch = AQLPROFILE_VERSION_PATCH};
return HSA_STATUS_SUCCESS;
} else {
return HSA_STATUS_ERROR_INVALID_ARGUMENT;
}
}
PUBLIC_API hsa_status_t aqlprofile_pmc_create_packets(
aqlprofile_handle_t* handle, aqlprofile_pmc_aql_packets_t* packets,
aqlprofile_pmc_profile_t profile, aqlprofile_memory_alloc_callback_t alloc_cb,
@@ -1,7 +1 @@
set(AQLPROFILE_HEADER_FILES
aqlprofile-sdk/aql_profile_v2.h
)
install(
FILES ${AQLPROFILE_HEADER_FILES}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/aqlprofile-sdk)
add_subdirectory(aqlprofile-sdk)
@@ -0,0 +1,22 @@
set(AQLPROFILE_HEADER_FILES
aql_profile_v2.h
${CMAKE_CURRENT_BINARY_DIR}/version.h)
add_library(aqlprofile-headers INTERFACE)
add_library(aqlprofile::headers ALIAS aqlprofile-headers)
target_include_directories(aqlprofile-headers
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/..>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
target_sources(aqlprofile-headers
INTERFACE ${AQLPROFILE_HEADER_FILES})
configure_file(${CMAKE_CURRENT_LIST_DIR}/version.h.in
${CMAKE_CURRENT_BINARY_DIR}/version.h @ONLY)
install(FILES ${AQLPROFILE_HEADER_FILES}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/aqlprofile-sdk
COMPONENT development
)
@@ -26,6 +26,8 @@
#include <hsa/hsa.h>
#include <hsa/hsa_ven_amd_aqlprofile.h>
#include "aqlprofile-sdk/version.h"
#ifdef __cplusplus
extern "C" {
#endif
@@ -200,6 +202,23 @@ typedef struct {
uint64_t handle;
} aqlprofile_agent_handle_t;
/**
* @brief Versioning info.
*/
typedef struct aqlprofile_version_t {
uint32_t major;
uint32_t minor;
uint32_t patch;
} aqlprofile_version_t;
/**
* @brief Query the version of aqlprofile library.
* @param[out] version aqlprofile version info is stored if non-NULL
* @retval HSA_STATUS_SUCCESS returned when version is a valid pointer
* @retval HSA_STATUS_ERROR_INVALID_ARGUMENT if version is a null
*/
hsa_status_t aqlprofile_get_version(aqlprofile_version_t* version);
/**
* @brief Registers an agent to be used with AQL profile.
* @param[out] agent_id Handle to newly registered agent
@@ -0,0 +1,115 @@
// MIT License
//
// Copyright (c) 2025 Advanced Micro Devices, Inc. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in 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:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// 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
// AUTHORS 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 IN THE
// SOFTWARE.
#pragma once
/**
* @def AQLPROFILE_VERSION_MAJOR
* @brief The major version of the interface as a macro so it can be used
* by the preprocessor.
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_VERSION_MINOR
* @brief The minor version of the interface as a macro so it can be used
* by the preprocessor.
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_VERSION_PATCH
* @brief The patch version of the interface as a macro so it can be used
* by the preprocessor.
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_VERSION
* @brief Numerically increasing version number encoding major, minor, and patch via
computing `((10000 * <MAJOR>) + (100 * <MINOR>) + <PATCH>)`.
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_SOVERSION
* @brief Shared object versioning value whose value is at least `(10000 * <MAJOR>)`.
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_VERSION_STRING
* @brief Version string in form: `<MAJOR>.<MINOR>.<PATCH>`.
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_GIT_DESCRIBE
* @brief String encoding of `git describe --tags` when aqlprofile was built.
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_GIT_REVISION
* @brief String encoding of `git rev-parse HEAD` when aqlprofile was built.
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_LIBRARY_ARCH
* @brief Architecture triplet of aqlprofile build.
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_SYSTEM_NAME
* @brief Target operating system for aqlprofile build, e.g. Linux.
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_SYSTEM_PROCESSOR
* @brief Target architecture for aqlprofile build.
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_SYSTEM_VERSION
* @brief Version of the operating system which built aqlprofile
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_COMPILER_ID
* @brief C++ compiler identifier which built aqlprofile, e.g., GNU
* @addtogroup VERSIONING_GROUP
*
* @def AQLPROFILE_COMPILER_VERSION
* @brief C++ compiler version which built aqlprofile
* @addtogroup VERSIONING_GROUP
*
*/
// clang-format off
#define AQLPROFILE_VERSION_MAJOR @BUILD_VERSION_MAJOR@
#define AQLPROFILE_VERSION_MINOR @BUILD_VERSION_MINOR@
#define AQLPROFILE_VERSION_PATCH @BUILD_VERSION_PATCH@
#define AQLPROFILE_SOVERSION @BUILD_VERSION_MAJOR@
#define AQLPROFILE_VERSION_STRING "@VERSION_STRING@"
#define AQLPROFILE_GIT_REVISION "@AQLPROFILE_GIT_REVISION@"
// system info during compilation
#define AQLPROFILE_LIBRARY_ARCH "@CMAKE_LIBRARY_ARCHITECTURE@"
#define AQLPROFILE_SYSTEM_NAME "@CMAKE_SYSTEM_NAME@"
#define AQLPROFILE_SYSTEM_PROCESSOR "@CMAKE_SYSTEM_PROCESSOR@"
#define AQLPROFILE_SYSTEM_VERSION "@CMAKE_SYSTEM_VERSION@"
// compiler information
#define AQLPROFILE_COMPILER_ID "@CMAKE_CXX_COMPILER_ID@"
#define AQLPROFILE_COMPILER_VERSION "@CMAKE_CXX_COMPILER_VERSION@"
// clang-format on
#define AQLPROFILE_COMPUTE_VERSION_VALUE(MAX_VERSION_VALUE, MAJOR, MINOR, PATCH) \
(((MAX_VERSION_VALUE * MAX_VERSION_VALUE) * MAJOR) + (MAX_VERSION_VALUE * MINOR) + (PATCH))
#define AQLPROFILE_COMPUTE_VERSION(MAJOR, MINOR, PATCH) \
AQLPROFILE_COMPUTE_VERSION_VALUE(100, MAJOR, MINOR, PATCH)
#define AQLPROFILE_VERSION \
AQLPROFILE_COMPUTE_VERSION(AQLPROFILE_VERSION_MAJOR, AQLPROFILE_VERSION_MINOR, \
AQLPROFILE_VERSION_PATCH)
@@ -25,9 +25,15 @@ SET(AQLPROFILE_MEMORYMANAGER_SOURCES
)
target_sources(gfx9-memory-manager-test PRIVATE ${AQLPROFILE_MEMORYMANAGER_SOURCES})
target_include_directories(gfx9-memory-manager-test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${LIB_DIR} ${LIB_DIR}/core/include)
target_include_directories(gfx9-memory-manager-test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${LIB_DIR}
${LIB_DIR}/core/include)
target_link_libraries(
gfx9-memory-manager-test
PUBLIC
aqlprofile::headers
PRIVATE
hsa-runtime64::hsa-runtime64
GTest::gtest
@@ -51,10 +57,15 @@ SET(AQLPROFILE_TEST_SOURCES
)
target_sources(aqlprofile-test PRIVATE ${AQLPROFILE_TEST_SOURCES})
target_include_directories(aqlprofile-test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${LIB_DIR} ${LIB_DIR}/core/include)
target_include_directories(aqlprofile-test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${LIB_DIR}
${LIB_DIR}/core/include)
target_link_libraries(
aqlprofile-test
PRIVATE
aqlprofile::aqlprofile-lib
hsa-runtime64::hsa-runtime64
GTest::gtest
GTest::gtest_main
@@ -79,9 +90,15 @@ SET(AQLPROFILE_COMMAND_BUFFER_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/command_buffer_tests.cpp
)
target_sources(command-buffer-test PRIVATE ${AQLPROFILE_COMMAND_BUFFER_SOURCES})
target_include_directories(command-buffer-test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${LIB_DIR} ${LIB_DIR}/core/include)
target_include_directories(command-buffer-test PRIVATE
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${LIB_DIR}
${LIB_DIR}/core/include)
target_link_libraries(
command-buffer-test
PUBLIC
aqlprofile::headers
PRIVATE
hsa-runtime64::hsa-runtime64
GTest::gtest
@@ -104,7 +121,12 @@ SET(AQLPROFILE_COUNTERS_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/counter_tests.cpp
)
target_sources(counters-test PRIVATE ${AQLPROFILE_COUNTERS_SOURCES})
target_include_directories(counters-test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${LIB_DIR} ${LIB_DIR}/core/include)
target_include_directories(counters-test PRIVATE
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${LIB_DIR}
${LIB_DIR}/core/include
)
target_link_libraries(
counters-test
PRIVATE
@@ -135,6 +157,7 @@ target_include_directories(pm4-factory-test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
target_link_libraries(
pm4-factory-test
PRIVATE
aqlprofile::aqlprofile-lib
hsa-runtime64::hsa-runtime64
GTest::gtest
GTest::gtest_main
@@ -171,7 +194,7 @@ gtest_add_tests(
SOURCES ${AQLPROFILE_LOGGER_SOURCES}
TEST_LIST logger-test_TESTS
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
set_tests_properties(
${logger-test_TESTS} PROPERTIES TIMEOUT 45 LABELS "unittests" FAIL_REGULAR_EXPRESSION
"${AQLPROFILE_DEFAULT_FAIL_REGEX}")
@@ -203,6 +226,7 @@ target_include_directories(aql-profile-v2-test PRIVATE ${CMAKE_CURRENT_SOURCE_DI
target_link_libraries(
aql-profile-v2-test
PRIVATE
aqlprofile::aqlprofile-lib
hsa-runtime64::hsa-runtime64
GTest::gtest
GTest::gtest_main
@@ -214,8 +238,7 @@ gtest_add_tests(
SOURCES ${AQLPROFILE_V2_SOURCES}
TEST_LIST aql-profile-v2-test_TESTS
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
set_tests_properties(
${aql-profile-v2-test_TESTS} PROPERTIES TIMEOUT 45 LABELS "unittests" FAIL_REGULAR_EXPRESSION
"${AQLPROFILE_DEFAULT_FAIL_REGEX}")
@@ -25,6 +25,8 @@
#include "core/aql_profile.hpp"
#include "core/pm4_factory.h"
#include "aqlprofile-sdk/version.h"
#include "aqlprofile-sdk/aql_profile_v2.h"
// header for memcpy
#include <cstring>
@@ -44,7 +46,7 @@ Pm4Factory::instances_t* Pm4Factory::instances_ = nullptr;
// Mock classes to simulate Pm4Factory and related functionality
class MockPm4Factory : public Pm4Factory {
public:
public:
MockPm4Factory() : Pm4Factory(BlockInfoMap(nullptr, 0)) {}
MOCK_METHOD(const GpuBlockInfo*, GetBlockInfo, (const hsa_ven_amd_aqlprofile_event_t*), (const));
MOCK_METHOD(bool, IsGFX9, (), (const));
@@ -103,7 +105,7 @@ hsa_status_t DefaultTracedataCallback(hsa_ven_amd_aqlprofile_info_type_t info_ty
// Test fixture for CountersVec tests
class CountersVecTest : public Test {
protected:
protected:
void SetUp() override {
pm4_factory = new NiceMock<MockPm4Factory>();
ON_CALL(*pm4_factory, IsGFX9()).WillByDefault(Return(true));
@@ -117,7 +119,7 @@ protected:
};
pm4_builder::counters_vector CountersVecTest::CountersVec(const profile_t* profile,
const Pm4Factory* pm4_factory) {
const Pm4Factory* pm4_factory) {
pm4_builder::counters_vector vec;
std::map<block_des_t, uint32_t, lt_block_des> index_map;
for (const hsa_ven_amd_aqlprofile_event_t* p = profile->events;
@@ -171,12 +173,12 @@ TEST_F(CountersVecTest, RegularEvents) {
pm4_factory->GetBlockInfo(profile->events);
bool is_gfx9 = pm4_factory->IsGFX9();
EXPECT_TRUE(is_gfx9);
}
// Test fixture for the DefaultTracedataCallback function
class DefaultTracedataCallbackTest : public Test {
protected:
protected:
hsa_ven_amd_aqlprofile_info_data_t CreateInfoData(uint32_t sample_id) {
hsa_ven_amd_aqlprofile_info_data_t data{};
data.sample_id = sample_id;
@@ -243,3 +245,20 @@ TEST_F(DefaultTracedataCallbackTest, NonTraceInfoType) {
EXPECT_EQ(callback_data.trace_data.ptr, original_ptr);
EXPECT_EQ(callback_data.trace_data.size, original_size);
}
TEST(aqlprofile, version) {
auto correct_version = aqlprofile_version_t{.major = AQLPROFILE_VERSION_MAJOR,
.minor = AQLPROFILE_VERSION_MINOR,
.patch = AQLPROFILE_VERSION_PATCH};
auto query_version = aqlprofile_version_t{};
auto ret = aqlprofile_get_version(&query_version);
EXPECT_EQ(ret, HSA_STATUS_SUCCESS);
EXPECT_EQ(query_version.major, correct_version.major);
EXPECT_EQ(query_version.minor, correct_version.minor);
EXPECT_EQ(query_version.patch, correct_version.patch);
EXPECT_EQ(aqlprofile_get_version(nullptr), HSA_STATUS_ERROR_INVALID_ARGUMENT);
}
@@ -4,7 +4,7 @@
#include <vector>
#include <memory>
#include "../include/aqlprofile-sdk/aql_profile_v2.h"
#include "aqlprofile-sdk/aql_profile_v2.h"
#include "../logger.h"
#include "../pm4_factory.h"
// Define static members
@@ -27,14 +27,14 @@ protected:
memset(&test_agent_info_v1_, 0, sizeof(test_agent_info_v1_));
memset(&test_handle_, 0, sizeof(test_handle_));
memset(&test_agent_handle_, 0, sizeof(test_agent_handle_));
// Set up default agent info
test_agent_info_.agent_gfxip = "gfx90a";
test_agent_info_.xcc_num = 1;
test_agent_info_.se_num = 8;
test_agent_info_.cu_num = 104;
test_agent_info_.shader_arrays_per_se = 2;
// Set up default agent info v1
test_agent_info_v1_.agent_gfxip = "gfx90a";
test_agent_info_v1_.xcc_num = 1;
@@ -43,7 +43,7 @@ protected:
test_agent_info_v1_.shader_arrays_per_se = 2;
test_agent_info_v1_.domain = 0;
test_agent_info_v1_.location_id = 0x12345678;
test_handle_.handle = 0x1234567890ABCDEF;
test_agent_handle_.handle = 0xFEDCBA0987654321;
}
@@ -63,13 +63,13 @@ TEST_F(AqlProfileV2Test, EnumValues) {
EXPECT_EQ(AQLPROFILE_MEMORY_HINT_DEVICE_COHERENT, 3);
EXPECT_EQ(AQLPROFILE_MEMORY_HINT_DEVICE_NONCOHERENT, 4);
EXPECT_GT(AQLPROFILE_MEMORY_HINT_LAST, AQLPROFILE_MEMORY_HINT_DEVICE_NONCOHERENT);
// Test agent version enum
EXPECT_EQ(AQLPROFILE_AGENT_VERSION_NONE, 0);
EXPECT_EQ(AQLPROFILE_AGENT_VERSION_V0, 1);
EXPECT_EQ(AQLPROFILE_AGENT_VERSION_V1, 2);
EXPECT_GT(AQLPROFILE_AGENT_VERSION_LAST, AQLPROFILE_AGENT_VERSION_V1);
// Test accumulation type enum
EXPECT_EQ(AQLPROFILE_ACCUMULATION_NONE, 0);
EXPECT_EQ(AQLPROFILE_ACCUMULATION_LO_RES, 1);
@@ -82,12 +82,12 @@ TEST_F(AqlProfileV2Test, BlockNameEnum) {
// Test that reserved blocks are in the expected range
EXPECT_EQ(AQLPROFILE_BLOCK_NAME_RESERVED_0, HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER);
EXPECT_EQ(AQLPROFILE_BLOCK_NAME_RESERVED_1, HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER + 1);
// Test that new block names are defined
EXPECT_GT(AQLPROFILE_BLOCK_NAME_CHA, AQLPROFILE_BLOCK_NAME_RESERVED_5);
EXPECT_GT(AQLPROFILE_BLOCK_NAME_CHC, AQLPROFILE_BLOCK_NAME_CHA);
EXPECT_GT(AQLPROFILE_BLOCK_NAME_SQG, AQLPROFILE_BLOCK_NAME_GRBMH);
// Test final block count
EXPECT_GT(AQLPROFILE_BLOCKS_NUMBER, HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER);
}
@@ -95,26 +95,26 @@ TEST_F(AqlProfileV2Test, BlockNameEnum) {
// Test buffer descriptor flags structure
TEST_F(AqlProfileV2Test, BufferDescFlags) {
aqlprofile_buffer_desc_flags_t flags;
// Test raw access
flags.raw = 0;
EXPECT_EQ(flags.device_access, 0);
EXPECT_EQ(flags.host_access, 0);
EXPECT_EQ(flags.memory_hint, 0);
// Test individual field access
flags.device_access = 1;
flags.host_access = 1;
flags.memory_hint = AQLPROFILE_MEMORY_HINT_HOST;
EXPECT_EQ(flags.device_access, 1);
EXPECT_EQ(flags.host_access, 1);
EXPECT_EQ(flags.memory_hint, AQLPROFILE_MEMORY_HINT_HOST);
// Test field width constraints
flags.memory_hint = 0x3F; // 6 bits max
EXPECT_EQ(flags.memory_hint, 0x3F);
// Test bit manipulation
uint32_t expected = (1 << 0) | (1 << 1) | (0x3F << 2);
EXPECT_EQ(flags.raw, expected);
@@ -123,18 +123,18 @@ TEST_F(AqlProfileV2Test, BufferDescFlags) {
// Test PMC event flags structure
TEST_F(AqlProfileV2Test, PmcEventFlags) {
aqlprofile_pmc_event_flags_t flags;
// Test raw access
flags.raw = 0;
EXPECT_EQ(flags.sq_flags.accum, 0);
// Test accumulation field
flags.sq_flags.accum = AQLPROFILE_ACCUMULATION_LO_RES;
EXPECT_EQ(flags.sq_flags.accum, AQLPROFILE_ACCUMULATION_LO_RES);
flags.sq_flags.accum = AQLPROFILE_ACCUMULATION_HI_RES;
EXPECT_EQ(flags.sq_flags.accum, AQLPROFILE_ACCUMULATION_HI_RES);
// Test field width (3 bits for accumulation)
flags.sq_flags.accum = 0x7; // 3 bits max
EXPECT_EQ(flags.sq_flags.accum, 0x7);
@@ -143,13 +143,13 @@ TEST_F(AqlProfileV2Test, PmcEventFlags) {
// Test PMC event structure
TEST_F(AqlProfileV2Test, PmcEvent) {
aqlprofile_pmc_event_t event;
event.block_index = 42;
event.event_id = 123;
event.flags.raw = 0;
event.flags.sq_flags.accum = AQLPROFILE_ACCUMULATION_HI_RES;
event.block_name = HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQ;
EXPECT_EQ(event.block_index, 42);
EXPECT_EQ(event.event_id, 123);
EXPECT_EQ(event.flags.sq_flags.accum, AQLPROFILE_ACCUMULATION_HI_RES);
@@ -163,7 +163,7 @@ TEST_F(AqlProfileV2Test, AgentInfo) {
EXPECT_EQ(test_agent_info_.se_num, 8);
EXPECT_EQ(test_agent_info_.cu_num, 104);
EXPECT_EQ(test_agent_info_.shader_arrays_per_se, 2);
// Test with different GPU configurations
aqlprofile_agent_info_t gfx11_info;
gfx11_info.agent_gfxip = "gfx1100";
@@ -171,7 +171,7 @@ TEST_F(AqlProfileV2Test, AgentInfo) {
gfx11_info.se_num = 6;
gfx11_info.cu_num = 96;
gfx11_info.shader_arrays_per_se = 4;
EXPECT_STREQ(gfx11_info.agent_gfxip, "gfx1100");
EXPECT_EQ(gfx11_info.xcc_num, 2);
EXPECT_EQ(gfx11_info.se_num, 6);
@@ -188,13 +188,13 @@ TEST_F(AqlProfileV2Test, AgentInfoV1) {
EXPECT_EQ(test_agent_info_v1_.shader_arrays_per_se, 2);
EXPECT_EQ(test_agent_info_v1_.domain, 0);
EXPECT_EQ(test_agent_info_v1_.location_id, 0x12345678);
// Test with different PCI information
aqlprofile_agent_info_v1_t pci_info;
pci_info.agent_gfxip = "gfx942";
pci_info.domain = 0x0001;
pci_info.location_id = 0x00010203; // Bus=1, Device=2, Function=3
EXPECT_EQ(pci_info.domain, 0x0001);
EXPECT_EQ(pci_info.location_id, 0x00010203);
}
@@ -203,12 +203,12 @@ TEST_F(AqlProfileV2Test, AgentInfoV1) {
TEST_F(AqlProfileV2Test, HandleStructures) {
EXPECT_EQ(test_handle_.handle, 0x1234567890ABCDEF);
EXPECT_EQ(test_agent_handle_.handle, 0xFEDCBA0987654321);
// Test handle comparison
aqlprofile_handle_t handle1 = {0x123};
aqlprofile_handle_t handle2 = {0x123};
aqlprofile_handle_t handle3 = {0x456};
EXPECT_EQ(handle1.handle, handle2.handle);
EXPECT_NE(handle1.handle, handle3.handle);
}
@@ -216,17 +216,17 @@ TEST_F(AqlProfileV2Test, HandleStructures) {
// Test PMC profile structure
TEST_F(AqlProfileV2Test, PmcProfile) {
std::vector<aqlprofile_pmc_event_t> events(3);
// Setup events
events[0] = {0, 100, {0}, HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQ};
events[1] = {1, 200, {0}, HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TA};
events[2] = {2, 300, {0}, HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCA};
aqlprofile_pmc_profile_t profile;
profile.agent = test_agent_handle_;
profile.events = events.data();
profile.event_count = events.size();
EXPECT_EQ(profile.agent.handle, test_agent_handle_.handle);
EXPECT_EQ(profile.event_count, 3);
EXPECT_EQ(profile.events[0].block_index, 0);
@@ -240,39 +240,39 @@ TEST_F(AqlProfileV2Test, PmcProfile) {
// Test ATT parameter structure
TEST_F(AqlProfileV2Test, AttParameter) {
aqlprofile_att_parameter_t param;
// Test basic parameter
param.parameter_name = HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_OCCUPANCY_MODE;
param.value = 1;
EXPECT_EQ(param.parameter_name, HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_OCCUPANCY_MODE);
EXPECT_EQ(param.value, 1);
// Test counter ID and SIMD mask fields
param.parameter_name = HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_SE_MASK;
param.counter_id = 0x1234567; // 28 bits max
param.simd_mask = 0xF; // 4 bits max
EXPECT_EQ(param.counter_id, 0x1234567);
EXPECT_EQ(param.simd_mask, 0xF);
}
// Test ATT profile structure
TEST_F(AqlProfileV2Test, AttProfile) {
hsa_agent_t agent;
agent.handle = 0xABCDEF1234567890;
std::vector<aqlprofile_att_parameter_t> params(1);
params[0].parameter_name = HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_OCCUPANCY_MODE;
params[0].value = 1;
aqlprofile_att_profile_t profile;
profile.agent = agent;
profile.parameters = params.data();
profile.parameter_count = params.size();
EXPECT_EQ(profile.agent.handle, agent.handle);
EXPECT_EQ(profile.parameter_count, 1);
EXPECT_EQ(profile.parameters[0].parameter_name, HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_OCCUPANCY_MODE);
@@ -284,47 +284,47 @@ TEST_F(AqlProfileV2Test, AttProfile) {
// Test PMC AQL packets structure
TEST_F(AqlProfileV2Test, PmcAqlPackets) {
aqlprofile_pmc_aql_packets_t packets;
// Initialize packet headers
packets.start_packet.header = HSA_PACKET_TYPE_VENDOR_SPECIFIC << HSA_PACKET_HEADER_TYPE;
packets.stop_packet.header = HSA_PACKET_TYPE_VENDOR_SPECIFIC << HSA_PACKET_HEADER_TYPE;
packets.read_packet.header = HSA_PACKET_TYPE_VENDOR_SPECIFIC << HSA_PACKET_HEADER_TYPE;
// Test packet initialization
EXPECT_EQ(packets.start_packet.header & HSA_PACKET_HEADER_TYPE,
EXPECT_EQ(packets.start_packet.header & HSA_PACKET_HEADER_TYPE,
HSA_PACKET_TYPE_VENDOR_SPECIFIC << HSA_PACKET_HEADER_TYPE);
EXPECT_EQ(packets.stop_packet.header & HSA_PACKET_HEADER_TYPE,
EXPECT_EQ(packets.stop_packet.header & HSA_PACKET_HEADER_TYPE,
HSA_PACKET_TYPE_VENDOR_SPECIFIC << HSA_PACKET_HEADER_TYPE);
EXPECT_EQ(packets.read_packet.header & HSA_PACKET_HEADER_TYPE,
EXPECT_EQ(packets.read_packet.header & HSA_PACKET_HEADER_TYPE,
HSA_PACKET_TYPE_VENDOR_SPECIFIC << HSA_PACKET_HEADER_TYPE);
}
// Test ATT control AQL packets structure
TEST_F(AqlProfileV2Test, AttControlAqlPackets) {
aqlprofile_att_control_aql_packets_t packets;
// Initialize packet headers
packets.start_packet.header = HSA_PACKET_TYPE_VENDOR_SPECIFIC << HSA_PACKET_HEADER_TYPE;
packets.stop_packet.header = HSA_PACKET_TYPE_VENDOR_SPECIFIC << HSA_PACKET_HEADER_TYPE;
// Test packet initialization
EXPECT_EQ(packets.start_packet.header & HSA_PACKET_HEADER_TYPE,
EXPECT_EQ(packets.start_packet.header & HSA_PACKET_HEADER_TYPE,
HSA_PACKET_TYPE_VENDOR_SPECIFIC << HSA_PACKET_HEADER_TYPE);
EXPECT_EQ(packets.stop_packet.header & HSA_PACKET_HEADER_TYPE,
EXPECT_EQ(packets.stop_packet.header & HSA_PACKET_HEADER_TYPE,
HSA_PACKET_TYPE_VENDOR_SPECIFIC << HSA_PACKET_HEADER_TYPE);
}
// Test ATT code object data structure
TEST_F(AqlProfileV2Test, AttCodeobjData) {
aqlprofile_att_codeobj_data_t data;
data.id = 0x123456789ABCDEF0;
data.addr = 0xDEADBEEFCAFEBABE;
data.size = 0x10000;
data.agent.handle = 0x1122334455667788;
data.isUnload = 1;
data.fromStart = 0;
EXPECT_EQ(data.id, 0x123456789ABCDEF0);
EXPECT_EQ(data.addr, 0xDEADBEEFCAFEBABE);
EXPECT_EQ(data.size, 0x10000);
@@ -373,10 +373,10 @@ TEST_F(AqlProfileV2Test, StructureSizes) {
EXPECT_GT(sizeof(aqlprofile_pmc_aql_packets_t), 0);
EXPECT_GT(sizeof(aqlprofile_att_control_aql_packets_t), 0);
EXPECT_GT(sizeof(aqlprofile_att_codeobj_data_t), 0);
// Verify v1 structure is larger than base version
EXPECT_GT(sizeof(aqlprofile_agent_info_v1_t), sizeof(aqlprofile_agent_info_t));
// Verify handle structures are 8 bytes (uint64_t)
EXPECT_EQ(sizeof(aqlprofile_handle_t), 8);
EXPECT_EQ(sizeof(aqlprofile_agent_handle_t), 8);
@@ -387,22 +387,22 @@ TEST_F(AqlProfileV2Test, UnionBitfieldFunctionality) {
// Test buffer descriptor flags union
aqlprofile_buffer_desc_flags_t flags;
flags.raw = 0xFFFFFFFF;
// Check that bitfields are properly masked
EXPECT_EQ(flags.device_access, 1); // 1 bit
EXPECT_EQ(flags.host_access, 1); // 1 bit
EXPECT_EQ(flags.host_access, 1); // 1 bit
EXPECT_EQ(flags.memory_hint, 0x3F); // 6 bits
// Test PMC event flags union
aqlprofile_pmc_event_flags_t pmc_flags;
pmc_flags.raw = 0xFFFFFFFF;
EXPECT_EQ(pmc_flags.sq_flags.accum, 0x7); // 3 bits
// Test ATT parameter union
aqlprofile_att_parameter_t param;
param.value = 0xFFFFFFFF;
EXPECT_EQ(param.counter_id, 0x0FFFFFFF); // 28 bits
EXPECT_EQ(param.simd_mask, 0xF); // 4 bits
}
@@ -412,20 +412,20 @@ TEST_F(AqlProfileV2Test, DefaultInvalidValues) {
// Test zero-initialized structures
aqlprofile_handle_t zero_handle = {0};
EXPECT_EQ(zero_handle.handle, 0);
aqlprofile_agent_info_t zero_info = {};
EXPECT_EQ(zero_info.agent_gfxip, nullptr);
EXPECT_EQ(zero_info.xcc_num, 0);
EXPECT_EQ(zero_info.se_num, 0);
EXPECT_EQ(zero_info.cu_num, 0);
EXPECT_EQ(zero_info.shader_arrays_per_se, 0);
// Test with maximum values
aqlprofile_pmc_event_t max_event = {};
max_event.block_index = UINT32_MAX;
max_event.event_id = UINT32_MAX;
max_event.flags.raw = UINT32_MAX;
EXPECT_EQ(max_event.block_index, UINT32_MAX);
EXPECT_EQ(max_event.event_id, UINT32_MAX);
EXPECT_EQ(max_event.flags.raw, UINT32_MAX);
@@ -446,41 +446,41 @@ public:
// Test callback function signatures
TEST_F(AqlProfileV2Test, CallbackSignatures) {
CallbackMock mock;
// Test that callback function pointers can be assigned
aqlprofile_memory_alloc_callback_t alloc_cb =
aqlprofile_memory_alloc_callback_t alloc_cb =
[](void** ptr, uint64_t size, aqlprofile_buffer_desc_flags_t flags, void* userdata) -> hsa_status_t {
return HSA_STATUS_SUCCESS;
};
aqlprofile_memory_dealloc_callback_t dealloc_cb =
aqlprofile_memory_dealloc_callback_t dealloc_cb =
[](void* ptr, void* userdata) -> void {};
aqlprofile_memory_copy_t copy_cb =
aqlprofile_memory_copy_t copy_cb =
[](void* dst, const void* src, size_t size, void* userdata) -> hsa_status_t {
return HSA_STATUS_SUCCESS;
};
aqlprofile_pmc_data_callback_t pmc_cb =
aqlprofile_pmc_data_callback_t pmc_cb =
[](aqlprofile_pmc_event_t event, uint64_t counter_id, uint64_t counter_value, void* userdata) -> hsa_status_t {
return HSA_STATUS_SUCCESS;
};
aqlprofile_att_data_callback_t att_cb =
aqlprofile_att_data_callback_t att_cb =
[](uint32_t shader, void* buffer, uint64_t size, void* callback_data) -> hsa_status_t {
return HSA_STATUS_SUCCESS;
};
aqlprofile_eventname_callback_t event_cb =
aqlprofile_eventname_callback_t event_cb =
[](int id, const char* name, void* data) -> hsa_status_t {
return HSA_STATUS_SUCCESS;
};
aqlprofile_coordinate_callback_t coord_cb =
aqlprofile_coordinate_callback_t coord_cb =
[](int position, int id, int extent, int coordinate, const char* name, void* userdata) -> hsa_status_t {
return HSA_STATUS_SUCCESS;
};
// Verify callbacks are assigned
EXPECT_NE(alloc_cb, nullptr);
EXPECT_NE(dealloc_cb, nullptr);
@@ -501,11 +501,11 @@ protected:
last_callback_id_ = -1;
last_callback_name_ = "";
}
static int callback_call_count_;
static int last_callback_id_;
static std::string last_callback_name_;
// Mock callback functions for testing
static hsa_status_t eventname_callback_mock(int id, const char* name, void* data) {
callback_call_count_++;
@@ -513,26 +513,26 @@ protected:
if (name) last_callback_name_ = name;
return HSA_STATUS_SUCCESS;
}
static hsa_status_t coordinate_callback_mock(int position, int id, int extent,
static hsa_status_t coordinate_callback_mock(int position, int id, int extent,
int coordinate, const char* name, void* userdata) {
callback_call_count_++;
return HSA_STATUS_SUCCESS;
}
static hsa_status_t pmc_data_callback_mock(aqlprofile_pmc_event_t event, uint64_t counter_id,
static hsa_status_t pmc_data_callback_mock(aqlprofile_pmc_event_t event, uint64_t counter_id,
uint64_t counter_value, void* userdata) {
callback_call_count_++;
return HSA_STATUS_SUCCESS;
}
static hsa_status_t att_data_callback_mock(uint32_t shader, void* buffer,
static hsa_status_t att_data_callback_mock(uint32_t shader, void* buffer,
uint64_t size, void* callback_data) {
callback_call_count_++;
return HSA_STATUS_SUCCESS;
}
static hsa_status_t memory_alloc_mock(void** ptr, uint64_t size,
static hsa_status_t memory_alloc_mock(void** ptr, uint64_t size,
aqlprofile_buffer_desc_flags_t flags, void* userdata) {
if (ptr && size > 0) {
*ptr = malloc(size);
@@ -540,11 +540,11 @@ protected:
}
return HSA_STATUS_ERROR_INVALID_ARGUMENT;
}
static void memory_dealloc_mock(void* ptr, void* userdata) {
if (ptr) free(ptr);
}
static hsa_status_t memory_copy_mock(void* dst, const void* src, size_t size, void* userdata) {
if (dst && src && size > 0) {
memcpy(dst, src, size);
@@ -121,4 +121,4 @@ TEST(CodeobjMemoryManagerTest, CmdBufferAlloc) {
hsa_agent_t agent = {.handle = 1};
CodeobjMemoryManager mgr(agent, dummy_alloc, dummy_dealloc, 128, nullptr);
ASSERT_NE(mgr.cmd_buffer.get(), nullptr);
}
}
+14 -2
Visa fil
@@ -34,8 +34,20 @@ find_package(Clang REQUIRED CONFIG
## Building test executable
add_executable ( ${EXE_NAME} ${KERN_SRC} ${CTRL_SRC} ${UTIL_SRC} )
target_include_directories ( ${EXE_NAME} PRIVATE ${TEST_DIR} ${API_PATH} ${ROCM_ROOT_DIR}/include ${TEST_DIR}/parser/ ${TEST_DIR}/../src/core/include)
target_link_libraries( ${EXE_NAME} PRIVATE pthread hsa-runtime64::hsa-runtime64 dl )
target_include_directories ( ${EXE_NAME}
PRIVATE
${TEST_DIR}
${API_PATH}
${ROCM_ROOT_DIR}/include
${TEST_DIR}/parser/
${TEST_DIR}/../src/core/include
)
target_link_libraries( ${EXE_NAME}
PRIVATE
pthread
aqlprofile::headers
hsa-runtime64::hsa-runtime64
dl )
install(TARGETS ${EXE_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME} COMPONENT tests)
## Build the hsa (standalone) simple_convolution test