Subject: [bug#47237] [PATCH] gnu: metis: Use 64-bit floating pointer numbers on 64-bit architectures.

From: Emmanuel Agullo <[email-masked]>
Date: Thu, 18 Mar 2021 16:27:22 +0100 (CET)

Hello Ludo, hello everybody,

Thank you very much for this patch and discussion.

In numerical linear algebra in particular and hpc in
general, the trend is more and more to use reduced 
floating point arithmetic whenever possible (for memory 
footprint, communication volume and possibly computational 
time). I have no experience with using floating point 
numbers in partitioners such as metis. But I strongly 
suspect that a flexible usage will be requested (the 
same way it is often requested for integers). All in all, 
I would say that the number of bits for the architecture, 
the floating point numbers and the integers shall not 
(a priori) be related. In particular, I would say, in general, 
if a (high-quality) library (such as metis) exposes multiple 
choices, there are chances that users may want to
choose between them (for good reasons).

In the long run, it would be nice to have a naming
convention all over guix to make clear (and explicit)
for libraries that expose it which floating point
and integer arithmetic is being used. There can
hardly be a general rule (as some codes may even
decide to expose, say, part of the integers in
32 bits and another part in 64 bits), but it would
already be a great step to have a convention for
the "main" integer choice and "main" floating-point
choice. Something like mypackage_i32_r64 (if there
is a general convention (beyond guix) to follow,
even better). [It may even be great to use two versions
of the same package to facilitate mixed arithmetic, 
but we can certainly pospone that discussion as it
would certainly open two many issues for now].

In the short run, if there can be only one, I
let metis users playing with floating point
numbers comment on which one shall it be.

Hope this helps.

Thank you again.

Best regards,

Manu

----- Mail original -----
> De: "Ludovic Courtès" <[email-masked]>
> À: [email-masked]
> Cc: "Eric Bavier" <[email-masked]>, "Emmanuel Agullo" <[email-masked]>, "Paul Garlick"
> <[email-masked]>, "Ludovic Courtes" <[email-masked]>
> Envoyé: Jeudi 18 Mars 2021 16:02:46
> Objet: [PATCH] gnu: metis: Use 64-bit floating pointer numbers on 64-bit architectures.

> From: Ludovic Courtès <[email-masked]>
> 
> * gnu/packages/maths.scm (metis)[arguments]: Add #:modules and #:phases.
> ---
> gnu/packages/maths.scm | 23 +++++++++++++++++++++--
> 1 file changed, 21 insertions(+), 2 deletions(-)
> 
> Hi!
> 
> Metis defaults to 32-bit floating point numbers.  However, on 64-bit
> platforms, users probably expect 64-bit floating point numbers, hence
> this patch.
> 
> We could make it configurable through different variants or via package
> parameters when they’re available, but I wonder about the usefulness of
> a variant that uses 32-bit floats on 64-bit architectures.  Can we keep
> just this one variant?
> 
> Thanks,
> Ludo’.
> 
> diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
> index 565f109f47..4cd9112be9 100644
> --- a/gnu/packages/maths.scm
> +++ b/gnu/packages/maths.scm
> @@ -12,7 +12,7 @@
> ;;; Copyright © 2015 Fabian Harfert <[email-masked]>
> ;;; Copyright © 2016 Roel Janssen <[email-masked]>
> ;;; Copyright © 2016, 2018, 2020 Kei Kebreau <[email-masked]>
> -;;; Copyright © 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <[email-masked]>
> +;;; Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Ludovic Courtès
> <[email-masked]>
> ;;; Copyright © 2016 Leo Famulari <[email-masked]>
> ;;; Copyright © 2016, 2017 Thomas Danckaert <[email-masked]>
> ;;; Copyright © 2017, 2018, 2019, 2020 Paul Garlick
> <[email-masked]>
> @@ -3312,7 +3312,26 @@ YACC = bison -pscotchyy -y -b y
>      `(#:tests? #f                      ;no tests
>        #:configure-flags `("-DSHARED=ON"
>                            ,(string-append "-DGKLIB_PATH=" (getcwd)
> -                                           "/metis-" ,version "/GKlib"))))
> +                                           "/metis-" ,version "/GKlib"))
> +
> +       #:modules ((system base target)
> +                  (guix build cmake-build-system)
> +                  (guix build utils))
> +       #:phases (modify-phases %standard-phases
> +                  (add-after 'unpack 'set-real-type-width
> +                    (lambda* (#:key build target #:allow-other-keys)
> +                      ;; Enable 64-bit floating point numbers on 64-bit
> +                      ;; architectures.  Leave the default 32-bit width on
> +                      ;; other architectures.
> +                      (let ((word-size
> +                             (with-target (or target build %host-type)
> +                               (lambda ()
> +                                 (target-word-size)))))
> +                        (when (= 8 word-size)
> +                          (display "setting REALTYPEWIDTH to 64...\n")
> +                          (substitute* "include/metis.h"
> +                            (("define REALTYPEWIDTH.*$")
> +                             "define REALTYPEWIDTH 64\n")))))))))
>     (home-page "http://glaros.dtc.umn.edu/gkhome/metis/metis/overview")
>     (synopsis "Graph partitioning and fill-reducing matrix ordering library")
>     (description
> --
> 2.30.2