1

CUDA現在、nVidia GTX 480で開発しています。CUDA仕様によると、カードにはそれぞれ 32 コアのストリーミング マルチプロセッサ (SM) が 15 個搭載されています。

私のコードは、Nそれぞれ 32 コアのブロックで動作します。

理想的にはN <= 15、各ブロックを異なる SM に割り当てることができるため、各ブロックは 1 つのブロックと同じ速度で実行されると予想されます。「N > 15」の場合、ブロックが SM を共有し始めると、個々のブロックのパフォーマンスが低下するはずです。maxoccがカーネルの最大占有率である場合N > 15*maxocc、SM ですべてのブロックをスケジュールできるわけではないため、 の時点でパフォーマンスが停滞するはずです。

これは私が実際に観察したことでもあります。個々のブロックのパフォーマンスは の時点で低下し始め、N = 12の時点でパフォーマンスが停滞していますN = 57。つまり、SM を占有する 3 つの余分なブロックがあるかのようです。

GTX 480 を使用する他のプログラムは実行していません。ただし、カードはテキスト コンソールを実行する外部ディスプレイに接続されています。つまり、X-windows ではありません。

ここで質問です。GTX 480 を使用してコンソールを駆動するとCUDAリソースが占有されるかどうか知っている人はいますか? もしそうなら、正確にはいくらですか?どうすればそれを回避できますか、つまり、CUDAデバイスを完全に非アクティブ化せずにビデオ出力を非アクティブ化するにはどうすればよいですか?

4

2 に答える 2

3

CUDA アーキテクチャは、15 個の SM デバイスで、15 個のブロックが SM ごとに 1 つ分散されることを保証しません。コンピューティング ワーク ディストリビューターは、2 つのブロックを複数の SM に分散している可能性があります。Parallel Nsight Instruction Statistics の実験では、SM ごとに開始されたワープと SM ごとのアクティブ サイクルのグラフが表示されます。あなたの場合、分布は次のようになると思います。9 つの SM には 1 つのブロックがあり、3 つの SM には 2 つのブロックがあり、3 つの SM にはブロックがありません。

SM カウント未満のブロックを起動している場合は、ブロックごとの動的共有メモリを 1/2 共有メモリ + 1 バイトに増やすことで、SM ごとに 1 ブロックを強制することができます (これは、3 つの山括弧の 3 番目の引数として指定されます)。 . これにより、占有は SM ごとに 1 つのブロックに強制されます。これを行い、並行カーネルを実行しようとすると、並行性に影響を与える可能性があります。

現在のアーキテクチャでは、CUDA コンテキストは、カーネルの実行中にすべての SM を排他的に使用します。

于 2012-05-08T00:24:09.703 に答える