핵심 요약
- 한 개발자가 커피값 수준인 2달러짜리 마이크로컨트롤러 ESP32-S3에 128비트 SIMD 명령어가 지원된다는 점을 발견하고 FAST 특징점 검출기를 직접 구현했습니다.
- 부호 미지원 및 메모리 비정렬 등 까다로운 칩 한계를 비트 단위 XOR 트릭과 슬라이스 추출 명령어로 우회했습니다.
- 그 결과 기존 대비 처리 성능이 약 220% 향상되어 QVGA 프레임을 약 6ms 만에 처리하는 데 성공했습니다.
요약 커피 한 잔 값도 안 되는 2달러짜리 마이크로컨트롤러 'ESP32-S3'에서 고성능 컴퓨터 비전 알고리즘을 구현해 낸 개발자의 삽질기가 화제입니다. ESP32-S3는 최대 240MHz로 동작하는 듀얼코어 CPU와 Wi-Fi, 블루투스 기능을 갖춘 가성비 칩으로 잘 알려져 있는데, 작성자는 기술 문서(레퍼런스 매뉴얼)를 파고들다 이 저가 칩셋에 128비트 SIMD(단일 명령 다중 데이터) 명령어가 숨어 있다는 사실을 발견했습니다.
작성자는 이 SIMD 명령어를 활용해 영상 내 모서리를 빠르게 감지하는 'FAST 특징점 검출 알고리즘'을 어셈블리어로 직접 구현하기로 마음먹었습니다. 하지만 실제 개발 과정은 제약의 연속이었습니다. 첫 번째 문제는 메모리 정렬 제한으로, 비정렬 메모리를 곧바로 읽어올 수 없었습니다. 이에 두 개의 레지스터를 연결한 뒤 필요한 슬라이스만 잘라내 추출하는 전용 명령어를 활용해 정렬 문제를 우회했습니다.
더 큰 난관은 픽셀 데이터 연산에서 발생했습니다. 이미지 픽셀은 부호 없는 8비트 정수(uint8, 0~255)로 되어 있는데, ESP32-S3의 SIMD 비교 명령어는 오직 부호 있는 8비트(int8, -128~127) 연산만 지원했던 것입니다. 게다가 산술 연산마저 포화 연산(saturating) 방식으로 설계되어 일반적인 뺄셈을 쓰면 값이 클램핑되는 문제가 발생했습니다. 작성자는 수학적 트릭을 고민한 끝에, 최상위 비트를 뒤집는 XOR 비트 연산(`x ^ 0x80`)을 적용하면 뺄셈 연산 없이도 unsigned 데이터를 완벽히 signed 범위로 선형 변환할 수 있다는 점을 찾아내 문제를 해결했습니다.
이러한 기상천외한 트릭과 최적화를 거친 결과, 기존 레퍼런스 구현 대비 처리 속도가 약 220% 향상(초당 5.1MP에서 11.2MP)되었으며, QVGA(320x240) 해상도 프레임을 처리하는 데 불과 6ms밖에 걸리지 않는 놀라운 성능을 달성했습니다. 저가 하드웨어의 숨겨진 잠재력을 극한까지 끌어낸 긱(geek)다운 최적화 사례입니다.
Sponsored · 광고