comp.lang.ada
 help / color / mirror / Atom feed
From: "vincent.diemunsch@gmail.com" <vincent.diemunsch@gmail.com>
Subject: Re: Interfacing Ada to C for linear algebra
Date: Mon, 5 Sep 2011 23:53:40 -0700 (PDT)
Date: 2011-09-05T23:53:40-07:00	[thread overview]
Message-ID: <109a98c6-8f88-490f-9596-84656f1d6c76@u20g2000yqj.googlegroups.com> (raw)
In-Reply-To: m2k49rdmi8.fsf@pushface.org

On 2 sep, 16:53, Simon Wright <si...@pushface.org> wrote:
> "vincent.diemun...@gmail.com" <vincent.diemun...@gmail.com> writes:
> > Hello everybody,
>
> > I would like to use in Ada some linear algebra libraries written in C,
> > especially the SuiteSparse :
> >  http://www.cise.ufl.edu/research/sparse/SuiteSparse/
> > These libraries handle Sparse Matrices that are in the format used
> > internally by MatLab : a column-compressed version of the standard
> > matrices.
>
> > Ada defines Generic_Real_Arrays to handle vectors and matrices. So I
> > would like to simply create a Generic_Real_Sparse_Arrays package to
> > define MatLab compatible matrices. Since the internal format of MatLab
> > matrices is in C, in need to do a conversion between my Sparse_Matrix
> > and the C arrays that represent the Sparse Matrix in MatLab.
>
> > Looking at the implementation of Generic_Real_Arrays in GNAT, I see
> > that they internally call the BLAS and LAPACK packages, written in
> > Fortran, through the use of two packages : System.Generic_Real_BLAS
> > and System.Generic_Real_LAPACK. These package do exactly the same as
> > what I want to do : they convert Ada arrays of Ada floating point type
> > in Fortran arrays of Fortran Float type and back, without using
> > copying, so that the compiler produces no code for this conversion
> > (using pragma Inline_Always and so on). This is important because if
> > we use optimized versions of linear algebra packages it is because we
> > manipulate huge arrays and we don't want to loose time in copying
> > values from on representation to another !
>
> The LAPACK interface used in Generic_Real_Arrays deals with matrices in
> Ada (row-major) format and - usually, anyway - transposes in order to
> call the Fortran implementations. Unlike BLAS, LAPACK itself doesn't
> have options to deal with row-major matrices.
>
> We did some timings and found that it's quite a bit quicker to declare
> the BLAS/LAPACK interfaces in terms of Fortran (column-major) matrices
> (declared using pragma Convention (Fortran)) and have the compiler
> implement the necessary moves on assignment, rather than using a library
> Transpose subprogram. But make no mistake, the Generic_Real_Arrays code
> definitely copies! (look at the body for confirmation).
>
> > I suppose that since C is very common, there must already exist a very
> > good implementation of conversion of Ada arrays of floating point
> > types in C arrays of C.Float, idealy using the GNAT
> > implementation. This could save me a lot of time doing interfaces...
>
> GNAT and GCC share the same compiler backend, so the underlying numeric
> types are the same. Just tell the compiler what to import:
>
>    procedure dgeev
>      (Jobv_L :        Character;
>       Jobv_R :        Character;
>       N      :        Positive;
>       A      : in out Real_Arrays.Real_Matrix;
>       Ld_A   :        Positive;
>       W_R    :    out Real_Arrays.Real_Vector;
>       W_I    :    out Real_Arrays.Real_Vector;
>       V_L    :    out Real_Arrays.Real_Matrix;
>       Ld_V_L :        Integer;
>       V_R    :    out Real_Arrays.Real_Matrix;
>       Ld_V_R :        Integer;
>       Work   :    out Real_Arrays.Real_Vector;
>       L_Work :        Integer;
>       Info   :    out Integer);
>    pragma Import (Fortran, dgeev, "dgeev_");
>
> (Real_Arrays.Real_Matrix etc from Generic_Real_Arrays). The Fortran
> convention means that the Character and Integer arguments are passed by
> reference without your needing to fake up accesses.
>
> More of this athttps://sourceforge.net/projects/gnat-math-extn/.

Thank you Siomon for your answer.
You are right I will take some inspiration from your packages !
Since Gnat is so close to C, I hope I won't need copying.
Regards,

Vincent



  reply	other threads:[~2011-09-06  6:53 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-02 12:46 Interfacing Ada to C for linear algebra vincent.diemunsch
2011-09-02 14:53 ` Simon Wright
2011-09-06  6:53   ` vincent.diemunsch [this message]
2011-09-06 16:56     ` Pascal Obry
2011-09-06 18:54       ` Simon Wright
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox