yes, exactly that's what I imagined. Both amd64 and s390x builds use the
reference blas from libblas-dev. However, on s390x the blas package behaves
as intel-type while on amd64 it behaves as gnu-type:

[image: image.png]

GetFEM's configure.ac does the only reasonable thing, it detects the ABI of
the linked BLAS and adapts itself to it by
setting GMM_BLAS_RETURN_COMPLEX_AS_ARGUMENT.

Going beyond this specific bug, the main issue is that BLAS has an
ambiguous API/ABI. What I am pointing out is that AFAIK update-alternatives
cannot deal with such ambiguities. Right?

At least for mkl, it leads to errors as reported in
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1067732 , but based on
the confb.cpp test results shown by Drew, I would not be surprised if there
are more undiscovered bugs related to complex number blas.


On Tue, 16 Jun 2026 at 11:21, Drew Parsons <[email protected]> wrote:

> Source: getfem
> Followup-For: Bug #1133815
>
> To get some more context, I ran the configure.ac tests standalone on
> the s390x porterbox
>
> confb.cpp
> -------------------------------------
> #include <cstdio>
> #include <complex>
> #if defined(GMM_USE_BLAS64_INTERFACE)
>   #define INT long
> #else
>   #define INT int
> #endif
> extern "C" {
> void cdotu_(std::complex<float>*, const INT*, const std::complex<float>*,
> const INT*,
>             const std::complex<float>*, const INT*);
> }
> int main() {
>     const INT one=1;
>     std::complex<float> x(1.,2.), y(1.,-2.), result;
>     cdotu_(&result, &one, &x, &one, &y, &one);
>     printf("result (bad C)=%g + %gi\n", result);
>     printf("result (complex comp)=%g + %gi\n", real(result), imag(result));
>     printf("result.real()=%g\n", result.real());
>     printf("result.real()-5.=%.20f\n", result.real()-5.);
>     printf("fabs(result.real()-5.)=%.20f\n", fabs(result.real()-5.));
>     printf("fabs(result.real()-5.)< 1e-8 = %d\n",
> fabs(result.real()-5.)<1e-8);
>     printf("returning %d\n", (fabs(result.real()-5.) < 1e-8) ? 0 : 1);
>     return (fabs(result.real()-5.) < 1e-8) ? 0 : 1;
> }
> -------------------------------------
>
> $ g++ -o confb confb.cpp -lblas
>
> Executing on s390x:
> $ ./confb
> result (bad C)=0.0078125 + 0.00781251i
> result (complex comp)=5 + 0i
> result.real()=5
> result.real()-5.=0.00000000000000000000
> fabs(result.real()-5.)=0.00000000000000000000
> fabs(result.real()-5.)< 1e-8 = 1
> returning 0
>
>
> The issue is that result.real() returns 5 on s390x, which apparently
> is the same as Intel fortran.
>
> By contrast result.real() returns 0 on amd64, so the test in
> configure.ac identifies amd64 as gnu-type not intel-type.
> Executing on amd64:
> $ ./confb
> result (bad C)=0 + 6.95048e-310i
> result (complex comp)=0 + 0i
> result.real()=0
> result.real()-5.=-5.00000000000000000000
> fabs(result.real()-5.)=5.00000000000000000000
> fabs(result.real()-5.)< 1e-8 = 0
> returning 1
>
> I don't think the BLAS implementations or debian blas alternatives are
> the problem.  This is the reference blas (libblas-dev). You might
> argue there's a misconfiguration in the BLAS packages (or in gfortran)
> for s390x. But BLAS otherwise seems to be working fine, we're not
> seeing other BLAS errors coming from s390x.
>
> The difference seems to be way that getfem is using BLAS,
> which evidently requires arch-specific handling.  Since this
> difference is reflecting in the headers via the definition of
> GMM_BLAS_RETURN_COMPLEX_AS_ARGUMENT, we've got the situation leading
> to this bug report.
>
> The difference appears to be real for getfem, not a bug (unless someone can
> identify an s390x bug in BLAS or gfortran).
> In that case dropping the multiarch field is best, which Konstantinos
> is doing in salsa MR.
>
> --
> To unsubscribe, send mail to [email protected].
>

Reply via email to