c++ - 使用 STL vector 优化算术运算

标签 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 行?

为什么“mov”操作比 mul 和 div 更昂贵?

更新 从 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

最佳答案

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

关于c++ - 使用 STL vector 优化算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30884655/

相关文章:

c++ - 在动态分配的内存上调用 memset 会导致堆损坏吗

linux - 从仅采用 char* 参数的 x86_64 函数中使用 sys_write?

c - 在汇编中实现矩阵 vector 乘法

c++ - `std::less` 是如何工作的?

c++ - 请解释这个执行强制转换和类型检查的硬核宏

c++ - 对默认参数使用右值引用

c - MSVC 内联 ASM 到 GCC

c++ - 基于范围的 'for' 循环是否会弃用许多简单的算法?

c++ - 为什么 std::numeric_limits<long long>::max() 会失败?

c++ - 使用安全向下转换的类设计选项