Skip to content

성능 프로파일링 — DSP 가속 및 리소스 예산

Xylolabs API — 종합 성능 분석 개정: 2026-03-23

이 문서는 영문 Performance Profile의 한국어 번역이다.


1. DSP 가속 매트릭스

각 플랫폼의 DSP 기능이 코덱 성능을 결정한다. 속도 향상 비율은 순수 C 기준 구현 대비 측정값이다.

플랫폼 코어 클럭 DSP 확장 FPU XAP 속도 향상 ADPCM 속도 향상
RP2350 (Pico 2) Cortex-M33 150 MHz ARMv8-M DSP (SMLAD, SMLAL, QADD, SSAT) 단정밀도 ~30% (80->56 MIPS) ~50%
RP2040 (Pico) Cortex-M0+ 133 MHz 없음 없음 N/A (실행 불가) 최소
ESP32-S3 2x Xtensa LX7 240 MHz 128비트 SIMD (PIE): 4x f32, 8x i16 벡터 단정밀도 ~60% ~40%
ESP32-C3 RISC-V RV32IMC 160 MHz M 확장 (곱셈만) 없음 미미 최소
STM32F411 Cortex-M4F 100 MHz FPU + DSP: SMLAD, 배럴 시프터 단정밀도 ~40% (부동소수점 경로) ~30%
STM32F103 Cortex-M3 72 MHz 없음 없음 N/A (실행 불가) 최소
STM32WB55 Cortex-M4F 64 MHz FPU + DSP (F411과 동일) 단정밀도 ~40% ~30%
nRF52840 Cortex-M4F 64 MHz FPU + DSP (F411과 동일) 단정밀도 ~30-40% ~30%
nRF9160 Cortex-M33 64 MHz ARMv8-M DSP (RP2350과 동일) 단정밀도 ~30% ~50%

DSP 명령어 요약

ARMv8-M DSP (Cortex-M33: RP2350, nRF9160, STM32U585): - SMLAL / UMLAL -- 단일 사이클 32x32->64 MAC, FIR 및 MDCT 누적 연산용 - SMLAD / SMUAD -- 이중 16x16->32 MAC, 16비트 오디오 경로의 처리량 2배 향상 - QADD / QSUB / SSAT / USAT -- 포화 연산, 분기 기반 클리핑 제거 - SBFX / UBFX -- 비트 필드 추출, XMBP 바이너리 프로토콜 파싱용

Cortex-M4F DSP (STM32F411, STM32WB55, nRF52840): - 위의 ARMv8-M DSP 명령어 전부 포함, 추가로: - 단정밀도 FPU -- 하드웨어 부동소수점 곱셈-누적 1-3 사이클 - SDIV / UDIV -- 하드웨어 정수 나눗셈 2-12 사이클

Xtensa PIE (ESP32-S3): - 128비트 SIMD -- 명령어당 4x f32 또는 8x i16 처리 - 16 x 128비트 전용 벡터 레지스터 - 하드웨어 AES/SHA로 TLS 부하를 CPU에서 분리 - PSRAM DMA로 대용량 오디오 버퍼 전송


2. 타겟별 성능 예산

RP2350 (Pico 2) — 4ch XAP @96kHz

단일 코어 예산 (코어 0: 코덱, 코어 1: I/O):

구성 요소               | MIPS (기준)     | MIPS (DSP 적용)  | 150MHz 대비 %
-----------------------|-----------------|-----------------|------------
I2S DMA 처리            |        2        |        2        |    1.3%
XAP MDCT 순방향          |       50        |       35        |   23.3%
XAP 양자화+패킹           |       15        |       10        |    6.7%
XMBP 배치 인코딩          |        5        |        5        |    3.3%
HTTP 전송               |       10        |       10        |    6.7%
센서 샘플링 (26ch)        |        5        |        5        |    3.3%
워치독 + 관리             |        2        |        2        |    1.3%
-----------------------|-----------------|-----------------|------------
합계                    |       89        |       69        |   46.0%
가용 여유분              |       61        |       81        |   54.0%

듀얼 코어 분할: 코어 0은 I2S DMA + XAP 인코딩 처리 (~37 MIPS DSP 적용, 24.7%). 코어 1은 XMBP, HTTP, 센서 처리 (~22 MIPS, 14.7%). 전체 시스템 사용률: ~39.3%.

ESP32-S3 — 4ch XAP @96kHz

듀얼 코어 예산 (480 MIPS 합계):

