C++ OpenCV速度差平方和
我一直在使用openCV进行一些块匹配,我注意到它的平方差和代码与这样的直接for循环相比非常快:C++ OpenCV速度差平方和,c++,algorithm,computer-vision,C++,Algorithm,Computer Vision,我一直在使用openCV进行一些块匹配,我注意到它的平方差和代码与这样的直接for循环相比非常快: int SSD = 0; for(int i =0; i < arraySize; i++) SSD += (array1[i] - array2[i] )*(array1[i] - array2[i]); intssd=0; for(int i=0;i
int SSD = 0;
for(int i =0; i < arraySize; i++)
SSD += (array1[i] - array2[i] )*(array1[i] - array2[i]);
intssd=0;
for(int i=0;i
如果我看一下源代码,看看繁重的工作发生在哪里
OpenCV人员让他们的for循环在循环的每次迭代中一次进行4次平方差计算。执行块匹配的函数如下所示
int64
icvCmpBlocksL2_8u_C1( const uchar * vec1, const uchar * vec2, int len )
{
int i, s = 0;
int64 sum = 0;
for( i = 0; i <= len - 4; i += 4 )
{
int v = vec1[i] - vec2[i];
int e = v * v;
v = vec1[i + 1] - vec2[i + 1];
e += v * v;
v = vec1[i + 2] - vec2[i + 2];
e += v * v;
v = vec1[i + 3] - vec2[i + 3];
e += v * v;
sum += e;
}
for( ; i < len; i++ )
{
int v = vec1[i] - vec2[i];
s += v * v;
}
return sum + s;
}
int64
icvCmpBlocksL2_8u_C1(常数*向量1,常数*向量2,整数长度)
{
int i,s=0;
int64总和=0;
对于(i=0;i我的猜测是,这只是一个简单的实现-它在循环的每个过程中节省了3次添加和3次比较,例如,如果检查len
涉及缓存未命中,这将是一个巨大的节约。缺点是这种优化增加了代码复杂性(例如,如果长度不能被4平均整除,则在末尾附加for循环以完成len%4项的循环),当然,这是一种依赖于体系结构的优化,其改进幅度将因硬件/编译器等而异
尽管如此,与大多数优化相比,它很容易遵循,并且无论架构如何,都可能会导致某种性能的提高,因此,将其投入其中并希望达到最佳效果的风险很低。由于OpenCV是一个受良好支持的代码块,我确信有人对这些代码块进行了检测,并且正如您自己所做的那样,您的代码有一个明显的优化,即:
int SSD = 0;
for(int i = 0; i < arraySize; i++)
{
int v = array1[i] - array2[i];
SSD += v * v;
}
intssd=0;
for(int i=0;i
我对优化我的代码有点陌生。为什么将平方差计算分成两行会带来速度优势?还有,l和c在做什么?@ncRubert重点不是打破平方差计算,而是不计算2倍的差array1[I]-array2[I]
。
int SSD = 0;
for(int i = 0; i < arraySize; i++)
{
int v = array1[i] - array2[i];
SSD += v * v;
}