NEON 指令集并行技术优化彩色图像转灰度图【Android】

简介: NEON 指令集并行技术优化彩色图像转灰度图【Android】

参考原文:


android平台的neon优化策略


Neon Intrinsics各函数介绍



目前市面上主流的旗舰android手机搭载的Soc都是64位的CPU,常见的armv7指令集的公版架构如Cortex-A8,Cortex-A9,Cortex-A15,常见的armv8指令集的公版架构如Cortex-A53,Cortex-A57,Cortex-A72,Cortex-A73。arm架构的CPU从armv7a开始已经支持neon(可选项),从而实现并行计算功能。armv8a还具备32个128neon寄存器,并且支持双精度浮点数。


image.png

image.png

下面为我添加的代码注释 (第一篇参考文章中错把 Android 的位图 RGBA 格式当做 ARGB 进行处理了):

image.png

如图,很明显 alpha 通道是最后一个,但是值得注意的是,当使用 u16 时,数据格式为 (20541=0x503D)(65463=0xFFB7) 对应 rgba 中的 GR 和 AB

void method_rgba2gray_neon(AndroidBitmapInfo info, void *pixels) {
    // Gray = (R*38 + G*75 + B*15) >> 7
    TickMeter tm3;
    tm3.start();
    unsigned short *dst = (unsigned short *) pixels; // 注意是 unsigned short
    unsigned char *src = (unsigned char *) pixels;
    uint8x8_t r = vdup_n_u8(38); // 将一个标量扩展城向量 8 bit * 8
    uint8x8_t g = vdup_n_u8(75);
    uint8x8_t b = vdup_n_u8(15);
    uint16x8_t alp = vdupq_n_u16(255 << 8);
    uint16x8_t temp;
    uint8x8_t gray;
    uint8x8x4_t rgba;
    uint16x8_t high;
    uint16x8_t low;
    uint16x8x2_t res;
    int i, size = info.height * info.width / 8;
    // 暂不考虑不能被 8 整除的情况
    for (i = 0; i < size; ++i) {
        // 获取r、g、b值,计算灰度值
        rgba = vld4_u8(src);  // 从内存中加载数据(以 AOS 存储)到 4 个向量(8 bit * 8)中(SOA)
        temp = vmull_u8(rgba.val[0], r); // vmul 指令
        temp = vmlal_u8(temp, rgba.val[1], g); // vmla 指令
        temp = vmlal_u8(temp, rgba.val[2], b);
        gray = vshrn_n_u16(temp, 7); // vshrn_n_u16 会在做右移 7 位的同时将2字节无符号型转成1字节无符号型
        src += 8 * 4; // src 移到下个位置
        // 赋值 4 通道 rgba(将 gray 扩展成 rgba)
        // 先用 vmovl_u8 (长指令)符号扩展或零扩展双字向量中的每个元素到其原始长度的两倍
        // vqmovn_* 为窄指令
        high = vorrq_u16(alp, vmovl_u8(gray)); // 再用 vorrq_u16 按位或运算
        low = vorrq_u16(vshlq_n_u16(vmovl_u8(gray), 8), vmovl_u8(gray)); // 注意这里是左移
        res = vzipq_u16(low, high); // 两个向量的元素交错打包成一个新向量
        vst1q_u16(dst, res.val[0]); // 存储一个向量(res 的前半部分)到内存(16bit*8)
        dst += 8;
        vst1q_u16(dst, res.val[1]);
        dst += 8;
    }
    tm3.stop();
    LOGI("method_rgba2gray_neon   time: %lf", tm3.getTimeMilli());
    LOGI(" \n");
}

vmovl_u8,vshlq_n_u16 函数的执行结果分别如下:

image.png

其中结果 16进制表示的形式为

86:0x0056

22016:0x5600

vzipq_u16 函数执行(low:GR, high:AB的格式)的结果如下:

image.png

