]> granicus.if.org Git - libvpx/commit
vp8: Remove sched_yield on POSIX systems
authorJoel Fernandes <joelaf@google.com>
Mon, 14 Sep 2020 02:05:47 +0000 (22:05 -0400)
committerJoel Fernandes <joelaf@google.com>
Mon, 14 Sep 2020 20:49:42 +0000 (20:49 +0000)
commit97356acb50e212fcfb7c91715718ec70953f780c
treeaf4b1e6440554750fa3cc1c59a89f4e22fe80f98
parent478c70f6d2c1f83d4c4e82ced533e71d9e19ef32
vp8: Remove sched_yield on POSIX systems

libvpx does sched_yield() on Linux. This is highly frowned upon these
days mainly because it is not needed and causes high scheduler overhead.

It is not needed because the kernel will preempt the task while it is
spinning which will imply a yield. On ChromeOS, not yielding has the
following improvements:

1. power_VideoCall test as seen on perf profile:

With yield:
     9.40%  [kernel]            [k] __pi___clean_dcache_area_poc
     7.32%  [kernel]            [k] _raw_spin_unlock_irq  <-- kernel scheduler

Without yield:
     8.76%  [kernel]            [k] __pi___clean_dcache_area_poc
     2.27%  [kernel]            [k] _raw_spin_unlock_irq  <-- kernel scheduler

As you can see, there is a 5% drop in the scheduler's CPU utilization.

2. power_VideoCall test results:

There is a 3% improvement on max video FPS, from 30 to 31. This
improvement is consistent.

Also note that the sched_yield() manpage itself says it is intended
only for RT tasks. From manpagE: "sched_yield() is intended for use
with real-time scheduling policies (i.e., SCHED_FIFO or SCHED_RR)
and very likely means your application design is broken."

BUG=b/168205004

Change-Id: Idb84ab19e94f6d0c7f9e544e7a407c946d5ced5c
Signed-off-by: Joel Fernandes <joelaf@google.com>
vp8/common/threading.h