[gmx-developers] std::vector<Rvec> slowness
Berk Hess
hess at kth.se
Wed Mar 23 09:44:21 CET 2016
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, 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
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]);
}
More information about the gromacs.org_gmx-developers
mailing list