使用stl向量优化算术运算

时间:2015-06-17 07:12:47

标签: c++ assembly stl profiling

我有一些简单的结构:

struct ab { double a,b; }
struct abcd { double a,b,c,d; }

struct ch
{
...
  std::vector<abcd> x;
  std::vector<size_t> ir;
...
}

代码:

ch l;
std::vector<ab> x;
double c,f;
...
for(size_t i = ... )
{
    ...
    l.x[i].c = (l.x[i].c / c) + f*x[l.ir[i]].a; // line#1
    ...
}

CodeXl显示最昂贵的线之一是第1行。 第1行的60%采取

 mov eax,[edx+eax]

如何优化第1行?

为什么&#34; mov&#34;操作比mul和div贵吗?

UPD 完全反编译来自CodeXl的第1行:

l.x[i].c = (l.x[i].c / c) + f*x[l.ir[i]].a; => 15.871% of function time
;;
mov ecx,[ebx+4ch]
lea edx,[edi*4+00000000h] => 0.99194%
shl edi,05h
mov eax,[ebx+1ch]
movsd xmm0,[ecx+edi+10h]
divsd xmm0,xmm2 => 1.17793%
mov eax,[edx+eax] => 10.0434%
add eax,eax
movsd xmm1,[esi+eax*8]
mulsd xmm1,xmm4
addsd xmm1,xmm0 => 1.30192%
movsd [ecx+edi+10h],xmm1 => 2.35586%

更新 Microsoft Visual Studio 2013. Release32

1 个答案:

答案 0 :(得分:1)

muldiv很快,因为参数可用。 mov eax, [eax+edx]需要记忆中的参数。它是在缓存中还是预取的?我怀疑这个特定mov来自您的x[l.ir[i]]表达式,x足够大而无法缓存,l.ir[i]足够非线性以击败预取器。这意味着你正在等待主存。