在手臂氖中高效计算两个不同的数字
Efficiently compute two dissimilar numbers in arm neon
>我有一个包含 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
上,如果这很重要,它已经在霓虹灯寄存器中。在输出上,我应该得到两个整数(在 neon reg 中也许它更好(。 如何在手臂霓虹灯中有效地做到这一点,我应该尝试什么方法?澄清一下,问题的重点是 优化findDissimilar
.
diss
在neon中计算是微不足道的,它可以通过这种方式实现(未经测试的代码(:
uint32x4_t diss_x4(uint32x4_t x4, uint32x4_t y4)
{
uint8x16_t diff = vabdq_u8(vreinterpretq_u8_u32(x4), vreinterpretq_u8_u32(x4));
uint16x8_t m0 = vmull_u8(vget_low_u8(diff), vget_low_u8(diff));
uint16x8_t m1 = vmull_u8(vget_high_u8(diff), vget_high_u8(diff));
uint16x4_t s0 = vpadd_u16(vget_low_u8(m0), vget_high_u8(m0));
uint16x4_t s1 = vpadd_u16(vget_low_u8(m1), vget_high_u8(m1));
uint16x4_t sx = vpadd_u16(s0, s1);
return vmovl_u16(sx);
}
但对findDissimilar
来说不是那么微不足道.我认为最好的方法是执行以下操作: - 将所有 16 个整数加载到 4 个 Q 寄存器中{q0, q1, q2, q3}
. - 第一个 Q0 注册包含{ buf[0], buf[1], buf[2], buf[3] }
- 然后我可以循环 15 次并从 4 个输入 q reg 中提取到 qext 值,例如 vextq_u32(q0, q1, 1( 用于第一次迭代等。 - 计算 Q0 和 Qext 之间的最小值。
然后,对于 Q1、Q2、Q3,也应执行相同的过程。
也许如果我按字节{q0, q1, q2, q3}
去交错,它可以更好地优化。
相关文章:
- C++通过数字比较两个数字
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 在 txt 文件中显示前两个数字的程序
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 两个数字的对称配对功能
- 查找中间两个数字的正则表达式的匹配项
- 使用C++具有两个数字的最短路径算法.(C++)
- 将两个数字添加为链表
- C++ 分段错误:11 错误,同时编码将两个数字相加的链接列表
- 我应该如何使用remove_if删除两个数字范围内的元素
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 子数组中两个数字的相同出现(连续)
- 如何使用位操作在单个整数中编码和解码两个数字
- 在 c++ 程序中调试链表以添加两个数字: 有人可以解释为什么 l3=l3->next;导致错误?
- 钻头以两个数字替换位
- C 如何在小数系统中添加两个数字
- 为什么我的代码不给最后两个数字
- 如何在给出前两个数字的级数中找到大于 x 的第 n 个最小子数组总和?
- 输入两个数字后程序关闭
- 代码是否交换数组的两个数字