FPGA를 이용한 빠른 임의 정밀도 부동 소수점
이 저장소에 구현된 접근 방식에 대한 자세한 설명은 FCCM'22 논문 [1]에서 확인할 수 있습니다.
서론
본 저장소는 Vitis HLS를 사용하여 XRT가 활성화된 Xilinx FPGA를 대상으로 임의 정밀도 부동 소수점 곱셈기 및 덧셈기를 구현합니다. 이들은 행렬 곱셈 기본 요소(matrix multiplication primitive)를 통해 노출되어 메모리 한계에 도달하지 않고 최대 처리량으로 실행될 수 있도록 합니다. 설계는 완전 파이프라인(fully pipelined) 방식으로, MAC 처리량은 주파수에 인스턴스화된 컴퓨팅 유닛의 개수를 곱한 값과 동일합니다.
Alveo U250 가속기에서 이 설계를 구현했을 때 512비트 행렬-행렬 곱셈에서 2.0 GMAC/s를 달성하는 것으로 나타났으며, 이는 36코어 듀얼 소켓 Xeon 노드보다 한 자릿수 높은 수치로, CPU 코어 기준으로 환산하면 375배의 처리량 [1]에 해당합니다.
설정
하드웨어 설계는 CMake를 사용하여 구성됩니다. 대상 Xilinx XRT가 활성화된 플랫폼은 APFP_PLATFORM 매개변수를 통해 지정해야 합니다. 가장 중요한 구성 매개변수들은 다음과 같습니다:
- 부동 소수점 표현에 사용되는 너비는 컴파일 시간에
APFP_BITS CMake 매개변수를 사용하여 고정됩니다. 이 중 63비트는 지수에, 1비트는 부호에, 나머지 비트는 가수(mantissa)에 사용됩니다. 현재 값은 메모리 인터페이스 너비에 맞추기 위해 512의 배수여야 합니다.
- 설계를 단일 파이프라인 곱셈기를 넘어 확장하려면
APFP_COMPUTE_UNITS를 사용하여 전체 커널을 복제할 수 있습니다. 각 인스턴스는 완전히 독립적인 행렬 곱셈 유닛으로 작동합니다. 이들은 하나의 행렬 곱셈 연산에 협력하는 데 사용될 수 있습니다 (예시는 host/TestMatrixMultiplication.cpp 참조).
- 부동 소수점 곱셈기는 Karatsuba 분해(Karatsuba decomposition)를 사용하여 설계의 전반적인 자원 사용량을 줄입니다.
분해는 APFP_MULT_BASE_BITS에서 최저점을 찍으며, 그 이후에는 HLS 툴이 생성한 DSP를 사용하여 단순 곱셈으로 폴백(fallback)합니다. 유사하게, APFP_ADD_BASE_BITS는 HLS 툴의 덧셈 구현에 전송할 비트 수를 구성하며, 이 임계값 위에서 덧셈을 여러 단계로 수동 파이프라인화(pipelining)합니다.
- 메모리 바운드(memory bound)가 되는 것을 방지하기 위해, 행렬 곱셈 구현은 저희 FPGA'20 논문 [2]에서 설명한 접근 방식으로 타일링(tiling)됩니다. 타일 크기는
APFP_TILE_SIZE_N 및 APFP_TILE_SIZE_M 매개변수를 통해 노출됩니다. 가장 높은 산술 강도(arithmetic intensity)는 이 두 수량이 같고 최대화될 때 달성되지만, 상대적으로 작은 타일 크기만으로도 메모리 병목 현상(memory bottleneck)을 극복하기에 충분합니다 (예: 32x32). 더 큰 타일 크기는 BRAM 사용량과 입력 행렬이 타일 크기의 배수가 아닐 때 발생할 수 있는 잠재적 오버헤드(overhead)를 감수하고 산술 강도를 증가시킵니다.
APFP_FREQUENCY는 설계가 목표로 하는 최대 주파수를 변경하는 데 사용될 수 있습니다. 지정되지 않은 경우, 대상 플랫폼의 기본값이 사용됩니다.
높은 처리량(high throughput)을 달성하기 위해 프로젝트를 구성하는 방법에 대한 자세한 내용은 저희 논문 [1]을 참조하십시오.
설정 및 컴파일 (Configuration and compilation)
저장소(repository)를 git clone --recursive로 복제하거나, 종속성을 확인하기 위해 복제 후 git submodule update --init을 실행하여 주석 처리된 모듈(submodule)을 업데이트해야 합니다.
코드를 설정하고 빌드하는 데 필요한 최소 명령어는 다음과 같습니다:
mkdir build
cd build
cmake ..
...
하지만, 가속기(accelerator)는 항상 이전 섹션과 저희 논문 [1]에 설명된 매개변수를 사용하여 대상 시스템과 일치하도록 구성되어야 합니다. CMake 설정 흐름은 Xilinx 툴을 찾고 하드웨어 빌드 타겟을 노출하기 위해 hlslib [3]를 사용합니다.
프로젝트는 성공적으로 구성되려면 Vitis, GMP, 및 MPFR에 의존합니다.
코드 실행 (Running the code)
우리는 host/TestMatrixMultiplication.cpp에서 무작위 입력에 대해 행렬 곱셈 가속기(matrix multiplication accelerator)를 실행하는 예제 호스트 코드(example host code)를 제공합니다. 사용법은 실행 파일을 참조하십시오. 예시 호출은 다음과 같습니다:
./TestMatrixMultiplicationHardware hw 256 256 256
설치 (Installation)
소프트웨어 인터페이스 구성 요소와 하드웨어 가속기 자체(make hw로 빌드됨)를 모두 포함하여 프로젝트를 설치하려면, 단순히 make install을 실행하십시오. 프로젝트가 설치될 위치는 CMAKE_INSTALL_PREFIX 매개변수로 설정됩니다.
참고 문헌 (References)
[1] Johannes de Fine Licht, Christopher A. Pattison, Alexandros Nikolaos Ziogas, David Simmons-Duffin, Torsten Hoefler, "FPGA에서의 빠른 임의 정밀도 부동 소수점(Fast Arbitrary Precision Floating Point on FPGA)", Proceedings of the 2022 IEEE 30th Annual International Symposium on Field-Programmable Custom Computing Machines (FCCM'22)에 게재됨. 🔗
[2] Johannes de Fine Licht, Grzegorz Kwasniewski, 그리고 Torsten Hoefler, "고수준 합성(High-Level Synthesis)을 사용한 FPGA에서의 행렬 곱셈 회피 유연 통신(Flexible Communication Avoiding Matrix Multiplication on FPGA with High-Level Synthesis)", Proceedings of the 28th ACM/SIGDA International Symposium on Field-Programmable Gate Arrays (FPGA'20)에 게재됨.
🔗
[3] Johannes de Fine Licht, 그리고 Torsten Hoefler. "hlslib: 하드웨어 설계를 위한 소프트웨어 공학(Software Engineering for Hardware Design).", Fifth International Workshop on Heterogeneous High-performance Reconfigurable Computing (H2RC'19)에서 발표됨.
🔗