ESP32-S3 128비트 SIMD로 FAST 코너 검출기 구현, QVGA 프레임당 약 6ms
- ESP32-S3의 128비트 SIMD 명령으로 FAST 코너 검출기를 어셈블리로 직접 작성, 참조 구현 대비 약 2배 빨라졌고 QVGA(320x240) 프레임 한 장을 약 6ms에 처리함
- ISA가 비정렬 읽기를 허용하지 않아, 중심 블록에 인접한 두 레지스터를 이어 붙여 슬라이스를 뽑는 명령으로 east/west 블록을 처리함
- SIMD 비교가 부호 있는 8비트만 지원하고 모든 산술이 포화 연산이라, 픽셀 범위를 [0,255]에서 [-128,127]로 옮길 때 128을 빼는 대신 최상위 비트를 0b10000000 마스크로 XOR하는 방법을 씀
- 어셈블리를 손으로 쓰면서 basm이라는 자체 레지스터 할당기를 만들었고, 참고할 만한 SIMD 예제는 Larry Bank 블로그와 Espressif의 esp-dsp, esp-dl 세 곳뿐이었음
- 댓글에서는 5.1MP/s에서 11.2MP/s로의 향상이 220% 증가가 아니라 120% 증가, 즉 2.2배라는 지적이 나옴
Hacker News 의견들
가격 생각하면 ESP32-S3가 진짜 괴물이지. 링크에 있는 암스트라드 PC1512보다 성능이 좋다는 게 웃김.
그게 바로 내 첫 컴퓨터였음. CGA 그래픽에 GEM 데스크톱, 로코모티브 베이직까지 있었음. 소프트웨어가 360KB 디스켓 4장에 다 들어갔고 디스켓마다 색이 다 달랐어.
글에 5.1MP/s에서 11.2MP/s로 늘었다는데 그건 220% 증가가 아니라 120% 증가임. 2.2배 빠른 거지 220% 빠른 게 아님.
거기에 한 술 더 떠서 '2.2배 더 빠르다'는 표현 자체가 어색함. '2.2배 속도' 또는 '2.2배 빠름'이 맞고, x배 faster라고 쓰면 헷갈리기만 함.
ESP32-S3 SIMD는 다루기가 정말 까다로움.
요즘은 그냥 LLM에 맡기면 되지 않나.
x86 SIMD보다는 오히려 쉽다고 느꼈음. 다만 32비트 벡터 연산이 아예 없어서 그건 짜증남. x86은 자동 SIMD 도구가 워낙 좋아서 고생을 안 했을 뿐임.
알리익스프레스에서 ESP32-S3-Zero 완제품 보드가 $5.33임. 칩에 세라믹 안테나, USB 커넥터, LED까지 붙어서. ESP32-C3-Zero는 $2.80이고. USB만 꽂으면 바로 되니까 쓰기도 편함.
직접 PCB 뜨기 시작하면 BK7238이 $0.81이라는 걸 알게 될 거임.
mitchellh가 쓴 SIMD 글도 읽어볼 만함.
이게 지금은 그냥 일반 명령어인데 왜 아직 SIMD 가속이라고 부르는지 모르겠음. 알고리즘 구조만 조금 바꾸면 되는 거 아님?
여러 데이터 원소를 한 번에 처리하는 명령어를 써서 소프트웨어를 3배 빠르게 만들었으면 그게 SIMD 가속 아님?
엔지니어링은 대단한데 결과가 얼마나 쓸모 있는지는 모르겠음. 실시간으로 뭘 어느 해상도까지 검출하는지 결과 이미지라도 있었으면 이해가 빨랐을 텐데.
재밌는 건 S3가 RISC-V가 아니라 XTensa LX를 쓴다는 점이라, 새 ESP32 칩들은 SIMD를 어떻게 처리하는지 찾아봤음. P4와 S31에 프로세서 확장 형태로 제한적으로 들어가 있음.
CH32V407/CH32V467은 두 달 전에 개당 $2.4 정도로 조금 비싸지만 RISC-V 벡터 확장 임베디드 서브셋을 지원함. 64비트 SIMD 폭에 FP는 빠졌어도 LMUL까지 있어서 활용도는 훨씬 좋을 듯.