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)|Apr 26, 2013
Parallel Computing and Optimization Techniques参考文献 5被引用数 4
ひとこと要約

本論文は、NVIDIA GPU上で小規模な行列(≤16×16)のバッチ乗算を高速に実行するための高性能なGEMMインタフェースおよびCUDAカーネル実装を提示する。2段階のリーディングディメンションインタフェースを活用することで、メモリオーバーヘッドを低減し、データの局所性を向上させる。Tesla K20c上でcuBLASバッチGEMMと比較して、最大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.

研究の動機と目的

  • GPU上での小規模行列(≤16×16)におけるGEMM演算の性能ボトルネックを解消すること。これは有限要素法において一般的に見られる。
  • cuBLASバッチインタフェースの制限、特に行列サイズが16の倍数でない場合の性能低下と、ポ인터へのポインタ引数のオーバーヘッドを克服すること。
  • 2段階のリーディングディメンションを用いた新しいインタフェースを設計し、データの局所性を向上させ、メモリ転送オーバーヘッドを低減すること。
  • 単精度・倍精度、実数・複素数の複数のデータ型および行列サイズにおいて、最小限の性能低下で高い性能を達成すること。
  • 現代のGPU上で数千個の独立した小規模行列演算を効率的かつポータブルに、高スルーレートで実行可能にする。

提案手法

  • 2重ポインタ配列ではなく、2段階のリーディングディメンションに基づく新しいGEMMインタフェースを設計し、メモリ転送を削減し、データコalescingを向上させる。
  • 小規模な行列サイズに最適化されたスレッドブロックを用いたCUDAカーネルを実装し、コalescedメモリアクセスパターンと効率的なレジスタ使用を実現する。
  • C++テンプレートを活用して、1つの型安全で効率的な実装で複数のデータ型(S/D/C/Z)と行列サイズをサポートする。
  • バッチ処理のための均一なメモリレイアウトを採用し、グローバルメモリへのコalescedアクセスを可能にするとともに、共有メモリ内のバンク競合を低減する。
  • カーネル起動パラメータおよびグリッド/ブロックサイズを最適化し、割り当て占有率を最大化し、メモリ遅延を隠蔽する。
  • さまざまな演算タイプ(転置、共役転置)とスカラーパラメータ(α, β)をサポートするC++ラッパー関数と統合する。

実験結果

リサーチクエスチョン

  • RQ1NVIDIA GPU上で、既存のcuBLASバッチGEMM実装と比較して、小規模行列のバッチGEMM性能をどのように顕著に向上させられるか?
  • RQ22段階のリーディングディメンションを用いた再設計インタフェースは、ポインタへのポインタインタフェースと比較して、メモリ転送オーバーヘッドをどれほど低減し、データの局所性を向上させるか?
  • RQ3提案されたインタフェースとカーネルを用いることで、さまざまな行列サイズ(1–16)およびデータ型(単精度・倍精度、実数・複素数)で、どの程度の性能向上が達成できるか?
  • RQ4バッチサイズが増加するに従って、新しい実装の性能はどのようにスケーリングするか?また、16の累乗でないサイズに対しても高い効率を維持するか?
  • RQ5提案されたインタフェースとカーネル設計は、他のBLASルーチンや異なるハードウェアプラットフォームへ一般化可能か?

主な発見

  • 提案された実装は、単精度実数行列10サイズにおいて、cuBLASバッチGEMMと比較して最大600%の性能向上を達成し、10万組の行列ペアで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(cuBLASでは32 GFlop/s)を達成している。
  • 2段階のリーディングディメンションを用いたインタフェース変更そのものが、性能向上に大きく寄与しており、小規模行列では最大600%の相対的向上が得られている。
  • 性能向上はすべてのデータ型および行列サイズで一貫しており、サイズや型に応じて30%から600%の改善が得られている。
  • 小さなバッチサイズに対しても効率的であり、複素数および倍精度型に対しても高い性能を維持しており、サイズ15の単精度複素数行列では504 GFlop/sを達成している。

より良い研究を、今すぐ始めましょう

論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。

クレジットカード登録不要

このレビューはAIが作成し、人間の編集者が確認しました。