-
Notifications
You must be signed in to change notification settings - Fork 0
Vector Calculation Utilizing AMX
이 문서는 **AMX(Advanced Matrix Extensions)**를 활용한 벡터 계산에 대해 설명하며, 특히 BF16 (bfloat16) 데이터 타입을 활용한 연산에 중점을 둡니다. AMX의 동작 원리, 구현 세부사항, 이론적 최대 성능, 그리고 효율적인 계산을 위한 최적화 기법에 대해 다룹니다.
**AMX (Advanced Matrix Extensions)**는 Intel에서 도입한 매트릭스 연산 가속 기술로, 하드웨어에서 직접 대규모 행렬 연산을 효율적으로 수행할 수 있도록 설계된 x86 명령어 확장입니다. **타일(Tile)**이라는 구조를 사용하여 데이터를 2차원 형태로 표현하며, 반복되는 연산의 오버헤드를 줄이는 데 탁월한 성능을 제공합니다.
- int8 및 BF16 데이터 타입에 최적화되어 있음.
- 행렬 데이터를 타일로 구성하여 하드웨어에서 효율적으로 처리.
- 행렬 곱셈 및 벡터 내적 같은 연산에서 큰 성능 향상.
**BF16 (bfloat16)**은 16비트 부동소수점 형식으로, 기계 학습 및 수치 계산 작업에서 널리 사용됩니다. IEEE 754 FP32 포맷과 유사하지만, 8비트를 지수로 사용하여 FP32와 동일한 범위를 지원합니다.
- 작은 메모리 크기: FP32 대비 메모리 사용량이 절감됩니다.
- 하드웨어 가속: AMX를 통해 고성능 매트릭스 연산 가능.
- 충분한 정밀도: 머신 러닝 및 벡터 계산에 적합.
int8 데이터에서 AMX는 타일 기반 연산을 통해 밀집 행렬 곱셈을 최적화합니다. 작동 방식은 다음과 같습니다:
- 타일 구성: 타일은 서브 매트릭스를 나타내도록 구성되며, 2D 그리드 형태로 데이터를 저장합니다.
- 데이터 로드: 입력 행렬(예: 가중치 및 활성화 값)을 타일에 로드합니다.
-
행렬 곱셈 수행:
_tile_dpbusd()같은 명령어를 통해 타일 간의 행과 열 간 내적을 계산합니다. - 결과 저장: 계산된 결과는 타일 또는 메모리에 저장됩니다.
이 방식을 통해 AMX는 int8 데이터에서 병렬 연산을 극대화할 수 있습니다.
BF16 데이터에서 AMX는 float 연산에 최적화된 명령어를 사용하며, 작동 방식은 다음과 같습니다:
- 타일 구성: BF16 서브 매트릭스를 저장할 수 있도록 타일 크기를 설정합니다.
- 데이터 변환: 필요한 경우 FP32 데이터를 BF16으로 변환한 뒤 타일에 로드합니다.
-
행렬 곱셈 수행:
_tile_dpbf16ps()명령어를 통해 고속 부동소수점 내적 연산을 수행합니다. - 결과 저장: 최종 결과를 FP32 또는 BF16으로 변환해 저장합니다.
BF16 연산은 대규모 벡터 거리 계산이나 신경망 추론과 같은 작업에 특히 적합합니다.
AMX를 효율적으로 사용하려면 **Intel® oneAPI DPC++/C++ Compiler (icpx)**를 사용해야 합니다. 이는 AMX 명령어 및 하드웨어 가속 기능을 제대로 지원합니다.
- AMX 관련 명령어를 직접 지원.
- AMX를 지원하는 Intel 프로세서에 최적화.
- 타일 구성 및 메모리 정렬 관리 도구 제공.
컴파일 예제:
icpx -march=native -o amx_program amx_vector_calculation.cpp