comp.lang.ada
 help / color / mirror / Atom feed
From: Keean Schupke <keean.schupke@googlemail.com>
Subject: Re: Efficient Sequential Access to Arrays
Date: Sun, 22 Jul 2012 11:21:06 -0700 (PDT)
Date: 2012-07-22T11:21:06-07:00	[thread overview]
Message-ID: <01174147-b078-40bb-a52b-8861bee52816@googlegroups.com> (raw)
In-Reply-To: <a72rt6Fq5sU1@mid.individual.net>

On Sunday, 22 July 2012 18:34:26 UTC+1, Niklas Holsti  wrote:
> On 12-07-22 19:21 , Florian Weimer wrote:
> &gt; * Keean Schupke:
> &gt;
> &gt;&gt; So assuming we need this level of performance, what would be the
> &gt;&gt; best (and most idiomatic Ada) way to package this type of usage
> &gt;&gt; pattern as an abstract datatype?
> &gt;
> &gt; You should look at compiler dumps to figure out why the strength
> &gt; reduction optimization does not kick in.
> &gt;
> 
> As I understand it, the program is accessing A(I,J), where A is a 2D 
> array, and also accessing A(I+1,J), A(I,J+1), and the other neighbours 
> of A(I,J), eight in all.
> 
> I,J are indices that are *not* traversed in sequential order, but in 
> some scattered order.
> 
> Computing the address of A(I,J) involves multiplications of J and I with 
> the size of an array element and the size of an array row, respectively. 
> The problem seems to be that the results of these multiplications are 
> not reused in computing the address of A(I+1,J) etc.
> 
> If the index constraints (or at least the row length) of A are static 
> (compile-time) constants, and the address of A(I,J) has been computed, 
> and c1 and c2 are some other compile-time constants (-1, 0, +1 in this 
> program), then the address of A(I+c1,J+c2) can be computed by adding a 
> static offset to the address of A(I,J). This is what happens when A(I,J) 
> and the neighbours are accessed through a C pointer, or when Keean uses 
> address arithmetic explicitly in the Ada program. The question is why 
> the Ada compiler is not doing this optimization.
> 
> As I understand it, &quot;strength reduction&quot; is a loop optimization where an 
> expression of the form C*i, with &quot;i&quot; the loop index, is replaced by a 
> new variable that is incremented by C on each loop iteration. But in 
> Keean&#39;s program the indices I,J are not loop indices, nor linearly 
> related to loop indices.
> 
> The optimization that would be required here is to replace (X+C)*F by 
> X*F+C*F, when C and F are static constants and X*F has already been 
> computed and is available. This would replace the multiplication by an 
> addition of a static constant. I&#39;ve never seen this special kind of 
> optimization proposed or described.
> 
> (We are of course (I believe) assuming that index range checks are 
> turned off.)
> 
> -- 
> Niklas Holsti
> Tidorum Ltd
> niklas holsti tidorum fi
>        .      @       .

That's some of it, the other part is that sometimes the 'scattered order' is from following a linked list between elements. So A1(I, J) is computed from a PRNG, and we access A1(I, J) and may access all or none of A1(I, J-1), A1(I-1, J), A1(I+1, J), A1(I, J+1) and all or none of A1(I-1, J-1), A1(I+1, J-1), A1(I-1, J+1), A1(I+1, J+1). We may also access the 'canonical' element of the subset A* which in the fast code is a link and the neighbours addresses calculated from the link address, and all the elements in the subset (A2, A3, .. AN) and each of their horizontal and vertical neighbours.

So with the relative addressing code, stepping through the subset is dereference link, add constant[+/- row_size * element_size] and constant[+/- element_size] to access the neighbours, then dereference next link etc. The size of the array are generic parameters, so I presume the constants get pre-calculated at elaboration time.

With the indexed version, it is storing the index of the canonical element of the subset, and the index of the next element in the subset instead of the address.

Does that help determine if it is going to be possible to get better performance from the array indexed version?


