소개
- FFmpeg의 어셈블리 언어 수업에 오신 것을 환영함. 이 수업은 어셈블리 언어가 FFmpeg에서 어떻게 작성되는지에 대한 기초를 제공함.
필요한 지식
- C 언어, 특히 포인터에 대한 지식이 필요함.
- 고등학교 수준의 수학 지식(스칼라와 벡터, 덧셈, 곱셈 등)이 필요함.
어셈블리 언어란?
- 어셈블리 언어는 CPU가 처리하는 명령어에 직접 대응하는 코드를 작성하는 프로그래밍 언어임.
- FFmpeg의 대부분의 어셈블리 코드는 SIMD(Single Instruction Multiple Data)로, 이는 벡터 프로그래밍이라고도 불림.
- SIMD는 이미지, 비디오, 오디오와 같은 순차적으로 메모리에 저장된 많은 데이터를 처리하는 데 적합함.
왜 어셈블리 언어로 작성하는가?
- 멀티미디어 처리 속도를 빠르게 하기 위함. 어셈블리 코드로 작성하면 10배 이상의 속도 향상을 얻을 수 있음.
- FFmpeg에서는 인트린직을 사용하지 않고 직접 어셈블리 코드를 작성함. 인트린직은 보통 수작업 어셈블리보다 10-15% 느림.
어셈블리 언어의 종류
- 이 수업은 x86 64비트 어셈블리 언어에 중점을 둠. 이는 amd64로도 알려져 있으며 Intel CPU에서도 작동함.
- x86 어셈블리 구문에는 AT&T와 Intel 두 가지가 있으며, Intel 구문을 사용할 것임.
지원 자료
- FFmpeg 어셈블리 프로그래밍은 고성능 이미지 처리에 중점을 두고 있으며, 독특한 접근 방식을 가짐.
- "The Art of 64-bit assembly" 책의 다이어그램이 도움이 될 수 있음.
레지스터
- 레지스터는 CPU에서 데이터를 처리하는 영역임. CPU는 메모리를 직접 조작하지 않고, 데이터를 레지스터에 로드하여 처리한 후 메모리에 다시 씀.
범용 레지스터
- 범용 레지스터(GPR)는 데이터나 메모리 주소를 포함할 수 있음. FFmpeg의 어셈블리 코드에서는 GPR가 주로 발판 역할을 함.
벡터 레지스터
- 벡터(SIMD) 레지스터는 여러 데이터 요소를 포함함. 다양한 유형의 벡터 레지스터가 존재함.
- 대부분의 비디오 압축 및 압축 해제 계산은 정수 기반임.
x86inc.asm 포함
- x86inc.asm은 FFmpeg, x264, dav1d에서 어셈블리 프로그래머의 작업을 쉽게 하기 위해 사용되는 경량 추상화 계층임.
간단한 스칼라 어셈블리 코드
- 예제 코드를 통해 스칼라 어셈블리 코드가 어떻게 작동하는지 설명함.
기본 벡터 함수 이해하기
- 첫 번째 SIMD 함수 예제를 통해 각 줄의 의미를 설명함.
-
movu, paddb와 같은 명령어를 사용하여 벡터 연산을 수행함.
- 함수는 인수의 데이터를 수정하며 값을 반환하지 않음.