1

複数の(n個としましょう)GPU上のCUDAで疎行列ベクトル積 y = Ax を計算する最速の方法は何だろうと思っていました。

私の素朴なアプローチは、ベクトル x と y を n 個のチャンク (各 GPU で 1 個のチャンク) に分割することです。次に、行列 A をより小さな n^2 ブロック A_ij に分割し、計算します。

y_i = \sum_j A_{i,j} x_j, // GPU j stores A_{i,j} and x_j, result is copied 
                          // to and summed up on GPU i 

さまざまな GPU で j=1..n を cuSPARSE としましょう。これは機能しますか?ユニファイド メモリ アーキテクチャでは、原則としてすべての GPU がグローバル メモリにアクセスできる必要があります。

GPU 間のメモリ転送は非常に遅くなりますか? 大幅な高速化は期待していませんが、単一の GPU で行列とベクトルの乗算を実行するよりも遅くなるかどうか疑問に思っていました。

4

1 に答える 1

2

別のアプローチをお勧めします。xベクトルをチャンクに分割しないでください。xすべての GPU に転送します。

行に従ってA行列を分割します。たとえば、A行が 9 つあり、GPU が 3 つある場合、行 1 ~ 3 をA最初の GPU に転送し、行 4 ~ 6 をA2 番目の GPU に転送し、行 7 ~ 9 をA3 番目の GPU に転送します。

y次に、3 つの GPU で の3 つの個別の部分を計算します。

y[1-3] = A[1-3]*x
y[4-6] = A[4-6]*x
y[7-9] = A[7-9]*x

たとえば、これら 3 つの操作のそれぞれを で実行できますcusparse<T>csrmv(または、CUBには spmv ルーチンもあります)。

ベクトルの再構築はy自明 (連結) である必要があります。結果の転送時にのみ、計算中に GPU 間データ転送の必要はありません ( y)。

可能な「最適化」は、A単純に行ではなく「作業」に基づいて分割することです。しかし、これの利点は の構造に依存するAため、分析が必要になります。この最適化への単純なアプローチはA、各チャンク内の NZ 要素の数を (ほぼ) 等しくすることに基づいて分割することです。

于 2015-09-14T18:06:19.673 に答える