可以看出 res[0] 和 res[1] 两个向量分别由 low, high 两个向量一前一后交错打包而成。

其中,

22102:0x5656

65366:0xFF56

程序运行效果如下:

image.png

我在 debug/release 模式下分别进行了测试,发现作者原来的方法竟然还不如 c 原生实现的高效。。。一度怀疑我自己的手机是不是坏了(S8+),我自己实现的都有将近 30% 的性能提升。。。另外可以看出 OpenCV 的优化还是非常优秀的!

image.png

最后,可以将 Build Variants 设置为 release(默认为 debug)

image.png

目录
相关文章
|
2月前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术深度对比
【10月更文挑战第18天】 在智能手机操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两种系统的技术特点、优势以及它们之间的主要差异,帮助读者更好地理解这两个平台的独特之处。
55 0
|
1月前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
80 2
|
1月前
|
安全 搜索推荐 Android开发
揭秘iOS与安卓系统的差异:一场技术与哲学的较量
在智能手机的世界里,iOS和Android无疑是两大巨头,它们不仅定义了操作系统的标准,也深刻影响了全球数亿用户的日常生活。本文旨在探讨这两个平台在设计理念、用户体验、生态系统及安全性等方面的本质区别,揭示它们背后的技术哲学和市场策略。通过对比分析,我们将发现,选择iOS或Android,不仅仅是选择一个操作系统,更是选择了一种生活方式和技术信仰。
|
2月前
|
安全 Android开发 iOS开发
iOS与安卓:技术生态的双雄争霸
在当今数字化时代,智能手机操作系统的竞争愈发激烈。iOS和安卓作为两大主流平台,各自拥有独特的技术优势和市场地位。本文将从技术架构、用户体验、安全性以及开发者支持四个方面,深入探讨iOS与安卓之间的差异,并分析它们如何塑造了今天的移动技术生态。无论是追求极致体验的苹果用户,还是享受开放自由的安卓粉丝,了解这两大系统的内在逻辑对于把握未来趋势至关重要。
|
2月前
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。
|
2月前
|
安全 Android开发 iOS开发
安卓vs iOS:探索两种操作系统的独特魅力与技术深度###
【10月更文挑战第16天】 本文旨在深入浅出地探讨安卓(Android)与iOS这两种主流移动操作系统的特色、优势及背后的技术理念。通过对比分析,揭示它们各自如何塑造了移动互联网的生态,并为用户提供丰富多彩的智能体验。无论您是科技爱好者还是普通用户,都能从这篇文章中感受到技术创新带来的无限可能。 ###
58 2
|
2月前
|
机器学习/深度学习 人工智能 Android开发
安卓与iOS:技术演进的双城记
【10月更文挑战第16天】 在移动操作系统的世界里,安卓和iOS无疑是两个最重要的玩家。它们各自代表了不同的技术理念和市场策略,塑造了全球数亿用户的移动体验。本文将深入探讨这两个平台的发展历程、技术特点以及它们如何影响了我们的数字生活,旨在为读者提供一个全面而深入的视角,理解这两个操作系统背后的哲学和未来趋势。
34 2
|
1月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
1月前
|
搜索推荐 安全 Android开发
安卓与iOS的哲学对话:技术生态中的选择与命运
【10月更文挑战第24天】 在智能设备的世界里,安卓和iOS不仅是操作系统的简单对立,它们代表了不同的技术哲学和生态策略。本文将探讨这两种系统背后的设计理念、用户体验差异以及它们如何塑造我们的数字生活,从而引发对于“我们如何选择技术”这一命题的深入思考。
|
1月前
|
安全 5G Android开发
安卓与iOS的较量:技术深度解析
【10月更文挑战第24天】 在移动操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两个系统的技术特点、优势和不足,以及它们在未来可能的发展方向。我们将通过对比分析,帮助读者更好地理解这两个系统的本质和内涵,从而引发对移动操作系统未来发展的深思。
51 0