İçeriğe geç
edumintsBlog
Yazılım3 dk okuma

2 Dolarlık Bir Mikrodenetleyicide SIMD Hızlandırmalı Bilgisayarlı Görü

Kaynak: Hacker News

Paylaş
YazılımEdumints Blog
İçindekiler 4 başlık

Giriş ve ESP32-S3'ün Donanım Gücü#

ESP32-S3 için 128-bit SIMD (Single Instruction, Multiple Data) komutlarını kullanan hızlandırılmış bir FAST özellik dedektörü (feature detector) geliştirildi. Bu uygulama, referans uygulamaya kıyasla yaklaşık iki kat performans artışına ulaşarak bir QVGA (320x240) kareyi yaklaşık ~6 ms içinde işleyebiliyor.

Fiyatına göre ESP32-S3, mütevazı plastik paketinin altında WiFi ve Bluetooth Low Energy radyoları dahil birçok çevre birimiyle birlikte maksimum 240 MHz hızında çalışan çift çekirdekli bir işlemci barındıran oldukça güçlü bir mikrodenetleyicidir. Teknik referans kılavuzu incelendiğinde, ortalama bir kahveden daha ucuz olan bu yonganın sınırlı bir SIMD komut setini desteklediği görülüyor. Bu süreçte, ESP32-S3 üzerinde assembly temellerini öğrenmek, kendine özgü kısıtlamalarının etrafından dolaşmak ve basm adlı temel bir yazmaç ayırıcı (register allocator) yazmak mümkün oldu.

Kaynak Araştırması ve Assembly Yapısı#

Bu komutlar aslında gizli olmasa da nispeten az biliniyordu. Bilgisayarlı görü alanındaki çalışmalarla birlikte, internette bulunanlardan daha gelişmiş bir kod yazmak amacıyla ESP32-S3 için SIMD hızlandırmalı bir FAST köşe dedektörü uygulanmasına karar verildi. İlk adımda SIMD komutlarını kullanan örnek kodlar araştırıldığında yalnızca üç kaynak bulunabildi:

  • Larry Bank’in blogu: Özelliği keşfettiği ve minimal bir örnek sunduğu yazı.
  • Espressif’in esp-dsp kütüphanesi: Evrişim (convolution) ve FFT gibi DSP benzeri özellikler için kullanılan kütüphane.
  • Espressif’in esp-dl kütüphanesi: Yonga üzerinde yapay zeka hızlandırması için kullanılan kütüphane.

Bu kaynaklar incelendiğinde ESP32-S3 üzerinde assembly yazmanın korkulduğu kadar zor olmadığı görüldü ve iki sayıyı toplayan basit bir fonksiyon üzerinden aşağıdaki genel yapı benimsendi:

.section .rodata
# salt okunur veriler buraya
.section .text
.align 4
.global add
.type add,@function
# iki sayıyı toplayan basit bir fonksiyon
# int32_t add(int32_t a, int32_t b)
add:
    entry sp, 48 # sp (stack pointer) a1 için bir takma addır
    #define r_a a2
    #define r_b a3
    # kod buraya
    add a2, r_a, r_b # a2 = a + b
    retw.n # dönüş değerini içeren a2 ile geri dön.

FAST Köşe Ön Testi ve Bellek Hizalama Kısıtlamaları#

Bu temel yapıdan yola çıkarak FAST köşe ön testinin SIMD hızlandırmalı sürümü yazılmaya başlandı. Algoritma temel olarak her ana yönden bir piksel örnekler ve en az üç "uç" (extreme) piksel olup olmadığını kontrol eder. Buradaki uç piksel, merkez pikselden mutlak farkı belirli bir eşik değerinin üzerinde olan pikseldir. Her vektör yazmacı on altı adet sekiz bitlik değer depolayabildiği için, tek seferde on altı pikselin uç değer sayısını hesaplayan bir fonksiyon tasarlandı. Bu işlem, her ana yönde dört piksel "yığınını" (chunk) örnekleyip kendi merkez pikselleriyle karşılaştırarak gerçekleştirilir.

Ancak burada ilk donanım kısıtlamasıyla karşılaşıldı: ISA (Komut Kümesi Mimarisi), doğrudan hizalanmamış okumalara (misaligned reads) izin vermiyordu. Merkez pikselin hizalı olduğu varsayımı altında, doğu ve batı blokları hizalanmamış durumda kalıyordu:

  • center (merkez)
  • east (doğu)
  • west (batı)
  • north (kuzey)
  • south (güney)

Neyse ki yonga, uç uca eklenmiş iki yazmaçtan bir dilimi (slice) başka bir yazmaca çıkarmaya olanak tanıyan özel bir komuta sahiptir. Bu işlevsellik kullanılarak, merkez bloğa bitişik iki blok okunup dilimler çıkarıldı ve böylece doğu ile batı blokları başarıyla elde edildi.

Yazılım Geliştirme ve Öğrenme Çıkarımları#

Gömülü sistemlerde ve düşük maliyetli donanımlarda yüksek performanslı yazılım geliştirmek için bu çalışmadan çıkarılabilecek pratik dersler şunlardır:

  • Teknik Belgeleri Derinlemesine İnceleyin: Resmi referans kılavuzlarını okumak, yaygın olarak bilinmeyen ancak performansı ikiye katlayabilecek donanım özelliklerini (SIMD gibi) keşfetmenizi sağlar.
  • Mevcut Açık Kaynak Kodlardan Öğrenin: Dokümantasyonun yetersiz kaldığı noktalarda üreticinin resmi kütüphaneleri (esp-dsp, esp-dl) en iyi öğrenme ve mimari referans kaynaklarıdır.
  • Donanım Kısıtlamalarını Yazılımla Aşın: Bellek hizalama (alignment) gibi mimari engellerle karşılaştığınızda, yazmaç birleştirme ve dilimleme gibi alternatif komut seti yeteneklerini kullanarak veriyi doğru формаta getirebilirsiniz.

Orijinal makaleye buradan ulaşabilirsiniz.

Kaynak ve atıf

Bu yazı, Hacker News üzerinde yayımlanan içerikten yararlanılarak Edumints tarafından yapay zekâ desteğiyle Türkçe hazırlandı. Ayrıntılar ve yazarların kendi anlatımı için orijinaline bakabilirsin:

  • shraiwi.com/blog/simd-fast-esp32s3