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