From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754815Ab3AVXSA (ORCPT ); Tue, 22 Jan 2013 18:18:00 -0500 Received: from mail-vc0-f172.google.com ([209.85.220.172]:65239 "EHLO mail-vc0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752301Ab3AVXRz (ORCPT ); Tue, 22 Jan 2013 18:17:55 -0500 MIME-Version: 1.0 In-Reply-To: <1358896415-28569-1-git-send-email-walken@google.com> References: <1358896415-28569-1-git-send-email-walken@google.com> Date: Tue, 22 Jan 2013 15:17:54 -0800 Message-ID: Subject: Re: [RFC PATCH 0/6] fast queue spinlocks From: Michel Lespinasse To: Rik van Riel , Ingo Molnar , "Paul E. McKenney" , David Howells , Thomas Gleixner , Eric Dumazet , "Eric W. Biederman" , Manfred Spraul Cc: linux-kernel@vger.kernel.org Content-Type: multipart/mixed; boundary=20cf3078133c8f992004d3e8c962 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --20cf3078133c8f992004d3e8c962 Content-Type: text/plain; charset=ISO-8859-1 On Tue, Jan 22, 2013 at 3:13 PM, Michel Lespinasse wrote: > Additionally I will attach (as a reply to this email) graphs showing total > spinlock throughput for a microbenchmark consisting of N threads doing > lock/unlock operations in a tight loop. We can see that the proposed > fast queue spinlock is comparable to ticket spinlocks for low number > of threads, scales much better for high number of threads, and is always > faster than the MCS strawman proposal (which did have the issue of being > kinda slow at around 2-3 threads). > mach1 is a 4 socket AMD Barcelona system (16 cores total) > mach2 is a 2 socket Intel Westmere system (12 cores / 24 threads total) > mach3 is a 2 socket Intel Sandybridge system (16 cores / 32 threads total) Graphs are attached (admittedly not the most interesting benchmark). -- Michel "Walken" Lespinasse A program is never fully debugged until the last user dies. --20cf3078133c8f992004d3e8c962 Content-Type: image/png; name="graph.png" Content-Disposition: attachment; filename="graph.png" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hc9nwuv80 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 --20cf3078133c8f992004d3e8c962 Content-Type: image/png; name="graph.png" Content-Disposition: attachment; filename="graph.png" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hc9nxhp71 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 1QAAAABJRU5ErkJggg== --20cf3078133c8f992004d3e8c962 Content-Type: image/png; name="graph.png" Content-Disposition: attachment; filename="graph.png" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hc9nxx6c2 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 AElFTkSuQmCC --20cf3078133c8f992004d3e8c962--