구성 요소               | MIPS (기준)     | MIPS (PIE 적용)  | 480MHz 대비 %
-----------------------|-----------------|-----------------|------------
I2S DMA 처리            |        2        |        2        |    0.4%
XAP MDCT 순방향          |       50        |       20        |    4.2%
XAP 양자화+패킹           |       15        |        6        |    1.3%
WiFi 스택 (FreeRTOS)     |       30        |       30        |    6.3%
XMBP 배치 인코딩          |        5        |        5        |    1.0%
HTTP/TLS 전송            |       20        |       12        |    2.5%
센서 샘플링 (26ch)        |        5        |        5        |    1.0%
PSRAM DMA 관리           |        3        |        3        |    0.6%
워치독 + 관리             |        2        |        2        |    0.4%
-----------------------|-----------------|-----------------|------------
합계                    |      132        |       85        |   17.7%
가용 여유분              |      348        |      395        |   82.3%

PIE SIMD가 가장 큰 절대 성능 향상을 달성한다. TLS 부하는 하드웨어 AES/SHA 가속으로 감소한다.

STM32F411 — 4ch XAP @48kHz

단일 코어 예산 (100 MIPS):

구성 요소               | MIPS (기준)     | MIPS (DSP 적용)  | 100MHz 대비 %
-----------------------|-----------------|-----------------|------------
I2S DMA 처리            |        2        |        2        |    2.0%
XAP MDCT 순방향          |       25        |       15        |   15.0%
XAP 양자화+패킹           |        8        |        5        |    5.0%
XMBP 배치 인코딩          |        3        |        3        |    3.0%
UART LTE-M1 전송         |        8        |        8        |    8.0%
센서 샘플링 (26ch)        |        5        |        5        |    5.0%
워치독 + 관리             |        2        |        2        |    2.0%
-----------------------|-----------------|-----------------|------------
합계                    |       53        |       40        |   40.0%
가용 여유분              |       47        |       60        |   60.0%

M4F FPU는 XAP 부동소수점 인코더 경로를 활성화하며, 이 코어에서 고정소수점보다 빠르다. CMSIS-DSP arm_rfft_fast_f32는 MDCT를 3-5배 가속한다.

nRF52840 — 2ch XAP @48kHz

단일 코어 예산 (64 MIPS):

구성 요소               | MIPS (기준)     | MIPS (DSP 적용)  | 64MHz 대비 %
-----------------------|-----------------|-----------------|------------
I2S DMA 처리            |        1        |        1        |    1.6%
XAP MDCT 순방향          |       12        |        7        |   10.9%
XAP 양자화+패킹           |        4        |        3        |    4.7%
BLE GATT 스택           |       10        |       10        |   15.6%
XMBP 배치 인코딩          |        2        |        2        |    3.1%
센서 샘플링 (4ch)         |        2        |        2        |    3.1%
워치독 + 관리             |        2        |        2        |    3.1%
-----------------------|-----------------|-----------------|------------
합계                    |       33        |       27        |   42.2%
가용 여유분              |       31        |       37        |   57.8%

BLE 스택 오버헤드가 상당하다. 4ch XAP @48kHz (~28 MIPS DSP 적용, 44% 사용률)는 가능하지만 여유가 적다.

STM32F103 — 센서 전용 + ADPCM 폴백

단일 코어 예산 (72 MIPS, 20 KB SRAM):

구성 요소               | MIPS (기준)     | MIPS (최적화)    | 72MHz 대비 %
-----------------------|-----------------|-----------------|------------
ADPCM 인코딩 2ch @24kHz  |        1        |         1        |    1.4%
XMBP 배치 인코딩          |        2        |         2        |    2.8%
UART LTE-M1 전송         |        8        |         8        |   11.1%
센서 샘플링 (4ch)         |        3        |         3        |    4.2%
워치독 + 관리             |        2        |         2        |    2.8%
-----------------------|-----------------|-----------------|------------
합계                    |       16        |        16        |   22.2%
가용 여유분              |       56        |        56        |   77.8%

DSP 확장 없음. XAP는 실행 불가 (32 KB 인코더 상태가 20 KB 전체 SRAM을 초과). 2ch @24kHz ADPCM이 최대 오디오 역량이다.


3. 타겟별 메모리 예산

모든 값은 KB 단위이다. "SDK 클라이언트"는 XylolabsClient 상태 머신, 세션 상태, 설정을 포함한다.

