On Sunday, 3 September 2017 at 17:56:26 UTC, thinwybk wrote:
On Saturday, 2 September 2017 at 17:00:46 UTC, Joakim wrote:
On Saturday, 2 September 2017 at 15:41:54 UTC, Joakim wrote:
D:
https://bitbucket.org/qznc/d-shootout/raw/898f7f3b3c5d55680229113e973ef95ece6f711a/progs/nbody/nbody.d
ldc 1.4 beta1, llvm 4.0.1
ldc2 -O3 nbody.d
The D version averages 2.5 seconds, the C++ version 6
seconds, which means D would likely still be at the top of
that n-body ranking today.
Sorry, I assumed the D version worked fine and didn't bother
to check the output, turns out it needs two foreach loops
changed in advance(dt). Specifically, "Body i" should be
changed to "ref Body i" in both foreach statements, so the
data is actually updated. ;)
After that change, the C++ version wins by a little, 6 seconds
vs. 6.5 seconds for the D translation. I see that the C++
version directly invokes SIMD intrinsics, so perhaps that's to
be expected.
What needs to be adjusted for optimization? If you let me know
it I adjust it here
https://github.com/fkromer/exploringBB/blob/nbody/chp05/performance/nbody.d and/or https://github.com/fkromer/exploringBB/blob/nbody/chp05/performance/build and/or https://github.com/fkromer/exploringBB/blob/nbody/chp05/performance/run#L25
It's not optimization, right now it's subtly incorrect, because a
struct passed into a foreach loop is copied. Add a "ref" to
"Body i" when initializing each foreach loop in advance() to
remedy that, so that it produces the same output as the C++
version for the same input.