freebsd-nq/lib
Eric van Gyzen ddab052725 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
Approved by:	kib (mentor)
MFC after:	2 weeks
Sponsored by:	Dell Inc.
2015-08-05 12:53:55 +00:00
..
atf
clang
csu
libalias
libarchive MFV r285970: 2015-07-28 18:41:28 +00:00
libauditd
libbegemot
libblocksruntime
libbluetooth
libbsdstat
libbsm
libbsnmp
libbz2
libc Make it possible to implement poll(2) on top of kqueue(2). 2015-08-05 07:34:29 +00:00
libc_nonshared
libc++
libcalendar
libcam
libcapsicum
libcasper
libclang_rt
libcom_err
libcompat
libcompiler_rt
libcrypt
libcuse
libcxxrt
libdevctl
libdevinfo
libdevstat
libdpv
libdwarf
libedit
libefi
libelf
libelftc
libevent
libexecinfo
libexpat
libfetch
libfigpar
libgeom
libgpib
libgpio
libgssapi
libiconv_modules Bump GCC max-inline-insns-single in libiconv_modules and grep 2015-07-26 00:11:04 +00:00
libipsec
libjail
libkiconv
libkvm
libldns
liblzma
libmagic
libmd
libmemstat
libmilter
libmp
libmt
libnandfs
libnetbsd
libnetgraph
libngatm
libnv
libohash
libopie
libpam
libpcap
libpjdlog
libpmc
libproc
libprocstat
libradius
librpcsec_gss
librpcsvc
librt
librtld_db
libsbuf
libsdp
libsm
libsmb
libsmdb
libsmutil
libsqlite3
libstand
libstdbuf
libstdthreads
libtacplus
libtelnet
libthr Disable SSE in libthr 2015-08-05 12:53:55 +00:00
libthread_db
libucl
libufs
libugidfw
libulog
libunbound
libusb
libusbhid
libutil
libvgl
libvmmapi
libwrap
libxo
liby
libypclnt
libz
msun
ncurses
tests
Makefile
Makefile.inc