타겟 전체 SRAM SDK 클라이언트 XAP 인코더 링 버퍼 XMBP HTTP 스택 가용
RP2350 520 KB 12 KB 8 KB 32 KB 16 KB 4 KB 16 KB 432 KB
ESP32-S3 512 KB + 8MB PSRAM 12 KB 8 KB 64 KB (PSRAM) 16 KB 8 KB 16 KB ~8 MB
STM32F411 128 KB 12 KB 8 KB 8 KB 4 KB 4 KB 8 KB 84 KB
STM32U585 786 KB 12 KB 8 KB 32 KB 16 KB 4 KB 16 KB 698 KB
nRF52840 256 KB 12 KB 8 KB 16 KB 8 KB 4 KB 8 KB 200 KB
nRF9160 256 KB 12 KB 8 KB 16 KB 8 KB 4 KB 8 KB 200 KB
STM32WB55 256 KB 12 KB 8 KB 8 KB 4 KB 4 KB 8 KB 212 KB
STM32F103 20 KB 4 KB -- 4 KB 2 KB 2 KB 4 KB 4 KB
RP2040 264 KB 4 KB -- 8 KB 4 KB 4 KB 8 KB 236 KB
ESP32-C3 400 KB 4 KB -- 8 KB 4 KB 4 KB 8 KB 372 KB

참고사항

  • XAP 인코더: XAP 인코더 상태당 8 KB; 표는 4ch 합계(32 KB)를 보여준다. --로 표시된 플랫폼은 XAP를 실행할 수 없다.
  • 링 버퍼: I2S 캡처용 오디오 DMA 이중 버퍼이다. ESP32-S3는 DMA를 통해 PSRAM에 배치한다.
  • 스택: 듀얼 코어 플랫폼(RP2350, ESP32-S3)은 코어당 8 KB를 할당한다.
  • STM32F103: 극도로 제한적이다. 센서 + 2ch ADPCM만 가능하다. 4 KB "가용"은 애플리케이션 로직의 절대 최소 수준이다.

4. API 서버 동시성 프로파일

연결 처리

Xylolabs API 서버는 Axum 기반 Tokio 비동기 런타임으로 구축되었다:

매개변수 참고
런타임 Tokio 멀티스레드 워커 스레드 = CPU 코어 수
DB 풀 20개 연결 (설정 가능) DATABASE_MAX_CONNECTIONS 환경 변수
요청당 메모리 ~1-2 KB (메타데이터) 업로드 본문 제외
업로드 본문 제한 최대 2 GB 전체 파일 버퍼링 (수정 예정)
SSE 연결 무제한 세션별 브로드캐스트 채널
HTTP keep-alive 75초 Axum 기본값

수집 파이프라인 처리량

단계 지연 시간 참고
XMBP 디코딩 <100 us/2kHz 배치 x86-64 서버에서 벤치마크
XAP 프레임 디코딩 ~5 us/프레임 XAP 디코더 (서버 측, 제약 없음)
zstd 압축 ~200 us/청크 spawn_blocking으로 오프로드
S3 쓰기 ~5-20 ms/청크 네트워크 의존, MinIO 로컬 ~2 ms
DB 삽입 ~1-2 ms/레코드 플러시 윈도우 내 배치 처리
플러시 윈도우 10초 (설정 가능) 쓰기 전 샘플 축적

동시 세션 용량

시나리오 세션 수 오디오 스트림 센서 스트림 서버 CPU DB 부하
경량 10 10 x 2ch @16kHz 40 @100Hz <5% 낮음
표준 50 50 x 4ch @48kHz 200 @100Hz ~20% 중간
고부하 100 100 x 4ch @96kHz 2600 @100Hz ~60% 높음
한계 ~200 DB 풀 제한 DB 풀 제한 ~90% 포화

식별된 병목 (성능 리뷰)

문제 심각도 상태 수정
list_uploads의 N+1 태그 쿼리 P1 수정 완료 단일 JOIN 쿼리로 배치 조회
stats_overview의 순차 쿼리 P2 수정 완료 tokio::try_join! 병렬 실행
S3 업로드 시 전체 파일 버퍼링 P1 미완료 스트리밍 멀티파트 업로드
ConfigManager 블로킹 RwLock P2 수정 완료 tokio::sync::RwLock으로 전환
업로드 본문 메모리 버퍼링 P1 미완료 백프레셔 기반 스트리밍 본문
연결 속도 제한 없음 P3 미완료 Tower 속도 제한 미들웨어

5. 번인 테스트 결과

네이티브 플랫폼 (Apple M4)

네이티브 Rust 컴파일로 Apple M4에서 측정 (크로스 컴파일 아님):

지표 참고
XAP 인코딩 (프레임당) 평균 = 9 us 10 ms 프레임 예산 -> 0.09% 사용률
클라이언트 tick (전체 주기) 평균 = 56 us XMBP 인코딩 + 버퍼 관리 포함
MCU 여유율 99.3% 알고리즘 효율성 검증
메모리 (최대 RSS) ~2 MB SDK 클라이언트 + 테스트 하네스
드롭된 프레임 0 모든 시나리오에서

