From: Jerry <lanceboyle@qwest.net>
Subject: Re: Memory leak in BLAS/LINPACK - GNAT on OS X
Date: Fri, 18 Apr 2008 14:43:19 -0700 (PDT)
Date: 2008-04-18T14:43:19-07:00 [thread overview]
Message-ID: <ab128d17-2458-4d00-8a62-96bfc1b6af2d@h1g2000prh.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
next prev 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 [this message]
2008-04-18 21:43 ` Jerry
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