Flat multi-dim arrays.

Don Clugston dac at nospam.com.au
Thu Aug 10 11:19:10 PDT 2006


Dave wrote:
> 
> What, not even a "that sucks!" from someone <g>
> 
> I'm pretty sure the syntax has been proposed before, but not the same 
> implementation ideas.
> 
> I for one would like syntax like this. I like it w/ C#, and it seems a 
> relatively low hanging and juicy fruit (but Walter would have to tell us 
> how low hanging it is for sure, of course).

Have you read Norbert Nemec's original multi-dim array proposal (you can 
find it on Wiki4D)? The key feature is "strided slices", which seem to 
be essential for dealing with multi-dim arrays. Something like that 
could get most of the fruit on the tree... Norbert's idea is not quite 
well developed enough yet, though, to be truly compelling. I think 
Walter isn't interested in being as good or better than C/C++/C#, he 
wants to Get It Right. If you can develop an idea for strided arrays 
which folds neatly into the existing language, that would be extremely 
valuable.

> 
> Thanks,
> 
> - Dave
> 
> Dave wrote:
>>
>> 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