[engine] reland weaken affinity of raster/ui to non-e core instead of only fast core (flutter/engine#54616)

Some android devices have only a single fast core. We set the threading affinity for UI/Raster to the fast core, which can lead to the UI/Raster being serialized on this thread. Instead, we should weaken /invert the affinity to "Not slow cores".

FIxes https://github.com/flutter/flutter/issues/153690

Customer money will see some benchmark regressions but they can deal.
This commit is contained in:
Jonah Williams 2024-08-21 09:31:55 -07:00 committed by GitHub
parent aa26fa1254
commit 248dfb2334
4 changed files with 13 additions and 2 deletions

View File

@ -58,6 +58,8 @@ CPUSpeedTracker::CPUSpeedTracker(std::vector<CpuIndexAndSpeed> data)
}
if (data.speed == min_speed_value) {
efficiency_.push_back(data.index);
} else {
not_efficiency_.push_back(data.index);
}
}
@ -77,6 +79,8 @@ const std::vector<size_t>& CPUSpeedTracker::GetIndices(
return efficiency_;
case CpuAffinity::kNotPerformance:
return not_performance_;
case CpuAffinity::kNotEfficiency:
return not_efficiency_;
}
}

View File

@ -26,6 +26,9 @@ enum class CpuAffinity {
/// @brief Request affinity for all non-performance cores.
kNotPerformance,
/// @brief Request affinity for all non-efficiency cores.
kNotEfficiency,
};
/// @brief Request count of efficiency cores.
@ -79,6 +82,7 @@ class CPUSpeedTracker {
std::vector<size_t> efficiency_;
std::vector<size_t> performance_;
std::vector<size_t> not_performance_;
std::vector<size_t> not_efficiency_;
};
/// @note Visible for testing.

View File

@ -29,6 +29,9 @@ TEST(CpuAffinity, NormalSlowMedFastCores) {
ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotPerformance).size(), 2u);
ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotPerformance)[0], 0u);
ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotPerformance)[1], 1u);
ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotEfficiency).size(), 2u);
ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotEfficiency)[0], 1u);
ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotEfficiency)[1], 2u);
}
TEST(CpuAffinity, NoCpuData) {

View File

@ -49,14 +49,14 @@ static void AndroidPlatformThreadConfigSetter(
break;
}
case fml::Thread::ThreadPriority::kDisplay: {
fml::RequestAffinity(fml::CpuAffinity::kPerformance);
fml::RequestAffinity(fml::CpuAffinity::kNotEfficiency);
if (::setpriority(PRIO_PROCESS, 0, -1) != 0) {
FML_LOG(ERROR) << "Failed to set UI task runner priority";
}
break;
}
case fml::Thread::ThreadPriority::kRaster: {
fml::RequestAffinity(fml::CpuAffinity::kPerformance);
fml::RequestAffinity(fml::CpuAffinity::kNotEfficiency);
// Android describes -8 as "most important display threads, for
// compositing the screen and retrieving input events". Conservatively
// set the raster thread to slightly lower priority than it.