AI宝库

AI宝库首页 › AI 资讯 › 2美元微控制器上的SIMD加速计算机视觉

2美元微控制器上的SIMD加速计算机视觉

来源:Hacker News · 发布时间:10-26 · 由 AI宝库每小时自动聚合

文章 URL:https://shraiwi.com/blog/simd-fast-esp32s3/ 评论 URL:https://news.ycombinator.com/items?id=50236681 要点:65# 评论:15

2美元微控制器上的SIMD加速计算机视觉

我为ESP32-S3写了加速FAST特性探测器,利用了它的128位SIMD指令。 它大约实现参考执行的性能的两倍,并需要约~6ms来处理一个QVGA(320x240)帧。 您可以在这里找到源代码。

就其价格而言,ESP32-S3是微控制器的动力所。 在其不假定的塑料包中,有一个最多240MHz的双核心CPU,其外围部分包括WiFi和蓝牙低能无线电。 在挖掘其技术参考手册时,我发现芯片支持一套有限的SIMD指令。 对于比普通咖啡便宜的硅来说,这很酷。 让我们看看我们能用它做什么令人兴奋的事吧!

在撰写SIMD加速的FAST角探测器的过程中,我在ESP32-S3上学习了组装的基本原理,围绕其古怪的局限性而工作,最终写出我自己的基本收存器,活塞。

我意识到这些指示并非完全秘密,我想用他们自己做实验写出比我在网上找到的更先进的代码由于我最近对计算机视觉非常感兴趣,我决定为ESP32-S3编写SIMD加速执行FAST特性探测器。

我开始寻找使用SIMD指令的代码在编写本报告时,我只能找到三个来源:

- Larry Bank的博客

- Espressif的esp-dsp库,用于DSP-sque特性(进取、FFT等)

- Espressif的esp-dl库,用于芯片AI加速。

我感到很欣慰地发现ESP32-S3上的组装并没那么糟糕。 我决定这个总体结构:

.c节.rodata

# 这里只读数据

. 节。文本

对齐 4

. 全球添加

. 类型添加,@ 函数

# 一个简单的函数,新增两个数字

# int32 t 添加( int32 t a, int32 t b)

添加:

条目 sp, 48 # sp (stack 指针) 是 a1 的别名

# 定义 r a 2

# 定义 r b a3

# 这里的代码

添加 a2, r a, r b # a2 = a +b

retw.n # 返回,其中a2包含返回值。

从那里开始,我开始写一个SIMD加速版的FAST角预测试。 基本上,它在每个主方向取样一个像素,如果至少有三个“极端”像素,则检查。 在这种情况下,一个极端像素就是其与中像素的绝对相差在一定阈值上。

我决定了一个函数,可以计算一次十六像素的极限数,因为每个矢量寄存器可以存储十六个八位值。 这将通过取样每个主要方向的4个像素的“圆通”并把它们与各自的中像素作比较来实现。

但这是我遇到的第一个限制,在中像素对齐的假设下,东西两块会错相:

幸好芯片有指示,可以将一分两个相接的收发机提取入另一个收发机。 利用这个功能,我能够通过阅读和取出与中区相邻的两个区块的切片来取出东西两块。

好吧,现在我有像素数据。 是时候做一些比较了吧?错。 结果ESP32-S3只执行签名的八位数的比较。 这使得处理更加困难,因为我所有的像素数据都被存储为未签名的8位数字。 如果你只是把未签名的数据重新解释为签名数据,你会得到一些奇怪的结果:

np.int8(np.uint8(范围(0,256,8)))).

数组([0、8、16、24、32、40、48、56、64、72、80]

88, 96, 104, 112, 120, -128, -120, -112, -104, -96, -88,

-80, -72, -64, -56, -48, -40, -32, -24, -16, -8],

d类型=int8)

范围[128-255]得到非线性地映射到[-128-1],打破了所有比较操作。 为了做到这一点,我需要把数值范围从[0,255]转移到[-128,127]. 这应该是一个简单的减法,但指令集再次受阻:在ESP32-S3上,所有SIMD的算术操作都是饱和的,这意味着所有超过127的像素值最终都会被夹在-128,为了克服这个问题,我不得不在不使用减法指示的情况下,从每个数字平行地减去128个。 对我来说,这起初似乎是一项艰巨的任务,但最终我找到了解决办法。

让我们假设x是小品。 以下是它的位数值:

-128 64 32 16 8 4 2 1

发现什么有趣的事了吗?减法与-128的加法相同,因此计算出x-128,我们只要在x的最显要数字中再加一到一到一到一到一二八,就可以"递增"数字。 我们可以通过翻出x的最高位来计算这个。 由于用一个来擦去任意一分,与取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取因此,x-128 == ^ 0x80.

现在,当未签名的八位值被加载时,它们会被用 0x80 的 XOR'd 转换成一个适当的(线性)范围,使算术和比较再次有意义。

有了这两个把戏,我能够绕过ESP32-S3的限制,并写出SIMD加速的FAST角预测试。 我也用类似的操作来写一个SIMD加速评分功能

最终,我得以将FAST特性探测器的吞吐量提高约220%,从5.1MP/s到11.2MP/s在我的测试中。 这完全在实时计算机视觉任务的可接受性能范围内,使得ESP32-S3能够轻松地处理出30fps VGA流。 两块还不错!

本文由 AI宝库自动抓取并翻译,版权归原作者所有;如需查看原文请点下方链接。

相关 AI 工具

相关免费羊毛

同源资讯

阅读原文(shraiwi.com)

标题、摘要与正文均来自该信源的公开页面,版权归原作者所有;本站自动聚合与翻译,仅作出处跳转。

← 返回 AI 资讯列表AI工具图鉴首页

返回 AI宝库首页 · 提交工具 · 商务合作 · 关于本站 · 590 款 AI 工具分类导航 · 每日 AI 热门项目与动态