]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/commit
Disable SSE in libthr
authorvangyzen <vangyzen@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Mon, 26 Oct 2015 16:21:56 +0000 (16:21 +0000)
committervangyzen <vangyzen@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Mon, 26 Oct 2015 16:21:56 +0000 (16:21 +0000)
commit43705eb7fef0bb994d0770e8e246c3c1cd39a2cd
treeeddbd2bd9d74250a0f1379938c2e3424071536d9
parentd656cd46500c774d33df7f4e54189b158ed80bd3
Disable SSE in libthr

Clang emits SSE instructions on amd64 in the common path of
pthread_mutex_unlock.  If the thread does not otherwise use SSE,
this usage incurs a context-switch of the FPU/SSE state, which
reduces the performance of multiple real-world applications by a
non-trivial amount (3-5% in one application).

Instead of this change, I experimented with eagerly switching the
FPU state at context-switch time.  This did not help.  Most of the
cost seems to be in the read/write of memory--as kib@ stated--and
not in the #NM handling.  I tested on machines with and without
XSAVEOPT.

One counter-argument to this change is that most applications already
use SIMD, and the number of applications and amount of SIMD usage
are only increasing.  This is absolutely true.  I agree that--in
general and in principle--this change is in the wrong direction.
However, there are applications that do not use enough SSE to offset
the extra context-switch cost.  SSE does not provide a clear benefit
in the current libthr code with the current compiler, but it does
provide a clear loss in some cases.  Therefore, disabling SSE in
libthr is a non-loss for most, and a gain for some.

I refrained from disabling SSE in libc--as was suggested--because
I can't make the above argument for libc.  It provides a wide variety
of code; each case should be analyzed separately.

https://lists.freebsd.org/pipermail/freebsd-current/2015-March/055193.html

Suggestions from:   dim, jmg, rpaulo
Sponsored by:   Dell Inc.

git-svn-id: svn://svn.freebsd.org/base/stable/10@290014 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
lib/libthr/arch/amd64/Makefile.inc
lib/libthr/arch/i386/Makefile.inc
libexec/rtld-elf/amd64/Makefile.inc
libexec/rtld-elf/i386/Makefile.inc
share/mk/bsd.cpu.mk