【发布时间】:2017-07-31 18:51:00
【问题描述】:
我最近发现我的程序大部分时间都花在了以下简单的函数上:
void SumOfSquaredDifference(
const uint8_t * a, size_t aStride, const uint8_t * b, size_t bStride,
size_t width, size_t height, uint64_t * sum)
{
*sum = 0;
for(size_t row = 0; row < height; ++row)
{
int rowSum = 0;
for(size_t col = 0; col < width; ++col)
{
int d = a[col] - b[col];
rowSum += d*d;
}
*sum += rowSum;
a += aStride;
b += bStride;
}
}
此函数求两个 8 位灰度图像的平方差之和。 我认为使用 SSE 可以提高其性能,但我在这方面没有经验。 有人可以帮帮我吗?
【问题讨论】:
-
在开始手动优化之前,您需要检查您的编译器是否已经生成矢量化代码。确保您已启用优化和 SIMD,并检查生成的 SSE 指令代码,否则您可能会浪费时间做傻事。 (顺便说一句,请说明您使用的 CPU 硬件、操作系统和编译器。)
-
你的外循环似乎没用。这是一个错误吗?
-
@A.S.H:我知道这看起来很奇怪,但他在每次行迭代时都会碰到
a、b指针。 -
Clang 和 GCC 自动矢量化这个,但不是很好(使用
vpmulld,这是低吞吐量) -
我希望编译器对使用 SSE 犹豫不决。
height、width、aStride和bStride都是运行时参数。这意味着对于 SSE(16 字节),每行的开头和结尾都不能适当对齐
标签: c++ image-processing optimization sse simd