Re: [PATCH] iio:temperature:mlx90632: Reduce number of equal calulcations

2020-08-04 Thread Crt Mori
Hi Andy,
Thanks for the comments. This is indeed a cut-out section of what I
wanted to submit next.

On Mon, 3 Aug 2020 at 18:35, Andy Shevchenko  wrote:
>
> On Mon, Aug 3, 2020 at 6:17 PM Crt Mori  wrote:
> >
> > TAdut4 was calculated each iteration although it did not change. In light
> > of near future additions of the Extended range DSP calculations, this
> > function refactoring will help reduce unrelated changes in that series as
> > well as reduce the number of new functions needed.
>
> Okay!
>
> > Also converted shifts in this function of signed integers to divisions as
> > that is less implementation-defined behavior.
>
> This is what I'm wondering about. Why?
>
> ...

The reason for this is that whenever something is wrong with the
calculation I am looking into the shifts which are
implementation-defined and might not keep the signed bit. Division
however would.

>
> > -   Ha_customer = ((s64)Ha * 100LL) >> 14ULL;
> > -   Hb_customer = ((s64)Hb * 100) >> 10ULL;
> > +   Ha_customer = div64_s64((s64)Ha * 100LL, 16384);
> > +   Hb_customer = div64_s64((s64)Hb * 100, 1024);
>
> Have you checked the code on 32-bit machines?
> As far as I can see the div64_*64() do not have power of two divisor
> optimizations. I bet it will generate a bulk of unneeded code.
>
> ...
>
> > -   calcedKsTO = ((s64)((s64)Ga * (prev_object_temp - 25 * 1000LL)
> > -* 1000LL)) >> 36LL;
> > -   calcedKsTA = ((s64)(Fb * (TAdut - 25 * 100LL))) >> 36LL;
> > -   Alpha_corr = div64_s64s64)(Fa * 100LL) >> 46LL)
> > -   * Ha_customer), 1000LL);
>
> > +   calcedKsTO = div64_s64((s64)((s64)Ga * (prev_object_temp - 25 * 
> > 1000LL)
> > +* 1000LL), 68719476736);
> > +   calcedKsTA = div64_s64((s64)(Fb * (TAdut - 25 * 100LL)), 
> > 68719476736);
> > +   Alpha_corr = div64_s64(div64_s64((s64)(Fa * 100LL), 
> > 70368744177664)
> > +  * Ha_customer, 1000LL);
>
> This is less readable and full of magic numbers in comparison to the
> above (however, also full of magics, but at least gives better hint).
>
> ...

These are coefficients so there is not much to unmagic. I can keep the
shifts, if you think that is more readable or add comments after lines
with 2^46 or something?
>
> > +   TAdut4 = (div64_s64(TAdut, 1LL) + 27315) *
> > +   (div64_s64(TAdut, 1LL) + 27315) *
> > +   (div64_s64(TAdut, 1LL)  + 27315) *
> > +   (div64_s64(TAdut, 1LL) + 27315);
>
> Shouldn't you switch to definitions from units.h? (perhaps as a separate 
> change)
>
> --
> With Best Regards,
> Andy Shevchenko


Re: [PATCH] iio:temperature:mlx90632: Reduce number of equal calulcations

2020-08-03 Thread kernel test robot
Hi Crt,

I love your patch! Yet something to improve:

[auto build test ERROR on iio/togreg]
[also build test ERROR on v5.8 next-20200803]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/Crt-Mori/iio-temperature-mlx90632-Reduce-number-of-equal-calulcations/20200803-231936
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
config: x86_64-randconfig-a001-20200803 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project 
4ffa6a27aca17fe88fa6bdd605b198df6632a570)
reproduce (this is a W=1 build):
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All errors (new ones prefixed by >>):

>> drivers/iio/temperature/mlx90632.c:381:40: error: redefinition of 'TAdut4'
   s64 calcedKsTO, calcedKsTA, ir_Alpha, TAdut4, Alpha_corr;
 ^
   drivers/iio/temperature/mlx90632.c:377:28: note: previous definition is here
  s64 TAdut, s64 TAdut4, s32 
Fa, s32 Fb,
 ^
>> drivers/iio/temperature/mlx90632.c:412:2: error: use of undeclared 
>> identifier 'TAdut4'; did you mean 'TAdut'?
   TAdut4 = (div64_s64(TAdut, 1LL) + 27315) *
   ^~
   TAdut
   drivers/iio/temperature/mlx90632.c:405:17: note: 'TAdut' declared here
   s64 kTA, kTA0, TAdut;
  ^
   drivers/iio/temperature/mlx90632.c:419:67: error: use of undeclared 
