Merge pull request #1043 from Subv/timing
Use an approximated amortized amount of ticks when advancing timing.
This commit is contained in:
		| @@ -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
	
	Block a user