NEON 指令集并行技术优化矩阵旋转【Android】

简介: NEON 指令集并行技术优化矩阵旋转【Android】

参考链接: 利用neon技术对矩阵旋转进行加速

目标:将输入矩阵顺时针旋转90度,如下图所示:

  输入矩阵                                      输出矩阵

   image.png                                       image.png

以 8x8x8bit 的矩阵(更大的矩阵可以分块为 8x8x8bit)为例,基本的思路就是,逐渐扩大粒度(8bit 到 32bit)的 2x2 矩阵旋转

vtrn 示意图,可以看作是 2x2 矩阵的转置

image.png

原始的数据的字节表示形式

image.png

以 8 bit 为单位进行旋转:

temp1 = vtrn_u8(mat1.val[1], mat1.val[0]);
temp2 = vtrn_u8(mat1.val[3], mat1.val[2]);
temp3 = vtrn_u8(mat2.val[1], mat2.val[0]);
temp4 = vtrn_u8(mat2.val[3], mat2.val[2]);

image.png

结果以 16 bit 看作一个数小端存储

image.png

再次进行旋转得到

temp9 = vtrn_u16(temp6.val[0], temp5.val[0]);
temp10 = vtrn_u16(temp6.val[1], temp5.val[1]);
temp11 = vtrn_u16(temp8.val[0], temp7.val[0]);
temp12 = vtrn_u16(temp8.val[1], temp7.val[1]);

image.png

旋转的结果对应的字节表示形式为小端存储 

image.png

接着,把 32bit 当做一个数来旋转

image.png

temp17=vtrn_u32(temp15.val[0],temp13.val[0]);
temp18=vtrn_u32(temp15.val[1],temp13.val[1]);
temp19=vtrn_u32(temp16.val[0],temp14.val[0]);
temp20=vtrn_u32(temp16.val[1],temp14.val[1]);

旋转的结果为

image.png

对应的字节表示形式为

image.png

即最初矩阵的顺时针 90 ° 旋转的结果

代码如下:

            uint8x8x4_t mat1, mat2;
            mat1.val[0] = vld1_u8(srcImg + i * width + j);  // vec8,每个元素 8 bit
            mat1.val[1] = vld1_u8(srcImg + (i + 1) * width + j);
            mat1.val[2] = vld1_u8(srcImg + (i + 2) * width + j);
            mat1.val[3] = vld1_u8(srcImg + (i + 3) * width + j);// 4*vec8
            mat2.val[0] = vld1_u8(srcImg + (i + 4) * width + j);
            mat2.val[1] = vld1_u8(srcImg + (i + 5) * width + j);
            mat2.val[2] = vld1_u8(srcImg + (i + 6) * width + j);
            mat2.val[3] = vld1_u8(srcImg + (i + 7) * width + j);
            uint8x8x2_t temp1, temp2, temp3, temp4;
            temp1 = vtrn_u8(mat1.val[1], mat1.val[0]);
            temp2 = vtrn_u8(mat1.val[3], mat1.val[2]);
            temp3 = vtrn_u8(mat2.val[1], mat2.val[0]);
            temp4 = vtrn_u8(mat2.val[3], mat2.val[2]);
            // ==============================================
            uint16x4x2_t temp5, temp6, temp7, temp8;
            temp5.val[0] = vreinterpret_u16_u8(temp1.val[0]);
            temp5.val[1] = vreinterpret_u16_u8(temp1.val[1]);
            temp6.val[0] = vreinterpret_u16_u8(temp2.val[0]);
            temp6.val[1] = vreinterpret_u16_u8(temp2.val[1]);
            temp7.val[0] = vreinterpret_u16_u8(temp3.val[0]);
            temp7.val[1] = vreinterpret_u16_u8(temp3.val[1]);
            temp8.val[0] = vreinterpret_u16_u8(temp4.val[0]);
            temp8.val[1] = vreinterpret_u16_u8(temp4.val[1]);
            uint16x4x2_t temp9, temp10, temp11, temp12;
            temp9 = vtrn_u16(temp6.val[0], temp5.val[0]);
            temp10 = vtrn_u16(temp6.val[1], temp5.val[1]);
            temp11 = vtrn_u16(temp8.val[0], temp7.val[0]);
            temp12 = vtrn_u16(temp8.val[1], temp7.val[1]);
            // ==============================================
            uint32x2x2_t temp13, temp14, temp15, temp16;
            temp13.val[0]= vreinterpret_u32_u16(temp9.val[0]);
            temp13.val[1]= vreinterpret_u32_u16(temp9.val[1]);
            temp14.val[0]= vreinterpret_u32_u16(temp10.val[0]);
            temp14.val[1]= vreinterpret_u32_u16(temp10.val[1]);
            temp15.val[0]= vreinterpret_u32_u16(temp11.val[0]);
            temp15.val[1]= vreinterpret_u32_u16(temp11.val[1]);
            temp16.val[0]= vreinterpret_u32_u16(temp12.val[0]);
            temp16.val[1]= vreinterpret_u32_u16(temp12.val[1]);
            uint32x2x2_t temp17, temp18, temp19, temp20;
            temp17=vtrn_u32(temp15.val[0],temp13.val[0]);
            temp18=vtrn_u32(temp15.val[1],temp13.val[1]);
            temp19=vtrn_u32(temp16.val[0],temp14.val[0]);
            temp20=vtrn_u32(temp16.val[1],temp14.val[1]);
            // ==============================================
            temp1.val[0]= vreinterpret_u8_u32(temp17.val[0]);
            temp1.val[1]= vreinterpret_u8_u32(temp19.val[0]);
            temp2.val[0]= vreinterpret_u8_u32(temp18.val[0]);
            temp2.val[1]= vreinterpret_u8_u32(temp20.val[0]);
            temp3.val[0]= vreinterpret_u8_u32(temp17.val[1]);
            temp3.val[1]= vreinterpret_u8_u32(temp19.val[1]);
            temp4.val[0]= vreinterpret_u8_u32(temp18.val[1]);
            temp4.val[1]= vreinterpret_u8_u32(temp20.val[1]);
            vst1_u8 (dstImg + j * height + i, temp1.val[0]);
            vst1_u8 (dstImg+ (j+1) * height + i, temp1.val[1]);
            vst1_u8 (dstImg+ (j+2) * height + i, temp2.val[0]);
            vst1_u8 (dstImg+ (j+3) * height + i, temp2.val[1]);
            vst1_u8 (dstImg+ (j+4) * height + i, temp3.val[0]);
            vst1_u8 (dstImg+ (j+5) * height + i, temp3.val[1]);
            vst1_u8 (dstImg+ (j+6) * height + i, temp4.val[0]);
            vst1_u8 (dstImg+ (j+7) * height + i, temp4.val[1]);

以 256*256的矩阵为例(矩阵太小的话,neon 版本还不如 cpu 编译器自动优化的版本),得到以下测试结果

image.png

可见,性能优化了 40.9% 左右

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