我正在尝试构建一个总面积表,以供以后在自适应阈值例程中使用。由于此代码将用于时间关键型软件,因此我试图从中挤出尽可能多的周期。
出于性能考虑,该表是每个像素的无符号整数。
当我附加我的分析器时,我表明我最大的性能瓶颈发生在执行 x-pass 时。
计算的简单数学表达式是:
sat_[y * width + x] = sat_[y * width + x - 1] + buff_[y * width + x]
where the running sum resets at every new y position.
在这种情况下,sat_
是表示 SAT 的无符号整数的一维指针,并且buff_
是 8 位无符号单色缓冲区。
我的实现如下所示:
uint *pSat = sat_;
char *pBuff = buff_;
for (size_t y = 0; y < height; ++y, pSat += width, pBuff += width)
{
uint curr = 0;
for (uint x = 0; x < width; x += 4)
{
pSat[x + 0] = curr += pBuff[x + 0];
pSat[x + 1] = curr += pBuff[x + 1];
pSat[x + 2] = curr += pBuff[x + 2];
pSat[x + 3] = curr += pBuff[x + 3];
}
}
循环是手动展开的,因为我的编译器 (VC11) 没有为我做这件事。我遇到的问题是整个分段例程花费大量时间来运行该循环,我想知道是否有人对什么可以加快它有任何想法。我可以访问所有 SSE 的集合,以及运行该例程的任何机器的 AVX,所以如果那里有什么东西,那将非常有用。
此外,一旦我挤出最后一个周期,我就计划将其扩展到多核,但我希望在使模型更复杂之前让单线程计算尽可能紧凑。