D easily overlooked?
Joakim via Digitalmars-d
digitalmars-d at puremagic.com
Sun Sep 3 12:28:41 PDT 2017
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.
More information about the Digitalmars-d
mailing list