19

手書きのカーネルの各 CUDA スレッドのリソース使用量を理解しようとしています。

kernel.cuファイルをファイルkernel.oにコンパイルしましたnvcc -arch=sm_20 -ptxas-options=-v

そして、次の出力を得ました(パススルーc++filt):

ptxas info    : Compiling entry function 'searchkernel(octree, int*, double, int, double*, double*, double*)' for 'sm_20'
ptxas info    : Function properties for searchkernel(octree, int*, double, int, double*, double*, double*)
    72 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 46 registers, 176 bytes cmem[0], 16 bytes cmem[14]

上記の出力を見ると、次のように言うのは正しいですか?

  • 各 CUDA スレッドは 46 個のレジスタを使用していますか?
  • ローカルメモリに流出するレジスタはありませんか?

出力の理解にも問題があります。

  • 私のカーネルはたくさんの__device__関数を呼び出しています。__global__関数と__device__関数のスタック フレームのメモリの合計は 72 バイトですか?

  • 0 byte spill storesとはどう違いますか0 bytes spill loads

  • の情報cmem(これは定数メモリであると想定しています) が異なる数値で 2 回繰り返されるのはなぜですか? カーネル内では、定数メモリを使用していません。それは、コンパイラが内部で GPU に一定のメモリを使用するように指示するということですか?

この質問は次のセクションに「続きます」: ptxas の詳細出力の解釈、パート II

4

1 に答える 1

17
  • 各 CUDA スレッドは 46 個のレジスタを使用していますか? はい正解
  • ローカルメモリに流出するレジスタはありませんか? はい正解
  • __global__および__device__関数のスタック フレームのメモリの合計は 72 バイトですか? はい正解
  • 0 バイトのスピル ストアと 0 バイトのスピル ロードの違いは何ですか?
    • 当然の質問ですが、計算された値をスピルし、一度ロードし、それを破棄 (つまり、そのレジスタに何か他のものを格納) してから再度ロード (つまり、再利用) できるため、ロードはストアよりも大きくなる可能性があります。更新:以下のコメントで@njuffaによって説明されているように、スピルロード/ストアカウントは静的分析に基づいていることにも注意してください
  • cmem の情報 (これは定数メモリであると想定しています) が異なる数値で 2 回繰り返されるのはなぜですか? カーネル内では、定数メモリを使用していません。これは、コンパイラが内部で GPU に一定のメモリを使用するように指示するということですか?
    • 定数メモリは、変数やカーネル引数などのいくつかの目的で使用され、さまざまな「バンク」が使用され、少し詳細になり始めますが、変数に 64KB 未満、カーネル引数に 4KB 未満__constant__を使用する限り、__constant__わかった。
于 2012-09-12T13:31:16.300 に答える