[gfx12] Finalize support for gfx12 new counter blocks (#81)

1. Move all new gfx12 block enums to aql_profile_v2.h. hsa_ven_amd_aqlprofile.h will be left untouched.
2. Re-org counter info in gfx12_block_info.h to be purely alphabetic-ordered for easy comparison between different IP versions. Also use auto-gen block name from IP header files whenever possible to reduce manual editing.
3. Remove unused counter info from graphics blocks.
4. Added UTCL2 and VML2 support
5. Added all gfx12 blocks to ctrl test

[ROCm/aqlprofile commit: b20803e95d]
This commit is contained in:
Ma, Bing
2025-05-29 15:14:09 -07:00
committed by GitHub
orang tua 7c4369bde4
melakukan c50a8225ae
15 mengubah file dengan 322 tambahan dan 329 penghapusan
@@ -48,7 +48,7 @@ class Gfx10Factory : public Pm4Factory {
// void ConstructTable(const AgentInfo* agent_info);
void Init(const AgentInfo* agent_info);
// void ConstructBuilders(const AgentInfo* agent_info);
static const GpuBlockInfo* block_table_[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER];
static const GpuBlockInfo* block_table_[AQLPROFILE_BLOCKS_NUMBER];
};
// Gfx builders init
@@ -81,7 +81,7 @@ void Gfx10Factory::Init(const AgentInfo* agent_info) {
}
// GFX10 block table
const GpuBlockInfo* Gfx10Factory::block_table_[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER] = {
const GpuBlockInfo* Gfx10Factory::block_table_[AQLPROFILE_BLOCKS_NUMBER] = {
&CpcCounterBlockInfo, &CpfCounterBlockInfo, &GdsCounterBlockInfo, &GrbmCounterBlockInfo,
NULL /*&GrbmSeCounterBlockInfo*/, &SpiCounterBlockInfo, &SqCounterBlockInfo,
NULL /*&SqCsCounterBlockInfo*/, NULL /*GFX8 SRBM*/, &SxCounterBlockInfo, &TaCounterBlockInfo,
@@ -48,7 +48,7 @@ class Gfx11Factory : public Pm4Factory {
// void ConstructTable(const AgentInfo* agent_info);
void Init(const AgentInfo* agent_info);
// void ConstructBuilders(const AgentInfo* agent_info);
static const GpuBlockInfo* block_table_[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER];
static const GpuBlockInfo* block_table_[AQLPROFILE_BLOCKS_NUMBER];
};
// Gfx builders init
@@ -81,7 +81,7 @@ void Gfx11Factory::Init(const AgentInfo* agent_info) {
}
// GFX11 block table
const GpuBlockInfo* Gfx11Factory::block_table_[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER] = {
const GpuBlockInfo* Gfx11Factory::block_table_[AQLPROFILE_BLOCKS_NUMBER] = {
&CpcCounterBlockInfo, &CpfCounterBlockInfo, &GdsCounterBlockInfo, &GrbmCounterBlockInfo,
NULL /*&GrbmSeCounterBlockInfo*/, &SpiCounterBlockInfo, &SqCounterBlockInfo,
NULL /*&SqCsCounterBlockInfo*/, NULL /*GFX8 SRBM*/, &SxCounterBlockInfo, &TaCounterBlockInfo,
@@ -79,31 +79,35 @@ void Gfx12Factory::ConstructBuilders(const AgentInfo* agent_info) {
void Gfx12Factory::ConstructTable(const AgentInfo* agent_info) {
// Global blocks
block_table_[__BLOCK_ID(CHA)] = &ChaCounterBlockInfo;
block_table_[__BLOCK_ID(CHC)] = &ChcCounterBlockInfo;
block_table_[__BLOCK_ID(CPC)] = &CpcCounterBlockInfo;
block_table_[__BLOCK_ID(CPF)] = &CpfCounterBlockInfo;
block_table_[__BLOCK_ID(CPG)] = &CpgCounterBlockInfo;
block_table_[__BLOCK_ID(GCEA)] = &GceaCounterBlockInfo;
block_table_[__BLOCK_ID(GCR)] = &GcrCounterBlockInfo;
block_table_[__BLOCK_ID(GL2A)] = &Gl2aCounterBlockInfo;
block_table_[__BLOCK_ID(GL2C)] = &Gl2cCounterBlockInfo;
block_table_[__BLOCK_ID(GRBM)] = &GrbmCounterBlockInfo;
block_table_[__BLOCK_ID(RLC)] = &RlcCounterBlockInfo;
block_table_[__BLOCK_ID(SDMA_PM)] = &SdmaPmCounterBlockInfo;
block_table_[__BLOCK_ID(CHA)] = &ChaCounterBlockInfo;
block_table_[__BLOCK_ID(CHC)] = &ChcCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(CPC)] = &CpcCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(CPF)] = &CpfCounterBlockInfo;
block_table_[__BLOCK_ID(CPG)] = &CpgCounterBlockInfo;
block_table_[__BLOCK_ID(GC_UTCL2)] = &GcUtcl2CounterBlockInfo;
block_table_[__BLOCK_ID(GC_VML2)] = &GcVml2CounterBlockInfo;
block_table_[__BLOCK_ID(GC_VML2_SPM)] = &GcVml2SpmCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(GCEA)] = &GceaCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(GCR)] = &GcrCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(GL2A)] = &Gl2aCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(GL2C)] = &Gl2cCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(GRBM)] = &GrbmCounterBlockInfo;
block_table_[__BLOCK_ID(RLC)] = &RlcCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(SDMA)] = &SdmaCounterBlockInfo;
// SE blocks
block_table_[__BLOCK_ID(GCEA_SE)] = &GceaSeCounterBlockInfo;
block_table_[__BLOCK_ID(GRBMH)] = &GrbmhCounterBlockInfo;
block_table_[__BLOCK_ID(SPI)] = &SpiCounterBlockInfo;
block_table_[__BLOCK_ID(SQ)] = &SqcCounterBlockInfo;
block_table_[__BLOCK_ID(GC_UTCL1)] = &GcUtcl1CounterBlockInfo;
block_table_[__BLOCK_ID(GC_UTCL1)] = &GcUtcl1CounterBlockInfo;
block_table_[__BLOCK_ID(GCEA_SE)] = &GceaSeCounterBlockInfo;
block_table_[__BLOCK_ID(GRBMH)] = &GrbmhCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(SPI)] = &SpiCounterBlockInfo;
block_table_[__BLOCK_ID(SQG)] = &SqgCounterBlockInfo;
// SA blocks
block_table_[__BLOCK_ID(GL1A)] = &Gl1aCounterBlockInfo;
block_table_[__BLOCK_ID(GL1C)] = &Gl1cCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(GL1A)] = &Gl1aCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(GL1C)] = &Gl1cCounterBlockInfo;
// WGP blocks
block_table_[__BLOCK_ID(TA)] = &TaCounterBlockInfo;
block_table_[__BLOCK_ID(TCP)] = &TcpCounterBlockInfo;
block_table_[__BLOCK_ID(TD)] = &TdCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(SQ)] = &SqcCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(TA)] = &TaCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(TCP)] = &TcpCounterBlockInfo;
block_table_[__BLOCK_ID_HSA(TD)] = &TdCounterBlockInfo;
}
// Pm4Factory create mathods
@@ -28,11 +28,11 @@
namespace aql_profile {
const GpuBlockInfo* Mi100Factory::block_table_[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER] = {};
const GpuBlockInfo* Mi100Factory::block_table_[AQLPROFILE_BLOCKS_NUMBER] = {};
Mi100Factory::Mi100Factory(const AgentInfo* agent_info)
: Gfx9Factory(block_table_, sizeof(block_table_), agent_info) {
for (unsigned i = 0; i < HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER; ++i) {
for (unsigned i = 0; i < AQLPROFILE_BLOCKS_NUMBER; ++i) {
const GpuBlockInfo* base_table_ptr = Gfx9Factory::block_table_[i];
if (base_table_ptr == NULL) continue;
GpuBlockInfo* block_info = nullptr;
@@ -37,14 +37,14 @@ class Mi200Factory : public Gfx9Factory {
virtual int GetAccumHiID() const override { return 185; };
protected:
static const GpuBlockInfo* block_table_[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER];
static const GpuBlockInfo* block_table_[AQLPROFILE_BLOCKS_NUMBER];
};
const GpuBlockInfo* Mi200Factory::block_table_[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER] = {};
const GpuBlockInfo* Mi200Factory::block_table_[AQLPROFILE_BLOCKS_NUMBER] = {};
Mi200Factory::Mi200Factory(const AgentInfo* agent_info)
: Gfx9Factory(block_table_, sizeof(block_table_), agent_info) {
for (unsigned i = 0; i < HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER; ++i) {
for (unsigned i = 0; i < AQLPROFILE_BLOCKS_NUMBER; ++i) {
const GpuBlockInfo* base_table_ptr = Gfx9Factory::block_table_[i];
if (base_table_ptr == NULL) continue;
GpuBlockInfo* block_info = nullptr;
@@ -31,7 +31,7 @@ namespace aql_profile {
class Mi300Factory : public Mi100Factory {
public:
explicit Mi300Factory(const AgentInfo* agent_info) : Mi100Factory(agent_info) {
for (unsigned blockname_id = 0; blockname_id < HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER;
for (unsigned blockname_id = 0; blockname_id < AQLPROFILE_BLOCKS_NUMBER;
++blockname_id) {
const GpuBlockInfo* base_table_ptr = Gfx9Factory::block_table_[blockname_id];
if (base_table_ptr == NULL) continue;
@@ -76,7 +76,7 @@ void Gfx9Factory::Print(const GpuBlockInfo* block_info) {
}
// GFX9 block table
const GpuBlockInfo* Gfx9Factory::block_table_[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER] = {
const GpuBlockInfo* Gfx9Factory::block_table_[AQLPROFILE_BLOCKS_NUMBER] = {
&CpcCounterBlockInfo, &CpfCounterBlockInfo, &GdsCounterBlockInfo, &GrbmCounterBlockInfo,
&GrbmSeCounterBlockInfo, &SpiCounterBlockInfo, &SqCounterBlockInfo, &SqCsCounterBlockInfo,
NULL /*GFX? SRBM*/, &SxCounterBlockInfo, &TaCounterBlockInfo, &TcaCounterBlockInfo,
@@ -42,7 +42,7 @@ class Gfx9Factory : public Pm4Factory {
protected:
void Init(const AgentInfo* agent_info);
static const GpuBlockInfo* block_table_[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER];
static const GpuBlockInfo* block_table_[AQLPROFILE_BLOCKS_NUMBER];
static void Print(const GpuBlockInfo* block_info);
};
@@ -53,7 +53,7 @@ class Mi100Factory : public Gfx9Factory {
explicit Mi100Factory(const AgentInfo* agent_info);
protected:
static const GpuBlockInfo* block_table_[HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER];
static const GpuBlockInfo* block_table_[AQLPROFILE_BLOCKS_NUMBER];
};
} // namespace aql_profile
@@ -50,6 +50,49 @@ typedef enum {
AQLPROFILE_AGENT_VERSION_LAST
} aqlprofile_agent_version_t;
/**
* @brief Enums for counter blocks.
* AQLPROFILE_BLOCK_NAME_RESERVED_X are blocks reserved for npi. Reserving them here can maintain
* enum consistency between mainline and npi.
* TODO: Move all counter blocks here from hsa_ven_amd_aqlprofile.h
*/
typedef enum {
// Blocks reserved for NPI support
AQLPROFILE_BLOCK_NAME_RESERVED_0 = HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER,
AQLPROFILE_BLOCK_NAME_RESERVED_1,
AQLPROFILE_BLOCK_NAME_RESERVED_2,
AQLPROFILE_BLOCK_NAME_RESERVED_3,
AQLPROFILE_BLOCK_NAME_RESERVED_4,
AQLPROFILE_BLOCK_NAME_RESERVED_5,
// Blocks available for most ASICs, but not currently in use
AQLPROFILE_BLOCK_NAME_CPG,
AQLPROFILE_BLOCK_NAME_RLC,
// New blocks for gc_12_0_x
AQLPROFILE_BLOCK_NAME_CHA,
AQLPROFILE_BLOCK_NAME_CHC,
AQLPROFILE_BLOCK_NAME_GC_CANE,
AQLPROFILE_BLOCK_NAME_GC_FFBM,
AQLPROFILE_BLOCK_NAME_GC_L2TLB,
AQLPROFILE_BLOCK_NAME_GC_UTCL1,
AQLPROFILE_BLOCK_NAME_GC_UTCL2,
AQLPROFILE_BLOCK_NAME_GC_VML2,
AQLPROFILE_BLOCK_NAME_GC_VML2_SPM,
AQLPROFILE_BLOCK_NAME_GCEA_SE,
AQLPROFILE_BLOCK_NAME_GRBMH,
AQLPROFILE_BLOCK_NAME_SQG,
// Blocks reserved for NPI support
AQLPROFILE_BLOCK_NAME_RESERVED_6,
AQLPROFILE_BLOCK_NAME_RESERVED_7,
AQLPROFILE_BLOCK_NAME_RESERVED_8,
AQLPROFILE_BLOCK_NAME_RESERVED_9,
// Add new blocks above
AQLPROFILE_BLOCKS_NUMBER
} aqlprofile_block_name_t;
/**
* @brief Flags to describe which agents can access given buffer.
*/
+10 -2
Melihat File
@@ -285,9 +285,14 @@ class GpuPmcBuilder : public PmcBuilder, protected Primitives {
// std::endl;
// Set GRBM index to access proper block instance
const uint32_t grbm_value = (block_info->instance_count > 1)
//
// TODO: In order to get different event for different instance with WGP counter blocks, we
// need to loop through WGP instead of blindly broadcast instance. Fortunately, this
// is not a common practice
const uint32_t grbm_value = (block_info->instance_count > 1 && !(block_info->attr & CounterBlockWgpAttr))
? Primitives::grbm_inst_index_value(block_des.index)
: Primitives::grbm_broadcast_value();
builder.BuildWriteUConfigRegPacket(cmd_buffer, Primitives::GRBM_GFX_INDEX_ADDR, grbm_value);
// Reset counters
if (block_info->attr & CounterBlockMcAttr) {
@@ -602,9 +607,12 @@ class GpuPmcBuilder : public PmcBuilder, protected Primitives {
else
grbm_value = Primitives::grbm_se_sh_wgp_index_value(se_index, sarray, wgp);
builder.BuildWriteUConfigRegPacket(cmd_buffer, Primitives::GRBM_GFX_INDEX_ADDR, grbm_value);
uint32_t dw_mask = reg_info.register_addr_hi.offset ? 3 : 1;
builder.BuildCopyCounterDataPacket(
cmd_buffer, reg_info.register_addr_lo, reg_info.register_addr_hi,
reinterpret_cast<uint32_t*>(data_buffer) + read_counter, 1);
reinterpret_cast<uint32_t*>(data_buffer) + read_counter, dw_mask);
if (data_buffer && (dw_mask == 1))
*(reinterpret_cast<uint32_t*>(data_buffer) + read_counter + 1) = 0;
read_counter += 2;
}
} else {