MFENCE vs. LOCK addl
Paul Hohensee
Paul.Hohensee at Sun.COM
Wed Feb 25 06:11:53 PST 2009
What do pushf and popf cost? Do locked operations actually have
2-way barrier semantics from an external pov?
Paul
Jiva, Azeem wrote:
> I was looking at memory barrier performance and noticed that HotSpot
> uses MFENCE as a memory barrier in 64bit mode. MFENCE is significantly
> slower than using a LOCKed instruction, since MFENCE is serializing
> (similar to CPUID). I'd like to recommend the following change:
>
> assembler_x86.cpp
> // Serializes memory.
> void Assembler::mfence() {
> // Memory barriers are only needed on multiprocessors
> if (os::is_MP()) {
> // All usable chips support "locked" instructions which suffice
> // as barriers, and are much faster than the alternative of
> // using cpuid or mfence instructions. We use here a locked add
> [esp],0.
> // This is conveniently otherwise a no-op except for blowing
> // flags (which we save and restore.)
> pushf(); // Save eflags register
> lock();
> addl(Address(rsp, 0), 0);// Assert the lock# signal here
> popf(); // Restore eflags register
>
> }
> }
>
>
> Sorry it's not a diff, but I'm not setup with mercurial yet. Only
> application I've ran is SPECjbb2005, and there are no regressions or
> gains. Mostly because the generated code from SPECjbb2005 doesn't use
> MFENCE in any significant amount.
>
> --
> Azeem Jiva
> AMD Java Labs
> T 512.602.0907
>
>
>
More information about the hotspot-compiler-dev
mailing list