FFmpeg 어셈블리 언어 학교

9 hours ago 2

소개

  • 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와 같은 명령어를 사용하여 벡터 연산을 수행함.
  • 함수는 인수의 데이터를 수정하며 값을 반환하지 않음.

Read Entire Article