两美元 MCU 上的 SIMD:ESP32-S3 把 FAST 角点检测提速约一倍

ESP32-S3 卖得便宜,里头却有一组相对少人深挖的 128 位 SIMD 指令。开发者 shraiwi 在博客里写了自己用这套指令重做 FAST 特征检测的过程:QVGA(320×240)一帧大约 6 毫秒,相对参考实现大约翻倍,峰值吞吐从约 5.1MP/s 提到约 11.2MP/s,够支撑实时视觉里「能跟上 30fps VGA」的量级。源码一并公开。

为什么选 FAST,难点在哪

作者先翻过 Larry Bank 的示例、乐鑫 esp-dsp 和 esp-dl,确认汇编并不算玄学,然后选定计算机视觉里常见的 FAST 角点预检测:在中心像素上下左右各采样,看有没有足够多的「极端像素」(与中心差超过阈值)。向量寄存器一次能塞 16 个 8 位值,于是按「一次算 16 个中心点」来设计。

硬件立刻甩出两道坑。一是指令集不允许直接做错位读取,而东西两侧像素块相对中心往往是错位的,只能靠「拼两个寄存器再切片」的指令抠出东西块。二是比较指令只支持有符号 8 位,像素却是无符号 0—255;若直接当有符号解释,128—255 会拧成 -128—-1,比较全乱。

绕开饱和运算的小技巧

本来想减 128 把无符号映射到有符号区间,但 ESP32-S3 的 SIMD 算术是饱和的:大于 127 的值一减会被钳死,而不是绕回。作者最后用位运算代替减法:对每个字节异或 0x80,等价于翻转最高位,也就是无符号意义上的「减 128」,再去做后续比较和极值计数。评分函数也按类似套路做了 SIMD 版。

过程中他还顺手写了个很基础的寄存器分配器 basm,方便自己堆汇编。文章重点不在「教你抄指令」,而在说明:两美元级芯片上的 SIMD 不是营销口号,真能把边缘侧特征检测推到可用帧率,但也得正视错位访问、有符号比较和饱和运算这些 ISA 细节。

说明:性能数字来自作者自测环境,不同板卡、编译选项和图像内容会有差异;具体实现以公开源码为准。

来源

[1] SIMD-accelerated computer vision on a $2 microcontroller — shraiwi,约2026年10月。

#ESP32-S3 #SIMD #FAST角点 #嵌入式视觉 #边缘计算

排序方式 :

成为第一条评论!

Nobody's responded to this post yet. Add your thoughts and get the conversation going.