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 :)