Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756094AbdLTRbJ (ORCPT ); Wed, 20 Dec 2017 12:31:09 -0500 Received: from mail-lf0-f66.google.com ([209.85.215.66]:37219 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755633AbdLTRbH (ORCPT ); Wed, 20 Dec 2017 12:31:07 -0500 X-Google-Smtp-Source: ACJfBour9v3Oo2mHISR1lXYuhEPi2PCbwnv59vBSqh87XafOuGFT2UA8mUh8ifCKCdtViGXIQm3z/r4Rt4t6Gocp0IE= MIME-Version: 1.0 In-Reply-To: References: <20171220142001.18161-1-cmo@melexis.com> <1c1d0ffa8ee140bf9adbc78f1559b1e8@AcuMS.aculab.com> <20171220160001.manjff26gfbjccsw@hirez.programming.kicks-ass.net> From: Crt Mori Date: Wed, 20 Dec 2017 18:30:24 +0100 Message-ID: Subject: Re: [PATCH v10 1/3] lib: Add strongly typed 64bit int_sqrt To: David Laight Cc: Peter Zijlstra , Jonathan Cameron , Ingo Molnar , Andrew Morton , Kees Cook , Rusty Russell , Ian Abbott , Larry Finger , Niklas Soderlund , Thomas Gleixner , Krzysztof Kozlowski , Masahiro Yamada , "linux-kernel@vger.kernel.org" , "linux-iio@vger.kernel.org" , Joe Perches Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2016 Lines: 59 On 20 December 2017 at 17:46, David Laight wrote: > From: Crt Mori >> Sent: 20 December 2017 16:17 >> >> On 20 December 2017 at 17:00, Peter Zijlstra wrote: >> > On Wed, Dec 20, 2017 at 02:39:26PM +0000, David Laight wrote: >> > >> >> With minor changes it ought to be possible to remove most of the >> >> 64bit arithmetic and shifts. >> >> >> >> If you care about performance then using 32 bit maths will be much faster. >> > >> > Some, u64 add/sub/shift isn't exactly expensive, but yes, I also >> > indicated that improvement is possible. At the very least y can be made >> > a u32 I suppose. >> >> OK, is there any more easy optimizations you see? > > I think this version works. > It doesn't have the optimisation for small values. > > unsigned int sqrt64(unsigned long long x) > { > unsigned int x_hi = x >> 32; > > unsigned int b = 0; > unsigned int y = 0; > unsigned int i; > > for (i = 0; i < 32; i++) { > b <<= 2; > b |= x_hi >> 30; > x_hi <<= 2; > if (i == 15) > x_hi = x; > y <<= 1; > if (b > y) > b -= ++y; > } > return y; > } > > Put it through cc -O3 -m32 -c -o sqrt64.o sqrt64.c and then objdump sqrt64.o > and compare to that of your version. > > David > Wow, thanks. This seems like a major change. I did a quick run through unit tests for the sensor and the results are way off. On the sensor I had to convert double calculations to integer calculations and target was to get end result within 0.02 degC (with previous approximate sqrt implementation) in sensor working range. This now gets into 3 degC delta at least and some are way off. It might be off because of some scaling on the other hand during the equation (not exactly comparing sqrt implementations here). I will need a bit more testing of this to see if it is replaceable.