comp.lang.ada
 help / color / mirror / Atom feed
From: Jerry <lanceboyle@qwest.net>
Subject: Re: Memory leak in BLAS/LINPACK - GNAT on OS X
Date: Fri, 18 Apr 2008 14:43:35 -0700 (PDT)
Date: 2008-04-18T14:43:35-07:00	[thread overview]
Message-ID: <35f81199-9ab3-4098-9798-fbc96bb24c0a@1g2000prf.googlegroups.com> (raw)
In-Reply-To: 7fa5fc26-6843-4000-bea7-f8a956b20b3f@2g2000hsn.googlegroups.com

On Apr 16, 4:06 pm, tkrauss <thomas.kra...@gmail.com> wrote:
> There have been a few messages on the GNAT-OSX mailing list about an
> apparent memory leak in the Ada.Numerics.Long_Real_Arrays
> implementation.   The setup is an OS X box (10.4) with the GNAT 4.3
> compiler from the macada.org site.  The Ada.Numerics.Long_Real_Arrays
> is using the Apple-supplied BLAS and LINPACK libraries under the
> hood.  The code snippet below (plagiarized from Jerry's post on the
> mailing list) leaks memory (as reported by top).  Note that the same
> code but with Long_Complex types does not appear to have this problem.
>
> Has anyone seen this problem on other platforms?  Do other languages
> on OS X behave this way?  I'm not sure how to track down the guilty
> party here.  Is it Apple's BLAS or LINPACK libraries or something in
> the GNAT Long_Real_Arrays multiply method?
>
> with Ada.Numerics.Long_Real_Arrays;
> use Ada.Numerics.Long_Real_Arrays;
>
> procedure tst_simple is
>   v        : Real_Vector(1 .. 100_000) := (others => 1.23);
>   res      : Real_Vector(1 .. 100_000);
> begin
>   for i in 1..1000 loop
>     res := 123.456 * v;
>   end loop;
> end tst_simple;

I'm really interested to see what comments people have about this
problem. The sample program given by the original poster hits 1 GB of
RAM use in only a few seconds. (I kill it then.)

As he says, the complex-number version of the same program does not
leak. Also, the following program which implements a local version of
scalar-vector multiplication does not leak.

It looks like either the * operator is hosed in GNAT or there is
something wrong with Apple's BLAS. Clearly programs that do this
operation are not practical at this time.

Here's the program with a local override of "*" for scalar-vector
multiplication that behaves well.


with Ada.Numerics.Long_Real_Arrays;     use
Ada.Numerics.Long_Real_Arrays;
procedure tst_mult_2 is
  v        : Real_Vector(1 .. 100_000) := (others => 1.23);
  res      : Real_Vector(1 .. 100_000);

  function "*" (a : Long_Float; x : Real_Vector) return Real_Vector is
    Result : Real_Vector (x'range);
  begin
    for index in x'range loop
      Result(index) := a * x(index);
    end loop;
    return Result;
  end "*";

begin
  for i in 1..100 loop
    res := 123.456 * v;
  end loop;
end tst_mult_2;


Jerry



  parent reply	other threads:[~2008-04-18 21:43 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-16 23:06 Memory leak in BLAS/LINPACK - GNAT on OS X tkrauss
2008-04-18 21:43 ` Jerry
2008-04-18 21:43 ` Jerry [this message]
2008-04-19  6:57 ` Per Sandberg
2008-04-19 22:08   ` Jerry
2008-04-19 22:12   ` Jerry
replies disabled

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