From: tkrauss on

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;

From: Jerry on
On Apr 16, 4:06 pm, tkrauss <thomas.kra...(a)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
From: Jerry on
On Apr 16, 4:06 pm, tkrauss <thomas.kra...(a)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
From: Per Sandberg on
Thought it i recognized this problem so i checked it out and found:
It is corrected in the Latest GNATPro version (the problem is in the
compiler).

/Per

tkrauss 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;
>
From: Jerry on
On Apr 18, 11:57 pm, Per Sandberg <per.sandb...(a)bredband.net> wrote:
> Thought it i recognized this problem so i checked it out and found:
> It is corrected in the Latest GNATPro version (the problem is in the
> compiler).
>
> /Per

Thanks for that info, Per.