September 03, 2017 Re: D easily overlooked? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Joakim | 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 |
September 03, 2017 Re: D easily overlooked? | ||||
---|---|---|---|---|
| ||||
Posted in reply to thinwybk | 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.
|
Copyright © 1999-2021 by the D Language Foundation