Flat multi-dim arrays.

Dave Dave_member at pathlink.com
Mon Aug 7 11:47:43 PDT 2006


A current thread delved into "deep" copy for multidim arrays, but maybe a different approach to MD
arrays that would a) make things easier to .dup, b) more efficient and c) perhaps appeal to the
numerical computing folks as well?

int[,] arr = new int[100,100];
int[,,] arr = new int[50,10,20];
...

- They would be allocated from a single contiguous chunk of memory for speed and ease of .dup'ing
and array operations:

int[,] ar2=arr.dup; // int[][] arra2 = alloc2D!(int)(arr.length,arr[0].length);
                     // memcpy(ar2[0].ptr,arr[0].ptr,arr.length * arr[0].length * int.sizeof);

ar2[] = 10;         // _memset32(ar2[0].ptr,10,ar2.length * ar2[0].length);

foreach(i; ar2) {}  // foreach(i; cast(int[])ar2[0].ptr[0 .. ar2.length * ar2[0].length]) {}

(the array of T are allocated from the same contiguous pool of memory).

- The compiler frontend would convert operands like arr[10,10] into arr[10][10] to use the already
optimized compiler backend code for jagged array access (and array bounds checking). They would also
be passed into and out of functions as arr[][]. Also consistent with the opIndex and opIndexAssign
overload syntax, so the new syntax doesn't create inconsistencies with UDT op overloading (actually 
seems more consistent because there isn't a way to overload [][]). Fortran programmers may be
more comfortable with the [x,y] syntax too (?)

- I tested this with the linpack benchmark and the performance doubled on my machine for a 500 x 500
matrix by just changing the array allocation from jagged to one flat / contiguous chunk of memory.
For smaller arrays the performance is the same or perhaps a little better, especially for native
types > 32 bit (longs, doubles, reals).

- Perhaps leave stuff like array slicing out, at least to start with. But considering that a simple
conversion to native jagged arrays is taking place, this shouldn't be really difficult to implement
either(?).

- No new operators or keywords. These would be a natural extension to D's improved built-in arrays,
especially because the memory management is easily handled by the GC.

- Maximum rank of 7 for compatibility w/ Fortran.

- Would be another reason to switch from C and/or C++ for things like numerical analysis.

Thoughts?

- Dave



More information about the Digitalmars-d mailing list