| 3540 | } |
| 3541 | |
| 3542 | static void InitializeProcessorList() |
| 3543 | { |
| 3544 | if (!cpuinfo_initialize()) |
| 3545 | { |
| 3546 | ERROR_LOG("cpuinfo_initialize() failed"); |
| 3547 | return; |
| 3548 | } |
| 3549 | |
| 3550 | INFO_LOG("Processor count: {} cores, {} processors, {} clusters", |
| 3551 | cpuinfo_get_cores_count(), cpuinfo_get_processors_count(), cpuinfo_get_clusters_count()); |
| 3552 | |
| 3553 | const u32 processor_count = cpuinfo_get_processors_count(); |
| 3554 | std::vector<const cpuinfo_processor*> processors; |
| 3555 | for (u32 i = 0; i < processor_count; i++) |
| 3556 | { |
| 3557 | // Ignore hyperthreads/SMT. They're not helpful for pinning. |
| 3558 | const cpuinfo_processor* proc = cpuinfo_get_processor(i); |
| 3559 | if (!proc || proc->smt_id != 0) |
| 3560 | continue; |
| 3561 | |
| 3562 | processors.push_back(proc); |
| 3563 | } |
| 3564 | |
| 3565 | // Prioritize faster cores in heterogeneous CPUs. |
| 3566 | std::sort(processors.begin(), processors.end(), |
| 3567 | [](const cpuinfo_processor* lhs, const cpuinfo_processor* rhs) { |
| 3568 | return (lhs->core->frequency > rhs->core->frequency); |
| 3569 | }); |
| 3570 | |
| 3571 | SmallString str; |
| 3572 | str.assign("Ordered processor list: "); |
| 3573 | s_processor_list.reserve(processors.size()); |
| 3574 | for (const cpuinfo_processor* proc : processors) |
| 3575 | { |
| 3576 | const u32 proc_id = GetProcessorIdForProcessor(proc); |
| 3577 | str.append_format("{}{}", (proc == processors.front()) ? "" : ", ", proc_id); |
| 3578 | s_processor_list.push_back(proc_id); |
| 3579 | } |
| 3580 | Console.WriteLn(str.view()); |
| 3581 | } |
| 3582 | |
| 3583 | void VMManager::SetHardwareDependentDefaultSettings(SettingsInterface& si) |
| 3584 | { |
nothing calls this directly
no test coverage detected