On Thursday, 30 January 2014 at 21:04:06 UTC, bearophile wrote:
Stanislav Blinov:

Unrolling everything except the loop in energy() seems to have squeezed the bits neede to outperform c++, at least on my machine :)

That should be impossible, as I remember from my old profilings that energy() should use only an irrelevant amount of run time.

I meant that if I unroll it, it's not irrelevant anymore :)

While I benchmark some variants of this program I am seeing a large variety of problems, limitations, bugs and regressions...

:)

You latest D code crashes my ldc2 V.0.12.1, while 0.13.0-alpha1 compiles it.

:))

My older version of your D code runs with both compiler versions, but V.0.12.1 generates faster code.

:)))

Plus you can't make those double2 immutable, you can't use vector ops (because of performance, and also because they aren't nothrow in V.0.12.1).

Well, not being able to make them immutable is not *that* big of a problem now, is it? What would be actually cool to have are those slice operations.

I was also experimenting with (note the align):

align(16) struct Body {
    double[3] x, v;
    double mass;
}

struct NBodySystem {
private:
    __gshared static Body[5] bodies = [
        // Sun.
        Body([0., 0., 0.],
             [0., 0., 0.],
             solarMass),

Yeah... I've even thrown away that filler in the latest version :o)

But this improves the code for V.0.12.1 and worsens it for 0.13.0-alpha1.

%|

(I'm sticking to atoi because my copy of ldc seems to have an issue in std.conv).

My version seems to use to!() correctly.

I'm using the git head (704ab3, last commit Sun Jan 26 00:00:21). I haven't tried the release yet.

If ldc2 developers are reading this thread there is enough strange stuff here to give one or two headaches :-)

Indeed.

Now I don't know what "final" version should I keep of this program :-)

I was going to compare the asm listings, but C++ seems to have unrolled and inlined the outer loop right inside main(), and now I'm slightly lost in it :)

Reply via email to