導入
疎行列乗算 (SpMM) は、科学計算、機械学習、データ分析などを含む (ただしこれらに限定されない) 多くの分野の中核となる演算です。ただし、SpMM 操作を効率的に実行することは、特に GPU などの最新のハードウェア アーキテクチャで大規模な並列処理を実行したい場合には困難なことがよくあります。幸いなことに、CUDA を使用すると、効率的な SpMM アルゴリズムを設計して実装できます。
この記事では、SpMM の CUDA での新しいバッチ処理アルゴリズムを検討し、サンプル コードを使用してその実装方法を詳しく説明します。
1. 疎行列の概念
スパース行列は、ほとんどの要素がゼロ (またはデフォルト値) である行列です。多くのアプリケーションでは、データがまばらな形式で表示されることが多いため、このデータを保存および処理する方法は非常に重要です。CSR (圧縮スパース行) や CSC (圧縮スパース列) などの特定のデータ構造を使用すると、スパース行列をより効率的に保存および処理できます。
1.1 CSRフォーマット
CSR 形式は 3 つの配列で構成されます。
values[]
: ゼロ以外の要素の値を格納します。row_ptr[]
: 各行の開始位置のインデックスをvalues[]に格納します。col_indices[]
:values[] の各要素について、元の行列にその列インデックスを格納します。
たとえば、次の疎行列を考えてみましょう。
3 0 0
0 0 0
0 7 0
そのCSRは次のように表現されます。
values[] = [3, 7]
row_ptr[] =