TECH 으로 돌아가기
TECH HACKER NEWS 7분 읽기 37 READS

2달러 마이크로컨트롤러로 실시간 컴퓨터 비전을: ESP32-S3의 숨은 SIMD 활용기

저렴한 마이크로컨트롤러에서 컴퓨터 비전을 실시간으로 돌린다는 것은 오랫동안 쉽지 않은 과제였다. 한 개발자가 2달러짜리 ESP32-S3에 내장된 128비트 SIMD 명령어를 활용해 FAST 특징점 검출기를 가속한 사례는, 저가 칩의 숨은 성능을 어디까지 끌어낼 수 있는지 보여주는 흥미로운 실험이다. 그는 QVGA(320x240) 한 프레임을 약 6밀리초에 처리하는 구현을 만들어냈고, 참조 구현 대비 약 두 배의 처리량을 달성했다고 밝혔다.

ESP32-S3는 최대 240MHz로 동작하는 듀얼코어 CPU에 와이파이와 블루투스 저전력(BLE) 무선을 품은, 가격 대비 사양이 상당히 좋은 칩이다. 그런데 기술 참조 매뉴얼을 들여다보던 개발자는 이 칩이 제한적이나마 SIMD 명령어 집합을 지원한다는 사실을 발견했다. 커피 한 잔보다 싼 실리콘에 벡터 연산 기능이 들어 있다는 점은 분명 눈길을 끈다. 다만 이 명령어들은 비밀이라기보다는 그저 잘 알려지지 않은 쪽에 가까웠고, 참고할 만한 예제 코드는 전체를 통틀어 세 곳뿐이었다고 한다.

FAST 검출기를 벡터화하기

FAST(Features from Accelerated Segment Test)는 이미지에서 코너를 찾아내는 고전적인 알고리즘이다. 이 구현의 핵심은 사전 검사(pre-test) 단계에 있다. 중심 픽셀을 기준으로 상하좌우 네 방향의 픽셀을 샘플링해, 중심과의 절대 차이가 특정 임계값을 넘는 '극단적' 픽셀이 최소 세 개 이상인지 확인하는 방식이다. 개발자는 벡터 레지스터 하나에 8비트 값 열여섯 개를 담을 수 있다는 점에 착안해, 한 번에 픽셀 열여섯 개의 극단값 개수를 계산하는 함수를 설계했다. 네 방향 각각에서 네 개씩의 '청크'를 샘플링해 중심 픽셀과 비교하는 구조다.

문제는 ESP32-S3의 명령어 집합이 지닌 독특한 제약에서 시작됐다. 첫째, 이 ISA는 정렬되지 않은(misaligned) 메모리 읽기를 직접 허용하지 않는다. 중심 픽셀 블록이 정렬되어 있다고 가정하면 동쪽과 서쪽 블록은 필연적으로 정렬이 어긋난다. 다행히 칩에는 두 레지스터를 이어 붙여 그중 일부 구간을 잘라내 다른 레지스터로 추출하는 명령어가 있었다. 개발자는 중심 블록에 인접한 두 블록을 읽어 슬라이스를 뽑아내는 방식으로 동서 블록을 확보했다.

명령어 집합의 벽을 우회하는 비트 트릭

두 번째 벽은 비교 연산이었다. ESP32-S3는 부호 있는(signed) 8비트 정수에 대한 비교만 구현하고 있는데, 픽셀 데이터는 모두 부호 없는(unsigned) 8비트로 저장되어 있었다. 그냥 unsigned를 signed로 재해석하면 [128, 255] 구간이 [-128, -1]로 비선형 매핑되면서 모든 비교가 깨진다. 결국 값의 범위를 [0, 255]에서 [-128, 127]로 옮겨야 했는데, 여기서 또 다른 제약이 발목을 잡았다. 이 칩의 SIMD 산술 연산은 모두 포화(saturating) 연산이라, 단순히 128을 빼려 하면 127을 넘는 값이 올바르게 언더플로되지 않고 -128에 그대로 클램핑되어 버린다.

해법은 산술이 아닌 비트 연산에 있었다. 8비트 숫자의 최상위 비트가 갖는 자릿값은 -128이다. 따라서 어떤 수에서 128을 빼는 것은 곧 -128을 더하는 것과 같고, 이는 최상위 비트 하나만 뒤집으면 되는 일이다. 즉 x - 128은 x를 0x80과 XOR하는 연산(x ^ 0x80)과 정확히 동일하다. 이후로는 unsigned 8비트 값을 불러올 때마다 0x80과 XOR해 산술과 비교가 다시 의미를 갖는 선형 범위로 변환하도록 했다. 이 두 가지 트릭—인접 레지스터 슬라이스 추출과 최상위 비트 플립—으로 개발자는 칩의 한계를 돌아 SIMD 가속 사전 검사를 완성했고, 비슷한 방식으로 점수 계산 함수도 벡터화했다.

실무자에게 주는 의미와 한계

결과적으로 FAST 검출기의 처리량은 약 220%, 즉 초당 5.1메가픽셀에서 11.2메가픽셀로 향상됐다. 개발자는 이 수준이 실시간 컴퓨터 비전 작업에 충분하며, ESP32-S3가 30fps VGA 스트림을 무리 없이 처리할 수 있는 성능이라고 평가한다. 저가 임베디드 환경에서 클라우드로 영상을 보내지 않고 기기 자체(온디바이스)에서 특징점 검출까지 끝낼 수 있다는 것은, 지연과 대역폭, 프라이버시 측면에서 모두 실용적 가치가 있다.

다만 이 작업이 그려 보이는 현실적 난이도도 함께 봐야 한다. 개발자는 과정에서 ESP32-S3 어셈블리의 기초를 익히고 칩의 기벽을 우회했으며, 결국 basm이라는 자신만의 기본 레지스터 할당기까지 직접 작성해야 했다. 비교 연산의 부호 제약이나 포화 산술처럼, 공식 문서에 잘 드러나지 않고 예제도 희박한 제약들을 하나하나 실험으로 더듬어 가야 하는 영역이라는 뜻이다. 결국 이 사례의 교훈은 단순한 성능 수치보다, 저가 하드웨어의 데이터시트 깊숙한 곳에 아직 쓰이지 않은 여력이 남아 있다는 점과 그것을 끌어내려면 ISA 수준의 집요한 작업이 필요하다는 균형 잡힌 현실에 있다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://shraiwi.com/blog/simd-fast-esp32s3/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...