Skip to main content
QUICK REVIEW

[논문 리뷰] A GEMM interface and implementation on NVIDIA GPUs for multiple small matrices

Chetan Jhurani, Paul Mullowney|arXiv (Cornell University)|2013. 04. 26.
Parallel Computing and Optimization Techniques참고 문헌 5인용 수 4
한 줄 요약

이 논문은 NVIDIA GPU에서 소형 행렬(≤16×16)의 배치 곱셈을 위한 고성능 GEMM 인터페이스 및 CUDA 커널 구현을 제시한다. 두 번째 수준의 leading dimension 인터페이스를 활용하여 메모리 오버헤드를 줄이고 데이터 국소성을 향상시켰다. Tesla K20c에서 cuBLAS 배치 GEMM보다 30%에서 600% 높은 성능을 달성하였으며, 크기가 16인 단일 정밀도 실수 행렬의 경우 최대 216 GFlop/s를 기록하였다.

ABSTRACT

We present an interface and an implementation of the General Matrix Multiply (GEMM) routine for multiple small matrices processed simultaneously on NVIDIA graphics processing units (GPUs). We focus on matrix sizes under 16. The implementation can be easily extended to larger sizes. For single precision matrices, our implementation is 30% to 600% faster than the batched cuBLAS implementation distributed in the CUDA Toolkit 5.0 on NVIDIA Tesla K20c. For example, we obtain 104 GFlop/s and 216 GFlop/s when multiplying 100,000 independent matrix pairs of size 10 and 16, respectively. Similar improvement in performance is obtained for other sizes, in single and double precision for real and complex types, and when the number of matrices is smaller. Apart from our implementation, our different function interface also plays an important role in the improved performance. Applications of this software include Finite Element computation on GPUs.

연구 동기 및 목표

  • 유한요소법에서 흔한 소형 행렬(≤16×16)에 대한 GPU에서의 GEMM 연산 성능 저하 문제를 해결한다.
  • cuBLAS 배치 인터페이스의 한계를 극복한다. 특히 행렬 크기가 16의 배수가 아닐 경우 성능 저하가 발생하고, 포인터 포인터 인수 전달 방식으로 인한 오버헤드 문제를 해결한다.
  • 두 번째 수준의 leading dimension을 사용한 새로운 인터페이스를 설계하여 데이터 국소성을 향상시키고 메모리 전송 오버헤드를 감소시킨다.
  • 단일 정밀도, 이중 정밀도, 실수, 복소수 등 다양한 데이터 유형과 행렬 크기에서 고성능을 달성하며, 16의 배수가 아닌 경우에도 성능 저하가 최소화된다.
  • 현대 GPU에서 수천 개의 독립적인 소형 행렬 연산을 효율적이고 이식 가능하며 고-throughput로 수행할 수 있도록 한다.

제안 방법

  • 이중 포인터 배열 대신 두 번째 수준의 leading dimension을 기반으로 한 새로운 GEMM 인터페이스를 설계하여 메모리 전송을 줄이고 데이터 코alescing를 향상시킨다.
  • 소형 행렬 크기에 최적화된 스레드 블록을 사용한 CUDA 커널을 구현하며, 코ales스드 메모리 액세스 패턴과 효율적인 레지스터 사용을 구현한다.
  • C++ 템플릿을 활용하여 단일, 이중 정밀도, 실수, 복소수 등 다양한 데이터 유형과 행렬 크기를 하나의 유형 안전하고 효율적인 구현에서 지원한다.
  • 배치된 행렬에 대한 균일한 메모리 레이아웃을 사용하여 코ales스드 글로벌 메모리 액세스를 가능하게 하고 공유 메모리의 뱅크 충돌을 줄인다.
  • 커널 실행 파라미터와 그리드/블록 크기를 최적화하여 최대의 할당률을 확보하고 메모리 지연을 숨긴다.
  • 다양한 연산 유형(전치, 켤라위드 전치)과 스칼라 파rameter(α, β)를 지원하는 C++ 래퍼 함수와 커널을 통합한다.

실험 결과

연구 질문

  • RQ1NVIDIA GPU에서 기존 cuBLAS 배치 구현 대비 소형 행렬에 대한 배치 GEMM 성능을 어떻게 크게 향상시킬 수 있는가?
  • RQ2두 번째 수준의 leading dimension을 사용한 재설계된 인터페이스가 포인터 포인터 인터페이스에 비해 메모리 전송 오버헤드를 얼마나 줄이고 데이터 국소성을 얼마나 향상시키는가?
  • RQ3제안된 인터페이스와 커널을 사용할 경우, 다양한 행렬 크기(1–16)와 데이터 유형(단일/이중 정밀도, 실수/복소수)에서 어떤 성능 향상이 달성되는가?
  • RQ4배치 크기가 증가함에 따라 신규 구현의 성능 스케일링은 어떻게 되며, 16의 거듭제곱이 아닌 크기에서도 높은 효율성을 유지하는가?
  • RQ5제안된 인터페이스와 커널 설계는 다른 BLAS 루틴과 다양한 하드웨어 플랫폼으로 일반화될 수 있는가?

주요 결과

  • 제안된 구현은 단일 정밀도 실수 행렬 크기 10에 대해 cuBLAS 배치 GEMM 대비 최대 600% 높은 성능을 달성하였으며, 100,000개의 행렬 쌍에서 104 GFlop/s를 기록하였다.
  • 행렬 크기 16에 대해 Tesla K20c에서 단일 정밀도 실수 행렬 216 GFlop/s, 이중 정밀도 실수 행렬 173 GFlop/s, 단일 정밀도 복소수 행렬 609 GFlop/s, 이중 정밀도 복소수 행렬 217 GFlop/s의 성능을 달성하였다.
  • 16의 배수가 아닌 경우 발생하는 성능 저하가 크게 감소하였다: 크기 15일 경우 신규 커널은 150 GFlop/s(비교 대상인 cuBLAS는 105 GFlop/s), 크기 17일 경우 150 GFlop/s(비교 대상은 32 GFlop/s)를 기록하였다.
  • 두 번째 수준의 leading dimension을 사용한 인터페이스 변경 자체만으로도 성능 향상이 크게 기여하였으며, 소형 행렬에 대해 최대 600%의 상대적 향상이 달성되었다.
  • 모든 데이터 유형과 행렬 크기에서 일관된 성능 향상이 유지되었으며, 크기와 유형에 따라 30%에서 600%까지의 성능 향상이 관찰되었다.
  • 작은 배치 크기에서도 효율적이며, 복소수 및 이중 정밀도 유형에서도 고성능 유지가 가능하여, 크기 15의 단일 정밀도 복소수 행렬에서 504 GFlop/s의 성능을 기록하였다.

더 나은 연구,지금 바로 시작하세요

논문 읽기부터 검토까지, 연구 시간을 획기적으로 줄여보세요.

카드 등록 없음 · 무료 플랜 제공

이 리뷰는 AI가 만들고, 인간 에디터가 검토했습니다.