Fast multidimensional Arrays

rikki cattermole via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Aug 29 06:02:43 PDT 2016


On 30/08/2016 12:13 AM, Steinhagelvoll wrote:
> Ok I added release and implemented the benchmark for 500 iterations,
> 10000 are not reasonable. I build on the 2d array with LDC:
> http://pastebin.com/aXxzEdS4 (changes just in the beginning)
>
> $ ldc2 -release -O3 nd_test.d
> $ ./nd_test
> 12 minutes, 18 secs, 21 ms, 858 μs, and 3 hnsecs
>
> , which is 738 seconds. Compared to (also 500 iterations)
>
> ifort -O3 -o fort_test test.f90 && ./fort_test
>  time:    107.4640    seconds
>
>
> This still seems like a big difference. Is it because I don't use a
> continous piece of memory, but rather a pointer to a pointer?

double[1000][] A, B, C;

void main() {
         A = new double[1000][1000];
         B = new double[1000][1000];
         C = new double[1000][1000];

         import std.conv : to;
         import std.datetime;
         import std.stdio : writeln;

         ini(A);
         ini(B);
         ini(C);

         auto r = benchmark!run_test(10000);
         auto res = to!Duration(r[0]);
         writeln(res);
}

void run_test() {
         MatMul(A, B, C);
}

void ini(T)(T mtx) {
         foreach(v; mtx) {
                 v = 3.4;
         }

         foreach(i, v; mtx) {
                 foreach(j, vv; v) {
                         vv += (i * j) + (0.6 * j);
                 }
         }
}

void MatMul(T)(T A, T B, T C) {
         foreach(cv; C) {
                 cv = 0f;
         }

         foreach(i, cv; C) {
                 foreach(j, av; A[i]) {
                         foreach(k, cvv; cv) {
                                 cvv += av * B[j][k];
                         }
                 }
         }
}

$ ldc2 test.d -O5 -release -oftest.exe -m64
$ ./test
3 secs, 995 ms, 115 μs, and 2 hnsecs

Please verify that it is still doing the same thing that you want.


More information about the Digitalmars-d-learn mailing list