번인 시나리오

시나리오 지속 시간 오디오 구성 센서 장치 수 결과
standard 60초 4ch @16kHz 4 @100Hz 1 통과
stress 120초 4ch @96kHz 26 @100Hz 1 통과
endurance 120초+ 2ch @16kHz 4 @10Hz 1 통과
multi-device 60초 4ch @16kHz 4 @100Hz 10 통과

QEMU ARM 쓰로틀링

150 MHz Cortex-M33을 근사하기 위해 CPU 쓰로틀링이 적용된 ARM QEMU로 RP2350 성능을 시뮬레이션:

지표 참고
XAP 인코딩 (프레임당) 평균 = ~650 us 10 ms 예산의 ~6.5%
클라이언트 tick (전체 주기) 평균 = ~3.8 ms 10 ms 예산의 ~38%
추정 MCU 여유율 ~62% 보수적 (QEMU 오버헤드 포함)

QEMU 결과는 2절의 CPU 예산 분석 (RP2350 기준 ~46%, DSP 적용 ~39%)과 일치한다.


6. CMSIS-DSP 통합

SDK는 XYLOLABS_USE_CMSIS_DSP=1 설정 시 Cortex-M 타겟에서 CMSIS-DSP를 자동으로 링크한다.

주요 최적화 함수

CMSIS-DSP 함수 용도 C 대비 속도 향상
arm_rfft_fast_f32 MDCT / 스펙트럼 분석 3-5배
arm_fir_f32 / arm_fir_q15 FIR 다운샘플링 필터 2-4배
arm_dot_prod_f32 양자화 내적 연산 2-3배
arm_scale_f32 게인 정규화 2배
arm_fill_f32 / arm_copy_f32 버퍼 관리 1.5-2배

인코더 경로 선택

코어 FPU 권장 경로 근거
Cortex-M33 (RP2350) 예 (단정밀도) 고정소수점 (q15) DSP SIMD 명령어(SMLAD)가 16비트 고정소수점에 최적화
Cortex-M4F (F411) 예 (단정밀도) 부동소수점 (f32) FPU로 부동소수점 경로가 고정소수점보다 빠름
Cortex-M4F (nRF52840) 예 (단정밀도) 부동소수점 (f32) F411과 동일
Cortex-M33 (nRF9160) 예 (단정밀도) 고정소수점 (q15) RP2350과 동일
Xtensa LX7 (ESP32-S3) 예 (단정밀도) PIE 기반 부동소수점 f32 벡터에 PIE SIMD 적용
Cortex-M0+ (RP2040) 없음 N/A (XAP 불가) DSP 없음, FPU 없음
Cortex-M3 (F103) 없음 N/A (XAP 불가) DSP 없음, FPU 없음
RISC-V (ESP32-C3) 없음 N/A (XAP 불가) M 확장만 (곱셈)

7. 타겟별 DSP 기능 활성화 방법

Rust SDK (Cargo 피처 플래그)

Rust SDK (crates/xylolabs-sdk/)는 두 가지 DSP 피처 플래그를 지원한다:

피처 타겟 효과
cmsis-dsp Cortex-M33 (RP2350, nRF9160), Cortex-M4F (STM32F411, nRF52840, STM32WB55) CMSIS-DSP 최적화 MDCT 및 FIR 경로 활성화
esp32-simd ESP32-S3 (Xtensa LX7) PIE SIMD 최적화 MDCT 경로 활성화

타겟별 Cargo.toml 예시:

# RP2350 / nRF9160 (Cortex-M33)
xylolabs-sdk = { path = "../../crates/xylolabs-sdk", features = ["xap", "cmsis-dsp"] }

# STM32F411 / nRF52840 / STM32WB55 (Cortex-M4F)
xylolabs-sdk = { path = "../../crates/xylolabs-sdk", features = ["xap", "cmsis-dsp"] }

# ESP32-S3 (PIE 포함 Xtensa LX7)
xylolabs-sdk = { path = "../../crates/xylolabs-sdk", features = ["xap", "esp32-simd"] }

# STM32F103 / ESP32-C3 (DSP 없음 -- ADPCM만)
xylolabs-sdk = { path = "../../crates/xylolabs-sdk", default-features = false, features = ["adpcm"] }

C SDK (빌드 정의)

C SDK는 config.h의 컴파일 타임 정의를 사용하며 컴파일러 플래그에서 자동 감지한다:

