【发布时间】:2012-02-14 19:28:56
【问题描述】:
我有以下代码用于计算两个向量之间的距离:
double dist(vector<double> & vecA, vector<double> & vecB){
double curDist = 0.0;
for (size_t i = 0; i < vecA.size(); i++){
double dif = vecA[i] - vecB[i];
curDist += dif * dif;
}
return curDist;
}
这个函数是我的应用程序的一个主要瓶颈,因为它依赖于大量的距离计算,在典型输入上消耗超过 60% 的 CPU 时间。此外,以下行:
double dif = vecA[i] - vecB[i];
在这个函数中负责超过 77% 的 CPU 时间。我的问题是:是否有可能以某种方式优化此功能?
注意事项:
- 为了分析我的应用程序,我使用了 Intel Amplifier XE;
- 减少距离计算的数量不是一个可行的解决方案 我;
【问题讨论】:
-
如果该行确实占用了超过一半的 CPU 时间,那么它似乎与缓存相关(即第一次访问每个元素都会受到缓存命中),并且很难通过加速代码进行优化。您可能需要研究基于向量的指令以减轻一点(a'la SSE3)
-
@Mystical vector.size() 根据应用程序输入(即数据集维度)在 4 到 100 之间变化。
-
这是 STL 的向量吗?如果这里的所有人都假设它是而事实并非如此,那将是一种耻辱。
-
@Mooing duck - 它还计算表示为坐标向量的两点之间距离的平方。
-
您是否单步执行循环,一次一条指令,以确保它没有调用隐藏函数或边界检查?
标签: c++ performance optimization