Skip to content

Vector Calculation Utilizing AMX

Joobo Shim edited this page Nov 28, 2024 · 8 revisions

AMX를 활용한 벡터 계산

이 문서는 **AMX(Advanced Matrix Extensions)**를 활용한 벡터 계산에 대해 설명하며, 특히 BF16 (bfloat16) 데이터 타입을 활용한 연산에 중점을 둡니다. AMX의 동작 원리, 구현 세부사항, 이론적 최대 성능, 그리고 효율적인 계산을 위한 최적화 기법에 대해 다룹니다.


AMX란?

**AMX (Advanced Matrix Extensions)**는 Intel에서 도입한 매트릭스 연산 가속 기술로, 하드웨어에서 직접 대규모 행렬 연산을 효율적으로 수행할 수 있도록 설계된 x86 명령어 확장입니다. **타일(Tile)**이라는 구조를 사용하여 데이터를 2차원 형태로 표현하며, 반복되는 연산의 오버헤드를 줄이는 데 탁월한 성능을 제공합니다.

AMX의 주요 특징

  • int8BF16 데이터 타입에 최적화되어 있음.
  • 행렬 데이터를 타일로 구성하여 하드웨어에서 효율적으로 처리.
  • 행렬 곱셈 및 벡터 내적 같은 연산에서 큰 성능 향상.

BF16이란?

**BF16 (bfloat16)**은 16비트 부동소수점 형식으로, 기계 학습 및 수치 계산 작업에서 널리 사용됩니다. IEEE 754 FP32 포맷과 유사하지만, 8비트를 지수로 사용하여 FP32와 동일한 범위를 지원합니다.

BF16의 장점

  • 작은 메모리 크기: FP32 대비 메모리 사용량이 절감됩니다.
  • 하드웨어 가속: AMX를 통해 고성능 매트릭스 연산 가능.
  • 충분한 정밀도: 머신 러닝 및 벡터 계산에 적합.

AMX가 int8에서 동작하는 원리

int8 데이터에서 AMX는 타일 기반 연산을 통해 밀집 행렬 곱셈을 최적화합니다. 작동 방식은 다음과 같습니다:

  1. 타일 구성: 타일은 서브 매트릭스를 나타내도록 구성되며, 2D 그리드 형태로 데이터를 저장합니다.
  2. 데이터 로드: 입력 행렬(예: 가중치 및 활성화 값)을 타일에 로드합니다.
  3. 행렬 곱셈 수행: _tile_dpbusd() 같은 명령어를 통해 타일 간의 행과 열 간 내적을 계산합니다.
  4. 결과 저장: 계산된 결과는 타일 또는 메모리에 저장됩니다.

이 방식을 통해 AMX는 int8 데이터에서 병렬 연산을 극대화할 수 있습니다.


AMX가 BF16에서 동작하는 원리

BF16 데이터에서 AMX는 float 연산에 최적화된 명령어를 사용하며, 작동 방식은 다음과 같습니다:

  1. 타일 구성: BF16 서브 매트릭스를 저장할 수 있도록 타일 크기를 설정합니다.
  2. 데이터 변환: 필요한 경우 FP32 데이터를 BF16으로 변환한 뒤 타일에 로드합니다.
  3. 행렬 곱셈 수행: _tile_dpbf16ps() 명령어를 통해 고속 부동소수점 내적 연산을 수행합니다.
  4. 결과 저장: 최종 결과를 FP32 또는 BF16으로 변환해 저장합니다.

BF16 연산은 대규모 벡터 거리 계산이나 신경망 추론과 같은 작업에 특히 적합합니다.


Intel 컴파일러(icpx)를 사용해야 하는 이유

AMX를 효율적으로 사용하려면 **Intel® oneAPI DPC++/C++ Compiler (icpx)**를 사용해야 합니다. 이는 AMX 명령어 및 하드웨어 가속 기능을 제대로 지원합니다.

왜 icpx인가?

  • AMX 관련 명령어를 직접 지원.
  • AMX를 지원하는 Intel 프로세서에 최적화.
  • 타일 구성 및 메모리 정렬 관리 도구 제공.

컴파일 예제:

icpx -march=native -o amx_program amx_vector_calculation.cpp

벡터 계산을 위한 AMX 데이터 정렬

AMX의 성능

이론적 최대치는 ~~

Clone this wiki locally