identifier 'TAdut4'; did you mean 'TAdut'?
   temp = mlx90632_calc_temp_object_iteration(temp, object, 
TAdut, TAdut4,

   ^~

   TAdut
   drivers/iio/temperature/mlx90632.c:405:17: note: 'TAdut' declared here
   s64 kTA, kTA0, TAdut;
  ^
   3 errors generated.

vim +/TAdut4 +381 drivers/iio/temperature/mlx90632.c

c87742abfc80b3 Crt Mori 2018-01-11  375  
c87742abfc80b3 Crt Mori 2018-01-11  376  static s32 
mlx90632_calc_temp_object_iteration(s32 prev_object_temp, s64 object,
dd5b04efd05f22 Crt Mori 2020-08-03  377 
   s64 TAdut, s64 TAdut4, s32 Fa, s32 Fb,
c87742abfc80b3 Crt Mori 2018-01-11  378 
   s32 Ga, s16 Ha, s16 Hb,
c87742abfc80b3 Crt Mori 2018-01-11  379 
   u16 emissivity)
c87742abfc80b3 Crt Mori 2018-01-11  380  {
c87742abfc80b3 Crt Mori 2018-01-11 @381 s64 calcedKsTO, calcedKsTA, 
ir_Alpha, TAdut4, Alpha_corr;
c87742abfc80b3 Crt Mori 2018-01-11  382 s64 Ha_customer, Hb_customer;
c87742abfc80b3 Crt Mori 2018-01-11  383  
dd5b04efd05f22 Crt Mori 2020-08-03  384 Ha_customer = div64_s64((s64)Ha 
* 100LL, 16384);
dd5b04efd05f22 Crt Mori 2020-08-03  385 Hb_customer = div64_s64((s64)Hb 
* 100, 1024);
c87742abfc80b3 Crt Mori 2018-01-11  386  
dd5b04efd05f22 Crt Mori 2020-08-03  387 calcedKsTO = 
div64_s64((s64)((s64)Ga * (prev_object_temp - 25 * 1000LL)
dd5b04efd05f22 Crt Mori 2020-08-03  388  * 
1000LL), 68719476736);
dd5b04efd05f22 Crt Mori 2020-08-03  389 calcedKsTA = div64_s64((s64)(Fb 
* (TAdut - 25 * 100LL)), 68719476736);
dd5b04efd05f22 Crt Mori 2020-08-03  390 Alpha_corr = 
div64_s64(div64_s64((s64)(Fa * 100LL), 70368744177664)
dd5b04efd05f22 Crt Mori 2020-08-03  391* 
Ha_customer, 1000LL);
c87742abfc80b3 Crt Mori 2018-01-11  392 Alpha_corr *= ((s64)(1 * 
100LL + calcedKsTO + calcedKsTA));
c87742abfc80b3 Crt Mori 2018-01-11  393 Alpha_corr = emissivity * 
div64_s64(Alpha_corr, 10LL);
c87742abfc80b3 Crt Mori 2018-01-11  394 Alpha_corr = 
div64_s64(Alpha_corr, 1000LL);
c87742abfc80b3 Crt Mori 2018-01-11  395 ir_Alpha = 
div64_s64((s64)object * 1000LL, Alpha_corr);
c87742abfc80b3 Crt Mori 2018-01-11  396  
c87742abfc80b3 Crt Mori 2018-01-11  397 return 
(int_sqrt64(int_sqrt64(ir_Alpha * 1LL + TAdut4))
c87742abfc80b3 Crt Mori 2018-01-11  398 - 27315 - Hb_customer) 
* 10;
c87742abfc80b3 Crt Mori 2018-01-11  399  }
c87742abfc80b3 Crt Mori 2018-01-11  400  

Re: [PATCH] iio:temperature:mlx90632: Reduce number of equal calulcations

2020-08-03 Thread Andy Shevchenko
On Mon, Aug 3, 2020 at 6:17 PM Crt Mori  wrote:
>
> TAdut4 was calculated each iteration although it did not change. In light
> of near future additions of the Extended range DSP calculations, this
> function refactoring will help reduce unrelated changes in that series as
> well as reduce the number of new functions needed.

Okay!

> Also converted shifts in this function of signed integers to divisions as
> that is less implementation-defined behavior.

This is what I'm wondering about. Why?

...

> -   Ha_customer = ((s64)Ha * 100LL) >> 14ULL;
> -   Hb_customer = ((s64)Hb * 100) >> 10ULL;
> +   Ha_customer = div64_s64((s64)Ha * 100LL, 16384);
> +   Hb_customer = div64_s64((s64)Hb * 100, 1024);

Have you checked the code on 32-bit machines?
As far as I can see the div64_*64() do not have power of two divisor
optimizations. I bet it will generate a bulk of unneeded code.

...

> -   calcedKsTO = ((s64)((s64)Ga * (prev_object_temp - 25 * 1000LL)
> -* 1000LL)) >> 36LL;
> -   calcedKsTA = ((s64)(Fb * (TAdut - 25 * 100LL))) >> 36LL;
> -   Alpha_corr = div64_s64s64)(Fa * 100LL) >> 46LL)
> -   * Ha_customer), 1000LL);

> +   calcedKsTO = div64_s64((s64)((s64)Ga * (prev_object_temp - 25 * 
> 1000LL)
> +* 1000LL), 68719476736);
> +   calcedKsTA = div64_s64((s64)(Fb * (TAdut - 25 * 100LL)), 
> 68719476736);
> +   Alpha_corr = div64_s64(div64_s64((s64)(Fa * 100LL), 
> 70368744177664)
> +  * Ha_customer, 1000LL);

This is less readable and full of magic numbers in comparison to the
above (however, also full of magics, but at least gives better hint).

...

> +   TAdut4 = (div64_s64(TAdut, 1LL) + 27315) *
> +   (div64_s64(TAdut, 1LL) + 27315) *
> +   (div64_s64(TAdut, 1LL)  + 27315) *
> +   (div64_s64(TAdut, 1LL) + 27315);

Shouldn't you switch to definitions from units.h? (perhaps as a separate change)

-- 
With Best Regards,
Andy Shevchenko