IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 利用ARM的高级SIMD NEON特性 -> 正文阅读

[嵌入式]利用ARM的高级SIMD NEON特性

一个向量化的编译器可以通过高效的使用NEON硬件单元来并行化C/C++代码。C语言没有指定并行行为的语法,但可以给编译器提供各种暗示。

对于指针变量可以在定义时加上 "__restrict" 关键字,但得保证它指向的这片内存区域不能由外部任何指针来引用和修改(This has the effect of guaranteeing that pointers will not address overlapping regions of memory)。

循环次数明确为4或者8的倍数,也会被编译器利用进行优化。

当编译代码时,加上选项? -O1 -ftree-vectorize -mfpu=neon。

示例代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
	int arr[8] = {1,2,3,4,5,6,7,8};
	for(int i = 0; i < 8; i++) {
		arr[i] *= 3;
	}
	for(int i = 0; i < 8; i++) {
		printf("%d\n", arr[i]);
	}
	return 0;
}

反汇编(V开头的指令即NEON指令):

00010408 <main>:
   10408:	e92d4070 	push	{r4, r5, r6, lr}
   1040c:	e24dd020 	sub	sp, sp, #32
   10410:	e1a0c00d 	mov	ip, sp
   10414:	e59fe05c 	ldr	lr, [pc, #92]	; 10478 <main+0x70>
   10418:	e8be000f 	ldm	lr!, {r0, r1, r2, r3}
   1041c:	e8ac000f 	stmia	ip!, {r0, r1, r2, r3}
   10420:	e89e000f 	ldm	lr, {r0, r1, r2, r3}
   10424:	e88c000f 	stm	ip, {r0, r1, r2, r3}
   10428:	f2c04053 	vmov.i32	q10, #3	; 0x00000003
   1042c:	f46d2adf 	vld1.64	{d18-d19}, [sp :64]
   10430:	f26229f4 	vmul.i32	q9, q9, q10
   10434:	f44d2adf 	vst1.64	{d18-d19}, [sp :64]
   10438:	eddd0b04 	vldr	d16, [sp, #16]
   1043c:	eddd1b06 	vldr	d17, [sp, #24]
   10440:	f26009f4 	vmul.i32	q8, q8, q10
   10444:	edcd0b04 	vstr	d16, [sp, #16]
   10448:	edcd1b06 	vstr	d17, [sp, #24]
   1044c:	e1a0400d 	mov	r4, sp
   10450:	e28d6020 	add	r6, sp, #32
   10454:	e59f5020 	ldr	r5, [pc, #32]	; 1047c <main+0x74>
   10458:	e4941004 	ldr	r1, [r4], #4
   1045c:	e1a00005 	mov	r0, r5
   10460:	ebffffa0 	bl	102e8 <printf@plt>
   10464:	e1560004 	cmp	r6, r4
   10468:	1afffffa 	bne	10458 <main+0x50>
   1046c:	e3a00000 	mov	r0, #0
   10470:	e28dd020 	add	sp, sp, #32
   10474:	e8bd8070 	pop	{r4, r5, r6, pc}
   10478:	000104f0 	.word	0x000104f0
   1047c:	00010510 	.word	0x00010510

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-06 15:25:34  更:2021-12-06 15:26:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 12:33:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码