<div dir="ltr">Hi,<br><br><div class="gmail_quote"><div dir="ltr">On Wed, Mar 23, 2016 at 9:44 AM Berk Hess &lt;<a href="mailto:hess@kth.se">hess@kth.se</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
Luckily Szilard does thorough testing and noticed a performance<br>
degradation in change set 25 of <a href="https://gerrit.gromacs.org/#/c/5232/" rel="noreferrer" target="_blank">https://gerrit.gromacs.org/#/c/5232/</a> The<br>
only signifcant change with respect to previous sets is replacing C<br>
pointers by std::vector. I traced the performance difference back to a<br>
single loop, which must have become several factors slower to explain<br>
the time difference. I get the performance back when replacing the<br>
vector by a pointer extracted with .data(), see below. I looked at the<br>
assembly code from gcc 5.3.1 and the vector case generated 200 extra<br>
instructions, which makes it difficult to see what the actual difference<br>
is. The pointer case uses a lot of vmovss and vaddss, which the vector<br>
one does much less, but this is only serial SIMD instruction. I thought<br>
that [] in vector might does bounds checking,</blockquote><div><br></div><div>Definitely not in release builds.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> but it seems it does not.<br>
Can anyone explain why the vector case can be so slow?</blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
If this is a general issue (with RVec or more?), we need to always extra<br>
a pointer with .data() for use in all inner-loops. This is pretty<br>
annoying and difficult to enforce.<br>
<br>
Cheers,<br>
<br>
Berk<br>
<br>
                        const std::vector&lt;RVec&gt; f_foreign =<br>
idt_foreign-&gt;force<br></blockquote><div><br></div><div>This does a copy of the vector, and doesn&#39;t seem to be in any version of this patch in gerrit. Is this what you meant to write?</div><div><br></div><div>Mark</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
or<br>
                        const RVec               *f_foreign   =<br>
idt_foreign-&gt;force.data();<br>
<br>
                         int natom = atomList-&gt;atom.size();<br>
                         for (int i = 0; i &lt; natom; i++)<br>
                         {<br>
                             int ind = atomList-&gt;atom[i];<br>
                             rvec_inc(f[ind], f_foreign[ind]);<br>
                         }<br>
--<br>
Gromacs Developers mailing list<br>
<br>
* Please search the archive at <a href="http://www.gromacs.org/Support/Mailing_Lists/GMX-developers_List" rel="noreferrer" target="_blank">http://www.gromacs.org/Support/Mailing_Lists/GMX-developers_List</a> before posting!<br>
<br>
* Can&#39;t post? Read <a href="http://www.gromacs.org/Support/Mailing_Lists" rel="noreferrer" target="_blank">http://www.gromacs.org/Support/Mailing_Lists</a><br>
<br>
* For (un)subscribe requests visit<br>
<a href="https://maillist.sys.kth.se/mailman/listinfo/gromacs.org_gmx-developers" rel="noreferrer" target="_blank">https://maillist.sys.kth.se/mailman/listinfo/gromacs.org_gmx-developers</a> or send a mail to <a href="mailto:gmx-developers-request@gromacs.org" target="_blank">gmx-developers-request@gromacs.org</a>.<br>
</blockquote></div></div>