comp.lang.ada
 help / color / mirror / Atom feed
From: eachus@spectre.mitre.org (Robert I. Eachus)
Subject: Re: C is 'better' than Ada because...
Date: 1996/07/30
Date: 1996-07-30T00:00:00+00:00	[thread overview]
Message-ID: <EACHUS.96Jul30183149@spectre.mitre.org> (raw)
In-Reply-To: 31e02c32.342948604@netline-fddi.jpl.nasa.gov


In article <01bb7e2f$aeef4660$87ee6fce@timpent.airshields.com> "Tim Behrendsen" <tim@airshields.com> writes:

  > The above are all worthwhile opimizations; I'm not claiming that
  > optimizers do nothing.  All I'm saying is that too often programmers
  > fall back on the lazy line, "Oh well, the compiler should take care
  > of that."  For example, if I have ...

  > for (i = 0; i < 10000000; ++i) 
  >     array[i] *= abs(values[i]);

  > Should I be *sure* this is going to be done efficiently, and use
  > pointers, or should I just let the compiler handle it? I say that
  > a competent programmer should use pointers out of habit, because
  > its just good design and practice.  And when the problem becomes
  > less trivial than the one above, the programmer will already be
  > using the proper techniques *the first time*, rather than having
  > to go back and fix the inevitable performance bottlenecks.

   Let's take that "little" example and ask a few of the questions
that a "good" optimizer will consider:

   1.  Should I have two pointers or three?  The value of array[i]
