3

私は最近、GT430でMathematicaのCUDALinkを使い始め、CUDADotを使って150000x1038行列(encs)に1038x1行列(プローブ)を掛けています。encsとprobeの両方がメモリマネージャに登録されています。

mmEncs = CUDAMemoryLoad[encs];
mmProbe = CUDAMemoryLoad[probe];

これらの内積はGT430を最大限に活用できると考えたので、次のようにテストしました。

For[i = 0, i < 10, i++,
 CUDADot[mmEncs, mmProbe];
]

実行中は、MSIの「Afterburner」ユーティリティを使用してGPUの使用状況を監視します。次のスクリーンショットは結果を示しています。

ここに画像の説明を入力してください

CUDADotの操作ごとに明確なピークがあり、全体として、この図は、GPU容量の1/4未満しか使用していないことを示していると思います。2つの質問:

Q1:ピークが50%で最大になるのはなぜですか?低いようです。

Q2:ピークの間にこのような重要な非アクティブ期間があるのはなぜですか?

ヒントを事前に感謝します!Q1の手がかりはありませんが、Q2は、ホストとデバイス間の意図しないメモリ転送が原因である可能性がありますか?

元の投稿以降の追加情報:CUDAInformation[]は「コア数->64」を報告しますが、NVIDIAコントロールパネルは「CUDAコア:96」を報告します。64コアがあるという誤った仮定に基づいて動作している場合、CUDALinkがGT430を十分に活用しない可能性はありますか?

4

1 に答える 1

1

「MSIアフターバーナー」が実際に何を測定しているのか、または測定する量をサンプリングしている頻度がわからないことに注意して、この回答の序文を書きます。つまり、スクリーンショットの x 軸または y 軸の単位がわからないということです。これにより、パフォーマンスの定量化はほぼ不可能になります。

1.ピークが 50% で最大になるのはなぜですか? 低いようです。

実際に何を測定しているのかわからなければ、「低いようだ」とは言えません。たとえば、命令スループットを測定する場合、Mathematica ドット カーネルがデバイスのメモリ帯域幅に制限されている可能性があります。つまり、コードのスループットのボトルネックは、SM 命令のスループットではなく、メモリ帯域幅になります。メモリ スループットをプロットすると、100% と表示されます。私は、gemv 操作がメモリ帯域幅に制限されることを期待しているので、この結果はおそらくそれほど驚くべきことではありません。

2.ピークとピークの間にアクティビティのない期間がかなりあるのはなぜですか?

CUDA API には、デバイス側とホスト側のレイテンシがあります。WDDM プラットフォーム (つまり、Windows Vist、7、8、およびそれらから派生したサーバー バージョン) では、このホスト側の待機時間はかなり高く、CUDA ドライバーは操作のバッチ処理を実行して、その待機時間を償却します。このバッチ処理により、GPU 操作で「ギャップ」または「一時停止」が発生する可能性があります。それがあなたがここで見ているものだと思います。NVIDIA は、これらの制限を克服するために、Windows プラットフォームの Telsa カード専用の計算ドライバー (TCC) を用意しています。

この操作のパフォーマンスを評価するより良い方法は、自分でループの時間を計り、呼び出しごとの平均時間を計算し、操作数を計算することです (内積には、行列の次元から計算できる既知の下限があり、ベクトル)、FLOP/s 値を計算します。これを GPU の仕様と比較して、パフォーマンスの良し悪しを確認できます。

于 2013-02-04T08:05:46.327 に答える