정의 타겟 자동 감지 조건
XYLOLABS_USE_CMSIS_DSP=1 Cortex-M33, Cortex-M4F __ARM_FEATURE_DSP 정의됨
XYLOLABS_USE_ESP32S3_SIMD=1 ESP32-S3 __XTENSA__ + CONFIG_IDF_TARGET_ESP32S3

자동 감지가 불충분한 경우 CMake로 명시적으로 오버라이드한다:

# CMake -- CMSIS-DSP 강제 활성화
target_compile_definitions(my_firmware PRIVATE XYLOLABS_USE_CMSIS_DSP=1)

# CMake -- ESP32-S3 SIMD 강제 활성화
target_compile_definitions(my_firmware PRIVATE XYLOLABS_USE_ESP32S3_SIMD=1)

요약: 타겟별 플래그

타겟 Rust 피처 C 정의 예상 속도 향상
RP2350 (Cortex-M33) cmsis-dsp XYLOLABS_USE_CMSIS_DSP=1 ~30%
STM32F411 (Cortex-M4F) cmsis-dsp XYLOLABS_USE_CMSIS_DSP=1 ~40%
nRF52840 (Cortex-M4F) cmsis-dsp XYLOLABS_USE_CMSIS_DSP=1 ~30-40%
nRF9160 (Cortex-M33) cmsis-dsp XYLOLABS_USE_CMSIS_DSP=1 ~30%
STM32WB55 (Cortex-M4F) cmsis-dsp XYLOLABS_USE_CMSIS_DSP=1 ~40%
ESP32-S3 (Xtensa LX7) esp32-simd XYLOLABS_USE_ESP32S3_SIMD=1 ~60%
STM32F103 / RP2040 / ESP32-C3 해당 없음 해당 없음 DSP 없음

8. 권장사항

사용 사례별 플랫폼 선택

사용 사례 권장 플랫폼 코덱 근거
4ch @96kHz 풀 스펙트럼 RP2350, ESP32-S3 XAP 충분한 연산 + 대역폭을 갖춘 유일한 플랫폼
4ch @48kHz 표준 STM32F411, RP2350, ESP32-S3 XAP F411 DSP 적용 시 40% CPU
2ch @48kHz 소형 nRF52840 XAP BLE 전송, DSP 적용 시 42% CPU
센서 전용 (오디오 없음) 모든 플랫폼 N/A XMBP 메타데이터만
음성/ADPCM 폴백 STM32F103, ESP32-C3 IMA-ADPCM FPU/DSP 불필요

DSP 최적화 체크리스트

  1. Cortex-M 타겟에서 항상 CMSIS-DSP를 활성화한다 (XYLOLABS_USE_CMSIS_DSP=1). 코드 변경 없이 드롭인 교체 가능하다.
  2. Cortex-M4F에서 XAP 부동소수점 경로를 사용한다 (STM32F411, nRF52840). FPU가 부동소수점을 고정소수점보다 빠르게 만든다.
  3. Cortex-M33에서 XAP 고정소수점 경로를 사용한다 (RP2350, nRF9160). DSP SIMD 명령어가 16비트 연산에 최적화되어 있다.
  4. ESP32-S3 빌드에서 PIE 인트린식을 활성화한다. 자동 벡터화도 도움이 되지만, XAP 핫 패스의 명시적 PIE 인트린식으로 20-30% 추가 성능 향상을 얻을 수 있다.
  5. 96kHz 4ch의 경우: RP2350, ESP32-S3, STM32F411(48kHz에서)만 충분한 연산 능력을 갖추고 있다.
  6. Cortex-M3 및 Cortex-M0+: ADPCM만 가능하다. XAP 인코더 상태(4ch 32 KB)가 STM32F103의 가용 SRAM(20 KB)을 초과한다.
  7. ESP32-C3 (RISC-V): 센서 전용 또는 ADPCM 폴백이다. M 확장은 곱셈만 제공하며 SIMD나 DSP 가속이 없다.

전력 대 성능 트레이드오프

플랫폼 활성 전력 슬립 모드 적합한 용도
RP2350 ~25 mA @150MHz ~1.3 mA (dormant) 배터리 구동 현장 센서
ESP32-S3 ~80 mA @240MHz (WiFi) ~10 uA (deep sleep) 상시 전원, WiFi 가용
STM32F411 ~30 mA @100MHz ~2.4 uA (standby) 산업용, 저전력
nRF52840 ~5 mA @64MHz ~1.5 uA (system off) BLE 웨어러블 / 비콘
STM32F103 ~25 mA @72MHz ~3.6 uA (standby) 레거시 센서 노드

9. 관련 문서