comp.lang.ada
 help / color / mirror / Atom feed
From: Jacob Sparre Andersen <sparre@nbi.dk>
Subject: Re: efficient vector/matrix operations in Ada
Date: Tue, 14 Aug 2001 12:54:28 +0200
Date: 2001-08-14T12:54:28+02:00	[thread overview]
Message-ID: <3B790364.FE1E33FC@nbi.dk> (raw)
In-Reply-To: bebbba07.0108132046.53d265dc@posting.google.com

Russ:

I haven't looked at the code generated by "my" compiler, so
I will just come with some general remarks...

> Larry Hazel <lhazel@mindspring.com> wrote in message news:<3B783732.A3A1EB82@mindspring.com>...
[...]
> > Seems to me if a compiler can't generate the most efficient code for
> >
> > A = B + C + D
> >
> >   or
> >
> > A := B + C + D
> >
> > in any language, you need a different compiler.

It doesn't always make a large difference, but I would
definitely prefer a compiler which could do the
optimisation.

> I'm no compiler expert, but I seriously doubt that you are correct
> here. Come to think of it, I'll just say that you are flat out
> wrong--and I'll eat crow if you are right.

I think it is time to go hunting now...

> The difference (in C++)
> between
> 
>     A = B + C + D;
> and
>     A = B; A += C; A += D;
> 
> is more fundamental than a compiler can account for. Don't forget that
> "+" and "+=" are user-defined operators to start with. The former says
> to add B, C, and D, place the result in a temporary matrix, and copy
> that matrix by value back into A. The latter says to copy B into A,
> Add C directly to the result, then add D directly to that result. The
> latter needs no temporary matrices, whereas the former requires a
> temporary for each "+" operator. A special preprocessor could possibly
> convert the former to the latter, but I don't see how a compiler could
> possibly do it.

It shouldn't be too hard for a compiler to figure out if a
user-defined operator, "+", can do the calculation "A := A +
B" without having to allocate an intermediate buffer (at
least all the cases, where the operation is simply a loop
over all elements in the composite type).

If you know that, then it is pretty simple to generate the
two versions of the assignment and compare their execution
times.

> This is all old hat in the C++ community. Ada is a great language, but
> it missed the boat here.

Sorry?

What's the difference between:

   A += B;

and

   Add (Target => A,
        Addend => B);

(except for a few extra characters)?

> By the way, if you think the arithmetic operators should be called
> "+:=", "-:=", etc., I give up.

When you come to the point, where this kind of optimisations
are necessary, it really doesn't matter if the operators are
called "+:=", ":+", "+=" or are written as a procedure call.

Jacob
-- 
http://hugin.ldraw.org/Jacob/edb/digitale_nyheder
Om redakt�rens opgave p� internetnyhedstjenester.



  parent reply	other threads:[~2001-08-14 10:54 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-08-07  1:13 efficient vector/matrix operations in Ada Russ
2001-08-07  2:18 ` Dale Stanbrough
2001-08-07  2:21 ` tmoran
2001-08-07  3:04   ` Russ P.
2001-08-10 16:54     ` B.Gaffney
2001-08-13  7:50       ` Dmitry Kazakov
2001-08-13 19:45       ` Russ
2001-08-13 20:23         ` Larry Hazel
2001-08-13 21:26           ` Ted Dennison
2001-08-14  4:46           ` Russ
2001-08-14  5:28             ` David Starner
2001-08-14  8:17             ` Alexander Boucke
2001-08-14  8:56             ` Lutz Donnerhacke
2001-08-14 10:54             ` Jacob Sparre Andersen [this message]
2001-08-13 21:30         ` Ted Dennison
2001-08-14  4:56           ` Russ
2001-08-14  7:32             ` efficient vector/matrix operations in Fortran, was Re: ... " tmoran
2001-08-14 14:05             ` efficient vector/matrix operations " Ted Dennison
  -- strict thread matches above, loose matches on Subject: below --
2001-08-07 11:36 Gautier Write-only-address
2001-08-14 12:37 Gautier Write-only-address
replies disabled

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