【发布时间】:2018-07-03 00:08:25
【问题描述】:
我有一个由 16 个整数组成的数组,我想从这个数组中找到一对彼此之间具有最大差异的整数。 可以用这个(伪)代码计算差异:
int diss(uint32_t x, uint32_t y)
{ // it could do square for each byte of the number instead.
return
abs(((x >> 24) & 0xFF) - ((y >> 24) & 0xFF)) +
abs(((x >> 16) & 0xFF) - ((y >> 16) & 0xFF)) +
abs(((x >> 8) & 0xFF) - ((y >> 8) & 0xFF)) +
abs(((x >> 0) & 0xFF) - ((y >> 0) & 0xFF));
}
void findDissimilar(uint32_t buf[16], uint32_t& x, uint32_t& y)
{
int maxDiss = 0;
for (int i=0; i<16; ++i)
{
for (int j=0; j<16; ++j)
{
int d = diss(buf[i], bud[j]);
if (d > maxDiss)
{
maxDiss = d;
x = buf[i];
y = buf[j];
}
}
}
}
输入buf 已经在霓虹灯寄存器中,如果这很重要的话。在输出时,我应该得到两个整数(在霓虹灯 reg 中可能会更好)。
我怎样才能在手臂霓虹灯中有效地做到这一点,我应该尝试什么方法?澄清一下,问题的重点是优化findDissimilar。
【问题讨论】:
-
所以你正在做 4 字节的 SAD(绝对差之和),并寻找具有最大 SAD 的对?
-
是的,类似的。我想我在 ffmpeg 或 x264 的某个地方看到过,我会尝试 grep 看看它们是否有类似的东西。
-
是的,x264 应该有一些 4x4 SAD 运动搜索,包括详尽的搜索。但它将分别查看不同的颜色平面,用于 4x4 像素的块。因此,运动搜索将检查每个字节偏移量,而不仅仅是 4 个字节的步长。但是,如果您可以将其与混洗/未对齐负载分开,您可能会了解一些有用的指令,用于使用 NEON 进行字节 SAD。
-
x264 有多种搜索模式可以快速寻找好的匹配,不一定是最小 SAD:
dia(对角线)、hex(六边形)、umh(不均匀的多六边形) , 和esa(详尽无遗,但不是对每个对齐方式的强力检查)。tesa找到最小成本 DCT 转换残差,而不是最小 SAD。另请注意,x264 将具有 8x8 和 16x16 SAD,用于在更大的块上进行运动搜索。 -
你是如何使用结果的?您是否想要多个 16 元素缓冲区的结果 SIMD 向量,还是一次只用于一个 16 字节向量? (不确定这是否会产生影响,但很容易。并且可能存在吞吐量与延迟之间的权衡。)为了确认,您只想要数字本身,而不是位置?
标签: c++ arm intrinsics neon