[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
Tento commit je obsažen v:
Ma, Bing
2025-05-29 15:14:09 -07:00
odevzdal GitHub
rodič 1ed169e30c
revize b20803e95d
15 změnil soubory, kde provedl 322 přidání a 329 odebrání
+2 -2
Zobrazit soubor
@@ -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,
+2 -2
Zobrazit soubor
@@ -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,
+26 -22
Zobrazit soubor
@@ -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
+2 -2
Zobrazit soubor
@@ -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;
+3 -3
Zobrazit soubor
@@ -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;
+1 -1
Zobrazit soubor
@@ -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;
+1 -1
Zobrazit soubor
@@ -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,
+2 -2
Zobrazit soubor
@@ -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
+43
Zobrazit soubor
@@ -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
Zobrazit soubor
@@ -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 {