[SPM] Clean up obsolete SPM logics and refine some SPM-related definition (#157)

* Clean up obsolete SPM logics
* Add PERFCOUNTER_SELECT1 to CounterRegInfo
* Add RLC_SPM_PERFMON_SAMPLE_DELAY_MAX

[ROCm/aqlprofile commit: 6f236ffb5f]
This commit is contained in:
Ma, Bing
2025-07-18 15:26:44 -07:00
gecommit door GitHub
bovenliggende 126e46153c
commit a75174f855
20 gewijzigde bestanden met toevoegingen van 546 en 1224 verwijderingen
@@ -330,7 +330,7 @@ class Gfx10CmdBuilder : public CmdBuilder {
}
void BuildNopPacket(CmdBuffer* cmdbuf, uint32_t num_dwords) {
uint32_t header = MakePacket3Header(PACKET3_NOP, num_dwords);
uint32_t header = MakePacket3Header(PACKET3_NOP, num_dwords * sizeof(uint32_t));
APPEND_COMMAND_WRAPPER(cmdbuf, header);
if (num_dwords > 1) {
std::vector<uint32_t> data_block((num_dwords - 1), 0);
@@ -304,7 +304,7 @@ class Gfx11CmdBuilder : public CmdBuilder {
}
void BuildNopPacket(CmdBuffer* cmdbuf, uint32_t num_dwords) {
uint32_t header = MakePacket3Header(PACKET3_NOP, num_dwords);
uint32_t header = MakePacket3Header(PACKET3_NOP, num_dwords * sizeof(uint32_t));
APPEND_COMMAND_WRAPPER(cmdbuf, header);
if (num_dwords > 1) {
std::vector<uint32_t> data_block((num_dwords - 1), 0);
@@ -325,7 +325,7 @@ class Gfx9CmdBuilder : public CmdBuilder {
}
void BuildNopPacket(CmdBuffer* cmdbuf, uint32_t num_dwords) {
uint32_t header = MakePacket3Header(PACKET3_NOP, num_dwords);
uint32_t header = MakePacket3Header(PACKET3_NOP, num_dwords * sizeof(uint32_t));
APPEND_COMMAND_WRAPPER(cmdbuf, header);
if (num_dwords > 1) {
std::vector<uint32_t> data_block((num_dwords - 1), 0);
@@ -104,19 +104,6 @@ class GpuSpmBuilder : public SpmBuilder, protected Primitives {
// 3. Program the RLC_PERFMON_SEGMENT_SIZE register.
builder.BuildWriteUConfigRegPacket(cmd_buffer, Primitives::RLC_SPM_PERFMON_CNTL__ADDR,
Primitives::rlc_spm_perfmon_cntl_value(sampling_rate));
if (!config->spm_kfd_mode) {
builder.BuildWriteUConfigRegPacket(cmd_buffer, Primitives::RLC_SPM_PERFMON_RING_BASE_LO__ADDR,
buffer_ptr);
builder.BuildWriteUConfigRegPacket(cmd_buffer, Primitives::RLC_SPM_PERFMON_RING_BASE_HI__ADDR,
buffer_ptr >> 32);
builder.BuildWriteUConfigRegPacket(cmd_buffer, Primitives::RLC_SPM_PERFMON_RING_SIZE__ADDR,
buffer_size);
}
// Setting VMID
if (!config->spm_kfd_mode)
builder.BuildWriteUConfigRegPacket(cmd_buffer, Primitives::RLC_SPM_MC_CNTL__ADDR,
Primitives::rlc_spm_mc_cntl_value());
// Iterate through the list of blocks to create PM4 packets to read counter values
// Below pair.first is the block id of a counter event and pair.second is the index into
@@ -272,17 +259,16 @@ class GpuSpmBuilder : public SpmBuilder, protected Primitives {
for (size_t j = 0; j < block_info->instance_count; ++j) {
builder.BuildWriteUConfigRegPacket(cmd_buffer, Primitives::GRBM_GFX_INDEX_ADDR,
Primitives::grbm_inst_se_sh_index_value(j, 0, 0));
builder.BuildWriteUConfigRegPacket(cmd_buffer, block_info->delay_info[j].reg,
builder.BuildWriteUConfigRegPacket(cmd_buffer, block_info->delay_info.reg,
Primitives::get_spm_global_delay(counter_des, j));
}
} else {
for (size_t i = 0; i < config->spm_se_number_total; ++i) {
for (size_t i = 0; i < config->se_number; ++i) {
for (size_t j = 0; j < block_info->instance_count; ++j) {
int delay_index = i * block_info->instance_count + j;
builder.BuildWriteUConfigRegPacket(cmd_buffer, Primitives::GRBM_GFX_INDEX_ADDR,
Primitives::grbm_inst_se_index_value(j, i));
builder.BuildWriteUConfigRegPacket(cmd_buffer,
block_info->delay_info[delay_index].reg,
block_info->delay_info.reg,
Primitives::get_spm_se_delay(counter_des, i, j));
}
}
@@ -341,7 +327,7 @@ class GpuSpmBuilder : public SpmBuilder, protected Primitives {
builder.BuildWriteUConfigRegPacket(
cmd_buffer, Primitives::RLC_SPM_PERFMON_SEGMENT_SIZE__ADDR,
Primitives::rlc_spm_perfmon_segment_size_value(global_count, se_count));
if (config->mi100) {
if (config->spm_has_core1) {
builder.BuildWriteUConfigRegPacket(
cmd_buffer, Primitives::RLC_SPM_PERFMON_SEGMENT_SIZE_CORE1__ADDR,
Primitives::rlc_spm_perfmon_segment_size_core1_value(se_count));
@@ -42,18 +42,20 @@ struct TraceConfig {
uint32_t perfMASK = ~0u;
uint32_t perfCTRL = 0;
std::vector<std::pair<size_t, size_t>> perfcounters{};
// GC configurations used by both TT and SPM
uint32_t se_number = 0;
uint32_t sa_number = 0;
uint32_t xcc_number = 0;
// SPM mode
bool spm_sq_32bit_mode = true;
bool spm_kfd_mode = true;
bool mi100 = false;
bool spm_has_core1 = false;
uint32_t spm_sample_delay_max = 0;
void* control_buffer_ptr = nullptr;
uint32_t control_buffer_size = 0;
void* data_buffer_ptr = nullptr;
uint32_t data_buffer_size = 0;
// SE number for tracing
uint32_t spm_se_number_total = 0;
// concurrent kernels mode
uint32_t concurrent = 0;
// SE mask for tracing; note -> replicated for all XCCs