Merge pull request #1043 from Subv/timing
Use an approximated amortized amount of ticks when advancing timing.
This commit is contained in:
commit
fecffeb0dd
|
@ -86,7 +86,16 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddTicks(u64 ticks) override {
|
void AddTicks(u64 ticks) override {
|
||||||
CoreTiming::AddTicks(ticks - num_interpreted_instructions);
|
// Divide the number of ticks by the amount of CPU cores. TODO(Subv): This yields only a
|
||||||
|
// rough approximation of the amount of executed ticks in the system, it may be thrown off
|
||||||
|
// if not all cores are doing a similar amount of work. Instead of doing this, we should
|
||||||
|
// device a way so that timing is consistent across all cores without increasing the ticks 4
|
||||||
|
// times.
|
||||||
|
u64 amortized_ticks = (ticks - num_interpreted_instructions) / Core::NUM_CPU_CORES;
|
||||||
|
// Always execute at least one tick.
|
||||||
|
amortized_ticks = std::max<u64>(amortized_ticks, 1);
|
||||||
|
|
||||||
|
CoreTiming::AddTicks(amortized_ticks);
|
||||||
num_interpreted_instructions = 0;
|
num_interpreted_instructions = 0;
|
||||||
}
|
}
|
||||||
u64 GetTicksRemaining() override {
|
u64 GetTicksRemaining() override {
|
||||||
|
|
|
@ -91,6 +91,7 @@ void Cpu::RunLoop(bool tight_loop) {
|
||||||
LOG_TRACE(Core, "Core-{} idling", core_index);
|
LOG_TRACE(Core, "Core-{} idling", core_index);
|
||||||
|
|
||||||
if (IsMainCore()) {
|
if (IsMainCore()) {
|
||||||
|
// TODO(Subv): Only let CoreTiming idle if all 4 cores are idling.
|
||||||
CoreTiming::Idle();
|
CoreTiming::Idle();
|
||||||
CoreTiming::Advance();
|
CoreTiming::Advance();
|
||||||
}
|
}
|
||||||
|
|
|
@ -532,7 +532,6 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V
|
||||||
CASCADE_RESULT(thread->guest_handle, g_handle_table.Create(thread));
|
CASCADE_RESULT(thread->guest_handle, g_handle_table.Create(thread));
|
||||||
*out_handle = thread->guest_handle;
|
*out_handle = thread->guest_handle;
|
||||||
|
|
||||||
Core::System::GetInstance().PrepareReschedule();
|
|
||||||
Core::System::GetInstance().CpuCore(thread->processor_id).PrepareReschedule();
|
Core::System::GetInstance().CpuCore(thread->processor_id).PrepareReschedule();
|
||||||
|
|
||||||
LOG_TRACE(Kernel_SVC,
|
LOG_TRACE(Kernel_SVC,
|
||||||
|
|
Reference in New Issue