首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ARM上快速搜索/替换8位数组中的匹配单字节

在ARM上快速搜索/替换8位数组中的匹配单字节
EN

Stack Overflow用户
提问于 2016-01-28 16:14:45
回答 1查看 725关注 0票数 6

我开发图像处理算法(使用GCC,针对ARMv7 (树莓派2B))。

特别是,我使用了一个简单的算法,它改变了掩码中的索引:

代码语言:javascript
复制
void ChangeIndex(uint8_t * mask, size_t size, uint8_t oldIndex, uint8_t newIndex)
{
    for(size_t i = 0; i < size; ++i)
    {
        if(mask[i] == oldIndex)
            mask[i] = newIndex;
    }
}

不幸的是,它在目标平台上的性能很差。

有什么方法可以优化它吗?

EN

回答 1

Stack Overflow用户

发布于 2016-01-28 16:25:27

ARMv7平台支持称为霓虹灯的单指令多路复用指令。通过使用它们,您可以更快地编写代码:

代码语言:javascript
复制
#include <arm_neon.h>

void ChangeIndex(uint8_t * mask, size_t size, uint8_t oldIndex, uint8_t newIndex)
{
    size_t alignedSize = size/16*16, i = 0;

    uint8x16_t _oldIndex = vdupq_n_u8(oldIndex);
    uint8x16_t _newIndex = vdupq_n_u8(newIndex);

    for(; i < alignedSize; i += 16)
    {
        uint8x16_t oldMask = vld1q_u8(mask + i); // loading of 128-bit vector
        uint8x16_t condition = vceqq_u8(oldMask, _oldIndex); // compare two 128-bit vectors
        uint8x16_t newMask = vbslq_u8(condition, _newIndex, oldMask); // selective copying of 128-bit vector
        vst1q_u8(mask + i, newMask); // saving of 128-bit vector
    }

    for(; i < size; ++i)
    {
        if(mask[i] == oldIndex)
            mask[i] = newIndex;
    }
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35056024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档