needs to be fetched, then multiplied by abs(values[i]), then stored.
If I use only two address registers then on many architectures there
will be a pipeline stall.  On many RISC architectures, I can put the
increment of the pointer to array before the RHS evaluation and store
to pointer - 1, but other architectures do not allow negative offsets,
so you run the pointer from address(array[0]) - 4 to
address(array[1000000]) - 4. (Or whatever the length of the elements
is. Strength reduction and constant folding are assumed.)  On some
RISC hardware you can do full range register offsets, so you do (in a
fairly obvious intermediate code):

      LOAD(R1,address(values))
      LOAD(R2,address(array))
      LOAD(R3,0)
      LOAD(R4,-4)
      ADD(R4,R1)
      LOAD(R5,4000000)
    <L1>
      LOAD(R6,(R1(R3))
      LOAD(R7,(R2(R3))
      ADD(R3,4)
      ABS(R6)
      MULT(R7,R4(R3))
      BNE(R3,R5, L1)
      STORE(R7,@R4)
      ...

      Or some such.  Notice that this code corresponds to source code
that does NOT use pointers, and it takes fairly sophisticated analysis
to get here from code using pointers and doing two increments.

    2. How many times should I unroll the loop?

    3. Can I get better results by prefetching array elements so the
cache is always full?

    4. If this machine doesn't have a write-through cache or a deep
write pipe, can I design the code so that two array elements are
generated in a register pair and written together?  (Just because the
double precision write was intended for double precision floating
results, doesn't mean you can't use it elsewhere.)

    5. If this machine has more than one integer arithmetic pipeline,
should I use one for offsets and the other for arithmetic, or (more
likely) evaluate two elements of the array at once?

    Now, how many of those optimizations did you think of?  And how
many do you want to embed in your source code?  (I hope the second
answer is none.)

    Let me tell you a story, shortened for this forum.  I got a call
that our compiler was generating "junk" code for an Ada subroutine.  I
looked at the source, which went on for over a page, and suggested an
equivalent which took one line.  The guy promised to try that and call
me back.

    "It generates the same three junk instructions!"  He complained.

    "Oh, what's wrong with them they look fine to me?"

    "You can't do that in that few instructions!"

    "Let's see, the first instruction predecrements the stack
pointer...why is it doing that?  Oh, so it can do an indirect fetch
through the second parameter.  The second instruction adds the first
parameter, why no test for overflow?  Ah, analysis must show that it
can never happen?  Right.  Now, the third instruction stores the
result where it got the first operand, carefully postincrementing the
stack pointer so it will be right in the return.  What's wrong with
that?"

     "Do you really think the compiler should be messing with the
stack pointer like that?"

     "Why not, you can't get a trap where it is wrong."

     "But how does the compiler know that?"

     "It does a global call tree, and attaches known bounds to every
parameter for procedures not visible outside the unit.  If you put a
declaration in the package spec, you should get the code you expect."

     "Oh."

      Now, I thought the peephole optimization that didn't know what a
stack pointer was, just when its value had to be trustworthy was cool
stuff...in 1984.  There are lots better optimizers and code generators
around now.  For almost any chip of interest, Power PC, Pentium,
Pentium Pro, 680x0, SPARC, HPPA, etc., the optimizer is capable of
doing incredible things if it knows the specific target version.  You
should never want to write code that finely tuned to the hardware, but
a good optimizer can gain 50% or more improvement by knowing the
specific chip model.

     A horrible example, but very true.  I've worked with compilers
which generated different calling sequences for 68020, 68030, and
68040.  All link time compatible, but the differences in number of
clocks for certain instructions meant that the best sequence was
different on different processors.  And, if you care, the 68040
sequence looked the dumbest, because it was dominated by memory
fetches, so fewer instructions, fewer fetches--it actually used the
the CALLM instruction.

--

					Robert I. Eachus

with Standard_Disclaimer;
use  Standard_Disclaimer;
function Message (Text: in Clever_Ideas) return Better_Ideas is...




  parent reply	other threads:[~1996-07-30  0:00 UTC|newest]

Thread overview: 272+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1996-06-19  0:00 C is 'better' than Ada because Alan Brain
1996-06-20  0:00 ` Ron Thompson
1996-06-22  0:00 ` Nasser Abbasi
1996-06-22  0:00   ` David Morton
1996-06-22  0:00     ` Robert Dewar
1996-06-23  0:00       ` The Deviant
1996-06-23  0:00         ` Robert Dewar
1996-06-23  0:00         ` Michael Feldman
1996-06-23  0:00         ` John Winters
1996-06-24  0:00         ` token%/etc/HOSTNAME
1996-06-23  0:00     ` John Winters
1996-06-23  0:00       ` David Morton
1996-06-23  0:00         ` Lawrence Kirby
1996-06-27  0:00           ` ) OH NO "...begs the question..." Ralph Silverman
1996-06-28  0:00             ` Bill Wendling
1996-06-23  0:00         ` C is 'better' than Ada because John Winters
1996-06-23  0:00           ` David Morton
1996-06-30  0:00   ` Nasser Abbasi
1996-06-23  0:00 ` Nasser Abbasi
1996-06-23  0:00   ` Fergus Henderson
1996-06-23  0:00     ` Robert Dewar
1996-06-28  0:00       ` Fergus Henderson
     [not found] ` <874508446wnr@t-cubed.demon.co.uk>
1996-06-29  0:00   ` Jon S Anthony
1996-06-29  0:00 ` Kevin D. Quitt
1996-06-29  0:00   ` Robert Dewar
1996-06-30  0:00   ` Fergus Henderson
1996-07-01  0:00     ` Mike Roske
1996-07-01  0:00       ` Robert Dewar
1996-07-02  0:00       ` Ken Garlington
1996-07-03  0:00     ` Kevin D. Quitt
1996-07-04  0:00       ` Ian Ward
1996-07-05  0:00         ` Peter Amey
1996-07-05  0:00           ` Robert Dewar
1996-07-10  0:00             ` James A. Squire
1996-07-15  0:00               ` Oliver Kellogg
1996-07-16  0:00                 ` Oliver Kellogg
1996-07-18  0:00                   ` Fraser Wilson
1996-07-18  0:00                     ` Fergus Henderson
1996-07-19  0:00                   ` Keith Thompson
1996-07-17  0:00                 ` Robert Dewar
1996-07-11  0:00             ` James A. Squire
1996-07-16  0:00             ` Nasser Abbasi
1996-07-16  0:00               ` Mark A Biggar
1996-07-17  0:00             ` Laurent Guerby
1996-07-17  0:00               ` David Emery
1996-07-17  0:00             ` James A. Squire
1996-07-18  0:00             ` James A. Squire
1996-07-07  0:00           ` Kevin D. Quitt
1996-07-08  0:00             ` Ian Ward
1996-07-18  0:00               ` Hamilton Link
1996-07-19  0:00                 ` Kevin D. Quitt
1996-07-08  0:00             ` Robert Dewar
1996-07-10  0:00               ` John F. Bode
1996-07-11  0:00                 ` Mike Roske
1996-07-10  0:00               ` Peter Hermann
1996-07-15  0:00                 ` Tim McGuire
1996-07-16  0:00                   ` Kevin D. Quitt
1996-07-16  0:00                     ` Robert Dewar
1996-07-18  0:00                     ` Ken Garlington
1996-07-19  0:00                       ` Kevin D. Quitt
1996-07-19  0:00                         ` Richard O'Rourke
1996-07-22  0:00                           ` Kevin D. Quitt
1996-07-22  0:00                             ` Robert Dewar
1996-07-23  0:00                               ` Theodore E. Dennison
1996-07-23  0:00                               ` Kevin D. Quitt
1996-07-24  0:00                                 ` Theodore E. Dennison
1996-07-24  0:00                                   ` Kevin D. Quitt
1996-07-25  0:00                                     ` Alan Brain
1996-07-25  0:00                                     ` Steve Howard
1996-07-27  0:00                                     ` Bob Kitzberger
1996-07-26  0:00                                   ` Mike Roske
1996-07-25  0:00                                 ` Fergus Henderson
1996-07-25  0:00                                   ` Kevin D. Quitt
1996-07-26  0:00                                     ` kennedy1
1996-07-26  0:00                                     ` Fergus Henderson
1996-07-23  0:00                               ` Tim Behrendsen
1996-07-24  0:00                                 ` Theodore E. Dennison
1996-07-27  0:00                                   ` Tim Behrendsen
1996-07-29  0:00                                     ` Ada is 'better' than C because John Herro
1996-07-30  0:00                                       ` Brian Rogoff
1996-07-30  0:00                                         ` Adam Beneschan
1996-07-31  0:00                                         ` Franz Kruse
1996-08-04  0:00                                       ` Richard Riehle
1996-08-05  0:00                                         ` Sandy McPherson
1996-08-06  0:00                                           ` Ken Garlington
1996-08-06  0:00                                             ` GAFFNEY.BRIAN
1996-08-07  0:00                                               ` Ken Garlington
1996-08-08  0:00                                             ` Theodore E. Dennison
1996-08-08  0:00                                               ` Frank Lipski
1996-08-09  0:00                                             ` Sandy McPherson
1996-08-15  0:00                                             ` Mike Stark
1996-08-07  0:00                                           ` Bob Kitzberger
1996-08-08  0:00                                           ` Robert Dewar
1996-08-08  0:00                                             ` Kevin D. Quitt
1996-07-29  0:00                                     ` C is 'better' than Ada because Bob Kitzberger
1996-07-30  0:00                                       ` Tim Behrendsen
1996-07-30  0:00                                         ` Richard A. O'Keefe
1996-07-30  0:00                                           ` Tim Behrendsen
1996-07-30  0:00                                         ` Theodore E. Dennison
1996-07-29  0:00                                     ` Dirk Dickmanns
1996-07-30  0:00                                       ` Tim Behrendsen
1996-07-31  0:00                                         ` whiting_ms@corning.com (Matt Whiting)
1996-07-31  0:00                                         ` Dirk Dickmanns
1996-07-31  0:00                                           ` Kevin D. Quitt
1996-08-01  0:00                                             ` Alan Brain
1996-08-02  0:00                                               ` Kevin D. Quitt
1996-08-05  0:00                                                 ` Byron B. Kauffman
1996-08-15  0:00                                               ` Mike Roske
1996-08-15  0:00                                                 ` David Shochat
1996-08-16  0:00                                                   ` Ken Garlington
1996-08-16  0:00                                                 ` Jon S Anthony
1996-08-16  0:00                                                 ` John Herro
1996-08-16  0:00                                                   ` John Herro
1996-08-05  0:00                                             ` Robb Nebbe
1996-08-02  0:00                                           ` Dirk Dickmanns
1996-07-30  0:00                                     ` Theodore E. Dennison
1996-08-08  0:00                                     ` Ada is 'better' than C because William Clodius
1996-08-09  0:00                                       ` Kevin D. Quitt
1996-08-09  0:00                                       ` Robert Dewar
1996-08-12  0:00                                       ` OBryan Anthony H
1996-08-12  0:00                                         ` Bob Kurtz
1996-08-12  0:00                                         ` Lawrence Kirby
1996-08-13  0:00                                         ` Tom Watson
1996-08-14  0:00                                         ` Robert Dewar
1996-07-29  0:00                                   ` C is 'better' than Ada because system
1996-07-30  0:00                                     ` Tim Behrendsen
1996-07-24  0:00                                 ` Dirk Dickmanns
1996-07-24  0:00                                 ` JamesS1889
1996-07-25  0:00                                 ` Alan Brain
1996-07-18  0:00                     ` Bob Gilbert
1996-07-19  0:00                       ` Kevin D. Quitt
     [not found]               ` <4rvr2j$2gb0@info4.rus.uni-s <nhn30yhw6t.fsf@paralysys>
1996-07-18  0:00                 ` Robert Dewar
1996-07-18  0:00                 ` Kevin D. Quitt
1996-07-26  0:00                 ` Richard Riehle
1996-07-08  0:00             ` C is 'better' than Ada ... NOT!! Hugh Dunne
1996-07-08  0:00               ` Kevin D. Quitt
1996-07-12  0:00                 ` C is 'better' than Ada because John F. Bode
1996-07-15  0:00                   ` Sandy McPherson
1996-07-18  0:00                     ` Robert Dewar
1996-07-19  0:00                       ` Theodore E. Dennison
1996-07-19  0:00                     ` Theodore E. Dennison
1996-07-19  0:00                     ` Ken Garlington
1996-07-20  0:00                       ` Michael Feldman
1996-07-21  0:00                         ` Alfonso Urdaneta
1996-07-21  0:00                           ` Robert Dewar
1996-07-22  0:00                             ` Kevin D. Quitt
1996-07-22  0:00                               ` Robert Dewar
1996-07-26  0:00                               ` Richard Riehle
     [not found]                             ` <31f3c52e.238719470 <Pine.GSO.3.92.960726122347.25896E-100000@nunic.nu.edu>
1996-07-31  0:00                               ` Darrin Smith
1996-07-31  0:00                                 ` Fergus Henderson
1996-08-01  0:00                                 ` Jerry van Dijk
1996-08-06  0:00                                   ` Kirk Bradley
1996-08-09  0:00                                   ` Richard Riehle
1996-08-10  0:00                                     ` Craig Franck
1996-08-16  0:00                                       ` Richard Riehle
1996-08-18  0:00                                         ` Craig Franck
     [not found]                                       ` <Pine.GSO.3.92.960816102000. <4v5pis$4h1@mtinsc01-mgt.ops.worldnet.att.net>
1996-08-18  0:00                                         ` David Weller
1996-08-15  0:00                                     ` Mike Stark
1996-08-02  0:00                                 ` Robert Dewar
1996-08-11  0:00                             ` Jon S Anthony
     [not found]                             ` <31f3c52e.238719470 <4uj42h$j06@mtinsc01-mgt.ops.worldnet.att.net>
1996-08-11  0:00                               ` Doug & Rose Miller
1996-08-11  0:00                                 ` Craig Franck
1996-08-11  0:00                                   ` Doug & Rose Miller
1996-08-12  0:00                                     ` Craig Franck
1996-08-16  0:00                                       ` nasser
     [not found]                             ` <31f3c52e.238719470 <4v5pis$4h1@mtinsc01-mgt.ops.worldnet.att.net>
1996-08-18  0:00                               ` Doug & Rose Miller
1996-08-20  0:00                                 ` Craig Franck
1996-07-23  0:00                         ` Ken Garlington
1996-07-27  0:00                       ` Tim Behrendsen
1996-07-27  0:00                         ` Lawrence Kirby
1996-07-29  0:00                         ` Ian Ward
1996-07-30  0:00                         ` Bob Cousins
1996-07-30  0:00                           ` Robert Dewar
1996-09-05  0:00                             ` Bob Cousins
1996-08-13  0:00                       ` Jon S Anthony
1996-08-14  0:00                         ` Craig Franck
1996-08-28  0:00                           ` Van Snyder
1996-08-14  0:00                       ` Jon S Anthony
1996-08-15  0:00                         ` Craig Franck
1996-08-15  0:00                           ` Joe Gwinn
1996-08-16  0:00                             ` Don Nelson
1996-08-19  0:00                               ` Joe Gwinn
1996-08-19  0:00                                 ` Ken Garlington
1996-08-28  0:00                         ` Van Snyder
1996-08-30  0:00                           ` Norman H. Cohen
1996-08-15  0:00                       ` Jon S Anthony
1996-08-20  0:00                         ` nasser
1996-08-15  0:00                       ` Stefan 'Stetson' Skoglund
1996-08-15  0:00                     ` David Weller
1996-08-15  0:00                       ` William  C Brennan
1996-07-08  0:00               ` C is 'better' than Ada ... NOT!! Frank Manning
1996-07-10  0:00             ` C is 'better' than Ada because Stephen M O'Shaughnessy
1996-07-10  0:00               ` Peter Seebach
1996-07-18  0:00             ` Brian Rogoff
1996-07-19  0:00             ` James A. Squire
1996-07-29  0:00             ` William Clodius
1996-07-30  0:00               ` Richard A. O'Keefe
1996-07-30  0:00                 ` Tim Behrendsen
1996-08-01  0:00                   ` Byron B. Kauffman
1996-08-01  0:00                     ` Ian Ward
1996-07-30  0:00               ` Robert Dewar
1996-07-31  0:00                 ` Tim Behrendsen
     [not found]                   ` <9608020139.AA29105@pulsar.telesoft>
1996-08-02  0:00                     ` Tim Behrendsen
1996-08-05  0:00                       ` Kevin D. Quitt
1996-08-06  0:00                         ` is Ada 'better' than C? (Was: Re: C is 'better' than Ada because...) Antoine Leca
1996-08-06  0:00                           ` Kevin D. Quitt
1996-07-31  0:00               ` C is 'better' than Ada because Ralph Silverman
1996-07-30  0:00             ` Robert I. Eachus [this message]
1996-08-01  0:00               ` David Wheeler
1996-07-30  0:00             ` William Clodius
1996-08-01  0:00               ` Tim Behrendsen
1996-08-01  0:00             ` Olivier Devuns @pulsar
1996-08-11  0:00             ` Ada 95 is a FREE language (was: C is 'better' than Ada because...) Laurent Guerby
1996-08-11  0:00             ` C is 'better' than Ada because Jon S Anthony
1996-08-12  0:00               ` Craig Franck
1996-08-12  0:00                 ` James A. Squire
1996-08-12  0:00                   ` Craig Franck
1996-08-12  0:00                 ` John Howard
1996-08-13  0:00                   ` Craig Franck
1996-08-13  0:00                     ` Ken Garlington
1996-08-14  0:00                       ` Craig Franck
1996-08-14  0:00                 ` Stephen M O'Shaughnessy
1996-08-14  0:00                 ` Stephen M O'Shaughnessy
     [not found]                 ` <Pine.GS <gwinn-1908961215100001@smc19.ed.ray.com>
1996-08-19  0:00                   ` Adam Beneschan
1996-08-13  0:00             ` Jon S Anthony
1996-08-13  0:00             ` Jon S Anthony
1996-08-14  0:00             ` Norman H. Cohen
1996-08-19  0:00             ` Jon S Anthony
1996-08-20  0:00               ` Craig Franck
1996-08-20  0:00             ` Jon S Anthony
1996-08-21  0:00               ` Craig Franck
1996-08-27  0:00             ` Valentin Bonnard
1996-07-06  0:00         ` Walter B. Hollman Sr.
1996-07-05  0:00       ` Jon S Anthony
1996-07-08  0:00         ` Peter Hermann
1996-07-09  0:00           ` Dirk Dickmanns
1996-07-12  0:00       ` ntxbow
1996-07-15  0:00         ` Kevin D. Quitt
1996-07-15  0:00           ` Robert Dewar
1996-07-16  0:00           ` Ian Ward
1996-07-17  0:00             ` Dale Stanbrough
1996-07-23  0:00       ` Jon S Anthony
1996-07-29  0:00       ` William Clodius
1996-07-31  0:00       ` Darin Johnson
1996-08-01  0:00         ` Tim Behrendsen
1996-08-01  0:00       ` Jon S Anthony
1996-08-01  0:00       ` Jon S Anthony
1996-08-05  0:00       ` Stefan 'Stetson' Skoglund
1996-08-16  0:00       ` Jon S Anthony
1996-07-01  0:00 ` James A. Squire
1996-07-02  0:00 ` Darin Johnson
1996-07-03  0:00   ` If your only tool is a hammer, all your problems look like nails (was Re: C is 'better' than Ada because...) Bruce Clement
  -- strict thread matches above, loose matches on Subject: below --
1996-07-30  0:00 C is 'better' than Ada because Spasmo
1996-07-31  0:00 ` Jon S Anthony
1996-08-01  0:00   ` Tim Behrendsen
1996-08-02  0:00     ` Ralph Silverman
     [not found] ` <01bb7e29$61e3d260$87ee6fce@timpent.airshields.com>
1996-07-31  0:00   ` Bob Kitzberger
1996-07-31  0:00     ` Tim Behrendsen
1996-08-01  0:00 William Clodius
1996-08-03  0:00 ` Tim Behrendsen
1996-08-05  0:00   ` Kevin D. Quitt
1996-08-05  0:00 ` William Clodius
1996-08-05  0:00 ` Stefan 'Stetson' Skoglund
1996-08-01  0:00 Tim Behrendsen
1996-08-02  0:00 ` David Bonham
1996-08-02  0:00 ` Mark McKinney
     [not found] ` <9608061851.AA17508@camo.brc.shell.com>
1996-08-06  0:00   ` Tim Behrendsen
1996-08-04  0:00 @#$%!?!
     [not found] <Pine.GSO.>
     [not found] ` <4 <4vb399$kt8@mtinsc01-mgt.ops.worldnet.att.net>
1996-08-20  0:00   ` Adam Beneschan
1996-08-20  0:00     ` Craig Franck
1996-08-21  0:00     ` Mike Roske
1996-08-21  0:00       ` William  C Brennan
replies disabled

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