c - ARM NEON 8x8 SAD 操作

标签 c arm neon

我对 ARM 和 NEON 编程相当陌生,我被赋予了优化 SAD(绝对差和)函数的任务。我不知道从哪里开始,我尝试了几种生成 NEON 代码的方法但没有成功。 顺序函数看起来像这样:

void sad_block_8x8(uint8_t *block1, uint8_t *block2, int stride, int *result)
{
    int u, v;

    *result = 0;

    for (v = 0; v < 8; ++v)
    {
        for (u = 0; u < 8; ++u)
        {
            *result += abs(block2[v*stride+u] - block1[v*stride+u]);
        }
    }
}

所以我的问题是:

  1. 如何为每次迭代加载寄存器
  2. 如何进行计算并将其存储到变量结果

任何帮助将非常感激!

好吧...所以我的第一次尝试是这样的(可行,但我知道这是一个极其糟糕的 NEON 代码)

void sad_block_8x8_2(uint8_t *block1, uint8_t *block2, int stride, int *result) 
{
int u, v;
uint8x8_t m_1, m_2, m_o;
uint8_t* test;
test = (uint8_t*)malloc(v*u*sizeof(uint8_t));;
*result = 0;
for (v = 0; v < 8; ++v)
{
    for(u = 0; u < 8; ++u)
    {
        m_1 = vld1_u8(&block1[v*stride]);
        m_2 = vld1_u8(&block2[v*stride]);

        m_o = vabd_u8(m_2, m_1);
        vst1_u8(&test[v], m_o);
        //printf("%d ", test[v]);
        *result += (int)test[v];
    }
}
}

请问有什么帮助吗?

最佳答案

这是您想要的 SAD 算法的更好、更清晰的实现:

void neon_sad_block_8x8(uint8_t *__restrict block1, uint8_t * __restrict block2, int stride, int *__restrict result)
{
        int i, j;
        uint8x8_t neon_block1;
        uint8x8_t neon_block2;
        uint8x8_t res;
        int sum = 0;
        for (i = 0; i < 8; i++) {                                                
            neon_block1 = vld1_u8(&block1[i * stride]);                      
            neon_block2 = vld1_u8(&block2[i * stride]);                      
            res = vabd_u8(neon_block2, neon_block1);                         
            sum += res[0] + res[1] + res[2] + res[3] + res[4] + res[5] + res[6] + res[7];
        }
        *result = sum;
}

这段代码有:

  • 只有一个循环
  • 循环中没有break语句
  • 指针由 __restrict 保护

关于c - ARM NEON 8x8 SAD 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39569591/

相关文章:

arm - NEON :float32x4_t 向量中最多四个浮点值

c - 十进制转 BCD 转 ASCII

c - 创建 MPI 结构时出现问题,调用 MPI_Bcast 时出现错误 11

arm - 什么是 ARM Thumb 指令集?

assembly - arm neon 比较操作生成负一

assembly - 为什么后来的 ARM 指令集中不存在条件执行指令?

c++ - 高效的浮点比较(Cortex-A8)

c - 添加泳道中的所有元素

当写入器速度快于读取器时,C FIFO 崩溃

c - 在 C 中,puts 函数给出垃圾值