[gmx-developers] std::vector<Rvec> slowness
Berk Hess
hess at kth.se
Wed Mar 23 11:24:19 CET 2016
No.
using the RVec * pointer obtained through .data() already fixes the
issue. We don't even need as_rvec_array().
The real issue is that it's near impossible to enforce this and detect
vector access of RVecs if we start using std::vector everywhere through
the code.
Cheers,
Berk
On 2016-03-23 11:19, Mark Abraham wrote:
> Hi,
>
> If so, then we might want a helper function like as_rvec_array, but
> as_real_array instead.
>
> Mark
>
> On Wed, Mar 23, 2016 at 10:51 AM Berk Hess <hess at kth.se
> <mailto:hess at kth.se>> wrote:
>
> On 2016-03-23 10:50, Erik Lindahl wrote:
>> Hi,
>>
>> I haven’t followed the discussion in detail, but a long time ago
>> I remember having simliar issues in the kernels when using a
>> list[] of rvec[] (in plain-old-c, no c++) instead of extracting
>> the pointer and handling the multiply-by-3 manually. Could it be
>> something similar here, e.g. that the compiler things it does not
>> know enough about RVec rather than something going from with the
>> outer list?
> That would be my guess. The index used in the same loop comes from
> a vector as well and doesn't seem to affect performance.
>
>
> Berk
>
>>
>> Cheers,
>>
>> Erik
>>
>>> On 23 Mar 2016, at 10:44, Berk Hess <hess at kth.se
>>> <mailto:hess at kth.se>> wrote:
>>>
>>> On 2016-03-23 10:42, Mark Abraham wrote:
>>>> Hi,
>>>>
>>>> On Wed, Mar 23, 2016 at 9:44 AM Berk Hess <hess at kth.se
>>>> <mailto:hess at kth.se>> wrote:
>>>>
>>>> Hi,
>>>>
>>>> Luckily Szilard does thorough testing and noticed a performance
>>>> degradation in change set 25 of
>>>> https://gerrit.gromacs.org/#/c/5232/ The
>>>> only signifcant change with respect to previous sets is
>>>> replacing C
>>>> pointers by std::vector. I traced the performance
>>>> difference back to a
>>>> single loop, which must have become several factors slower
>>>> to explain
>>>> the time difference. I get the performance back when
>>>> replacing the
>>>> vector by a pointer extracted with .data(), see below. I
>>>> looked at the
>>>> assembly code from gcc 5.3.1 and the vector case generated
>>>> 200 extra
>>>> instructions, which makes it difficult to see what the
>>>> actual difference
>>>> is. The pointer case uses a lot of vmovss and vaddss, which
>>>> the vector
>>>> one does much less, but this is only serial SIMD
>>>> instruction. I thought
>>>> that [] in vector might does bounds checking,
>>>>
>>>>
>>>> Definitely not in release builds.
>>>>
>>>> but it seems it does not.
>>>> Can anyone explain why the vector case can be so slow?
>>>>
>>>> If this is a general issue (with RVec or more?), we need to
>>>> always extra
>>>> a pointer with .data() for use in all inner-loops. This is
>>>> pretty
>>>> annoying and difficult to enforce.
>>>>
>>>> Cheers,
>>>>
>>>> Berk
>>>>
>>>> const std::vector<RVec> f_foreign =
>>>> idt_foreign->force
>>>>
>>>>
>>>> This does a copy of the vector, and doesn't seem to be in any
>>>> version of this patch in gerrit. Is this what you meant to write?
>>> I tried this. But my original "vectorized" patch set took a
>>> pointer from idt_foreign and did not copy the vector, that gives
>>> the same, slow, performance.
>>>
>>> Berk
>>>>
>>>> Mark
>>>>
>>>> or
>>>> const RVec *f_foreign =
>>>> idt_foreign->force.data();
>>>>
>>>> int natom = atomList->atom.size();
>>>> for (int i = 0; i < natom; i++)
>>>> {
>>>> int ind = atomList->atom[i];
>>>> rvec_inc(f[ind], f_foreign[ind]);
>>>> }
>>>> --
>>>> Gromacs Developers mailing list
>>>>
>>>> * Please search the archive at
>>>> http://www.gromacs.org/Support/Mailing_Lists/GMX-developers_List
>>>> before posting!
>>>>
>>>> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists
>>>>
>>>> * For (un)subscribe requests visit
>>>> https://maillist.sys.kth.se/mailman/listinfo/gromacs.org_gmx-developers
>>>> or send a mail to gmx-developers-request at gromacs.org
>>>> <mailto:gmx-developers-request at gromacs.org>.
>>>>
>>>>
>>>>
>>>
>>> --
>>> Gromacs Developers mailing list
>>>
>>> * Please search the archive at
>>> http://www.gromacs.org/Support/Mailing_Lists/GMX-developers_List
>>> before posting!
>>>
>>> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists
>>>
>>> * For (un)subscribe requests visit
>>> https://maillist.sys.kth.se/mailman/listinfo/gromacs.org_gmx-developers
>>> or send a mail to gmx-developers-request at gromacs.org
>>> <mailto:gmx-developers-request at gromacs.org>.
>>
>>
>>
>
> --
> Gromacs Developers mailing list
>
> * Please search the archive at
> http://www.gromacs.org/Support/Mailing_Lists/GMX-developers_List
> before posting!
>
> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists
>
> * For (un)subscribe requests visit
> https://maillist.sys.kth.se/mailman/listinfo/gromacs.org_gmx-developers
> or send a mail to gmx-developers-request at gromacs.org
> <mailto:gmx-developers-request at gromacs.org>.
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://maillist.sys.kth.se/pipermail/gromacs.org_gmx-developers/attachments/20160323/6d197c34/attachment.html>
More information about the gromacs.org_gmx-developers
mailing list