Cheers,
Keean.




  reply	other threads:[~2012-07-24  2:45 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-15 18:40 Efficient Sequential Access to Arrays Keean Schupke
2012-07-15 19:48 ` Dmitry A. Kazakov
2012-07-15 20:03   ` Keean Schupke
2012-07-15 20:56     ` Keean Schupke
2012-07-16 11:34       ` Jacob Sparre Andersen
2012-07-15 21:05     ` tmoran
2012-07-15 21:08       ` Keean Schupke
2012-07-16  1:19         ` tmoran
2012-07-15 21:44     ` Georg Bauhaus
2012-07-16  7:47     ` Dmitry A. Kazakov
2012-07-16 10:16       ` Keean Schupke
2012-07-16 14:57         ` Dmitry A. Kazakov
2012-07-16 16:39           ` Keean Schupke
2012-07-16 17:02             ` Georg Bauhaus
2012-07-16 18:48             ` Dmitry A. Kazakov
2012-07-16 19:12               ` Keean Schupke
2012-07-17  6:31                 ` Dmitry A. Kazakov
2012-07-17  6:50                   ` Georg Bauhaus
2012-07-17  8:42                     ` Dmitry A. Kazakov
2012-07-17  7:24                   ` Keean Schupke
2012-07-16 19:43             ` John B. Matthews
2012-07-16 20:44               ` Keean Schupke
2012-07-16 22:23             ` tmoran
2012-07-17  6:40               ` Keean Schupke
2012-07-17  9:01                 ` Dmitry A. Kazakov
2012-07-18  8:10                   ` Keean Schupke
2012-07-18 18:11                     ` tmoran
2012-07-19 10:41                       ` Keean Schupke
2012-07-19 11:18                         ` Georg Bauhaus
2012-07-19 19:58                           ` Keean Schupke
2012-07-21  8:24                             ` Keean Schupke
2012-07-21 11:52                               ` Georg Bauhaus
2012-07-21 16:14                                 ` Keean Schupke
2012-07-21 17:09                                   ` Keean Schupke
     [not found]                                   ` <i78m081tccmp078spmsei1l5vnj3k0kbkj@invalid.netcom.com>
2012-07-22 15:50                                     ` Keean Schupke
2012-07-22  5:13                               ` Shark8
2012-07-15 21:35   ` J-P. Rosen
2012-07-15 19:52 ` Shark8
2012-07-15 20:16   ` Keean Schupke
2012-07-15 21:33     ` Georg Bauhaus
2012-07-17 18:16 ` Florian Weimer
2012-07-22 10:01 ` robin.vowels
2012-07-30  6:31   ` Jacob Sparre Andersen
2012-07-30  7:16     ` Keean Schupke
2012-07-30  9:20     ` Georg Bauhaus
2012-07-30 14:04       ` Keean Schupke
2012-07-22 10:09 ` robin.vowels
2012-07-22 16:02   ` Keean Schupke
2012-07-22 16:21 ` Florian Weimer
2012-07-22 16:46   ` Keean Schupke
2012-07-22 18:41     ` Florian Weimer
2012-07-24  8:21       ` Keean Schupke
2012-07-22 17:34   ` Niklas Holsti
2012-07-22 18:21     ` Keean Schupke [this message]
2012-07-30 14:18       ` Jacob Sparre Andersen
2012-07-24 16:00     ` robin.vowels
2012-07-25  7:09       ` Niklas Holsti
2012-07-25  9:03         ` Keean Schupke
2012-07-26  0:15           ` Randy Brukardt
2012-07-26  8:38             ` Keean Schupke
2012-07-26 10:10               ` Brian Drummond
2012-07-26 12:32                 ` Keean Schupke
2012-07-26 13:46                   ` Dmitry A. Kazakov
2012-07-26 17:40                     ` Shark8
2012-07-26 18:56                       ` Dmitry A. Kazakov
2012-07-27  5:25                         ` Shark8
2012-07-27  6:28                           ` Dmitry A. Kazakov
2012-07-27  7:01                             ` Vasiliy Molostov
2012-07-27  8:48                               ` Dmitry A. Kazakov
2012-07-27 12:01                                 ` Georg Bauhaus
2012-07-27 16:49                                 ` Vasiliy Molostov
2012-07-27 19:38                                   ` Dmitry A. Kazakov
2012-07-28  5:32                             ` Shark8
2012-07-28  7:37                               ` Dmitry A. Kazakov
2012-07-28 18:32                                 ` Shark8
     [not found]                     ` <6ov218tnkbqu3vpkuo4t77rd7de0a3aesf@invalid.netcom.com>
2012-07-26 18:49                       ` Dmitry A. Kazakov
     [not found]                         ` <86d31898ne39maimbl24knds7rf38qg7vc@invalid.netcom.com>
2012-07-27  6:45                           ` Dmitry A. Kazakov
2012-07-27  8:21                   ` Keean Schupke
2012-07-27  8:50                     ` Dmitry A. Kazakov
2012-07-27  9:17                       ` Keean Schupke
2013-02-25 21:18                     ` Eryndlia Mavourneen
2012-07-26 13:08               ` Georg Bauhaus
2012-07-26 19:37                 ` stefan-lucks
2012-07-26 19:21               ` stefan-lucks
2012-07-31  3:12               ` Randy Brukardt
2012-07-26  7:11           ` Markus Schöpflin
2012-07-26 14:47         ` Robin Vowels
2012-07-26 15:18           ` Martin
replies disabled

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