@@ -1101,6 +1101,7 @@ bool PCM::discoverSystemTopology()
1101
1101
uint32 smtMaskWidth = 0 ;
1102
1102
uint32 coreMaskWidth = 0 ;
1103
1103
uint32 l2CacheMaskShift = 0 ;
1104
+ uint32 l3CacheMaskShift = 0 ;
1104
1105
1105
1106
struct domain
1106
1107
{
@@ -1111,7 +1112,7 @@ bool PCM::discoverSystemTopology()
1111
1112
{
1112
1113
TemporalThreadAffinity aff0 (0 );
1113
1114
1114
- if (initCoreMasks (smtMaskWidth, coreMaskWidth, l2CacheMaskShift) == false )
1115
+ if (initCoreMasks (smtMaskWidth, coreMaskWidth, l2CacheMaskShift, l3CacheMaskShift ) == false )
1115
1116
{
1116
1117
std::cerr << " ERROR: Major problem? No leaf 0 under cpuid function 11.\n " ;
1117
1118
return false ;
@@ -1151,20 +1152,18 @@ bool PCM::discoverSystemTopology()
1151
1152
for (size_t l = 0 ; l < topologyDomains.size (); ++l)
1152
1153
{
1153
1154
topologyDomainMap[topologyDomains[l].type ] = topologyDomains[l];
1154
- #if 0
1155
- std::cerr << "Topology level: " << l <<
1156
- " type: " << topologyDomains[l].type <<
1157
- " (" << TopologyEntry::getDomainTypeStr(topologyDomains[l].type) << ")" <<
1158
- " width: " << topologyDomains[l].width <<
1159
- " levelShift: " << topologyDomains[l].levelShift <<
1160
- " nextLevelShift: " << topologyDomains[l].nextLevelShift << "\n";
1161
- #endif
1155
+ DBG (1 , " Topology level: " , l ,
1156
+ " type: " , topologyDomains[l].type ,
1157
+ " (" , TopologyEntry::getDomainTypeStr (topologyDomains[l].type ) , " )" ,
1158
+ " width: " , topologyDomains[l].width ,
1159
+ " levelShift: " , topologyDomains[l].levelShift ,
1160
+ " nextLevelShift: " , topologyDomains[l].nextLevelShift );
1162
1161
}
1163
1162
}
1164
1163
}
1165
1164
1166
1165
#ifndef __APPLE__
1167
- auto populateEntry = [&topologyDomainMap,&smtMaskWidth, &coreMaskWidth, &l2CacheMaskShift](TopologyEntry& entry)
1166
+ auto populateEntry = [&topologyDomainMap,&smtMaskWidth, &coreMaskWidth, &l2CacheMaskShift, &l3CacheMaskShift ](TopologyEntry& entry)
1168
1167
{
1169
1168
auto getAPICID = [&](const uint32 leaf)
1170
1169
{
@@ -1218,6 +1217,7 @@ bool PCM::discoverSystemTopology()
1218
1217
{
1219
1218
fillEntry (entry, smtMaskWidth, coreMaskWidth, l2CacheMaskShift, getAPICID (0xb ));
1220
1219
}
1220
+ entry.l3_cache_id = extract_bits_32 (getAPICID (0xb ), l3CacheMaskShift, 31 );
1221
1221
};
1222
1222
#endif
1223
1223
@@ -3231,7 +3231,7 @@ void PCM::printDetailedSystemTopology(const int detailLevel)
3231
3231
std::cerr << " Tile_Id " ;
3232
3232
if (detailLevel > 0 ) std::cerr << " Die_Id Die_Group_Id " ;
3233
3233
std::cerr << " Package_Id Core_Type Native_CPU_Model\n " ;
3234
- std::map<uint32, std::vector<uint32> > os_id_by_core, os_id_by_tile, core_id_by_socket;
3234
+ std::map<uint32, std::vector<uint32> > os_id_by_core, os_id_by_tile, core_id_by_socket, os_id_by_l3_cache ;
3235
3235
size_t counter = 0 ;
3236
3236
for (auto it = topology.begin (); it != topology.end (); ++it)
3237
3237
{
@@ -3252,6 +3252,7 @@ void PCM::printDetailedSystemTopology(const int detailLevel)
3252
3252
// add socket offset to distinguish cores and tiles from different sockets
3253
3253
os_id_by_core[(it->socket_id << 15 ) + it->core_id ].push_back (it->os_id );
3254
3254
os_id_by_tile[(it->socket_id << 15 ) + it->tile_id ].push_back (it->os_id );
3255
+ os_id_by_l3_cache[(it->socket_id << 15 ) + it->l3_cache_id ].push_back (it->os_id );
3255
3256
3256
3257
++counter;
3257
3258
}
@@ -3288,6 +3289,16 @@ void PCM::printDetailedSystemTopology(const int detailLevel)
3288
3289
}
3289
3290
std::cerr << " )" ;
3290
3291
}
3292
+ std::cerr << " \n L3$ " ;
3293
+ for (auto core = os_id_by_l3_cache.begin (); core != os_id_by_l3_cache.end (); ++core)
3294
+ {
3295
+ auto os_id = core->second .begin ();
3296
+ std::cerr << " (" << *os_id;
3297
+ for (++os_id; os_id != core->second .end (); ++os_id) {
3298
+ std::cerr << " ," << *os_id;
3299
+ }
3300
+ std::cerr << " )" ;
3301
+ }
3291
3302
std::cerr << " \n " ;
3292
3303
std::cerr << " \n " ;
3293
3304
}
@@ -7560,14 +7571,23 @@ void PCM::getPCICFGPMUsFromDiscovery(const unsigned int BoxType, const size_t s,
7560
7571
{
7561
7572
std::vector<std::shared_ptr<HWRegister> > CounterControlRegs, CounterValueRegs;
7562
7573
const auto n_regs = uncorePMUDiscovery->getBoxNumRegs (BoxType, s, pos);
7563
- auto makeRegister = [](const uint64 rawAddr)
7574
+ auto makeRegister = [&pos, &numBoxes, &BoxType, &s ](const uint64 rawAddr)
7564
7575
{
7565
7576
#ifndef PCI_ENABLE
7566
7577
constexpr auto PCI_ENABLE = 0x80000000ULL ;
7567
7578
#endif
7568
7579
UncorePMUDiscovery::PCICFGAddress Addr;
7569
7580
Addr.raw = rawAddr;
7570
- assert (Addr.raw & PCI_ENABLE);
7581
+ if ((Addr.raw & PCI_ENABLE) == 0 )
7582
+ {
7583
+ std::cerr << " PCM Error: PCI_ENABLE bit not set in address 0x" << std::hex << Addr.raw << std::dec << " \n " ;
7584
+ std::cerr << " This is likely a bug in the uncore PMU discovery BIOS table. Contact your BIOS vendor.\n " ;
7585
+ std::cerr << " Socket: " << s << " \n " ;
7586
+ std::cerr << " Box type: " << BoxType << " \n " ;
7587
+ std::cerr << " Box position: " << pos << " /" << numBoxes << " \n " ;
7588
+ std::cerr << " Address: " << Addr.getStr () << " \n " ;
7589
+ return std::shared_ptr<PCICFGRegister64>();
7590
+ }
7571
7591
try {
7572
7592
auto handle = std::make_shared<PciHandleType>(0 , (uint32)Addr.fields .bus ,
7573
7593
(uint32)Addr.fields .device ,
0 commit comments