1. ホーム
  2. cuda

[解決済み] このCUDAカーネルの起動パラメータを理解する

2022-02-10 17:20:28

質問事項

ネットで見つけたコードを解析しようとしているのですが、自分自身を追い詰めるようなことばかり考えてしまいます。私は、以下のパラメータで起動したヒストグラムカーネルを見ています。

histogram<<<2500, numBins, numBins * sizeof(unsigned int)>>>(...); 

パラメータは、グリッド、ブロック、共有メモリサイズということは分かっています。

ということは、2500ブロックの numBins スレッドがあり、各ブロックには numBins * sizeof(unsigned int) は、そのスレッドで利用可能な共有メモリのチャンク?

また、カーネル自体の中にも __syncthreads() のセットは2500個あるのでしょうか? numBins を呼び出す。 __syncthreads() カーネルの呼び出しの間に?

どのように解決するのですか?

<ブロッククオート

つまり、numBins個のスレッドが2500個ずつあるブロックがあるということでしょうか。 各ブロックは、numBins * sizeof(unsigned int)のチャンクも持っています。 共有メモリは、そのスレッドで利用できますか?

より CUDAツールキットのドキュメント :

グローバル関数呼び出しの)実行構成は、以下の形式の式を挿入することで指定します。 <<<Dg,Db,Ns,S>>> , ここで

  • Dg ( ディムスリー ) は、グリッドの寸法と大きさを指定します。
  • Db ( ディムスリー ) は、各ブロックの寸法と大きさを指定します。
  • Ns ( size_t ) は、動的に割り当てられる共有メモリのバイト数を指定します。 ブロックあたり は、静的に割り当てられたメモリに加えて、この呼び出しのために。
  • S ( cudaStream_t ) は,関連するストリームを指定します。オプションのパラメータで,デフォルトは 0 です。

というわけで、@Fazar さんのご指摘の通り、答えはイエスです。このメモリはブロックごとに割り当てられます。

<ブロッククオート

また、カーネル自体の中で __syncthreads() を呼び出すことがありますが、これは 2500セットのnumBinsが__syncthreads()を呼び出すことになります。 カーネルコールのコース?

__syncthreads() は、スレッドブロック内のすべてのスレッドがこのポイントに到達するまで待ちます。同じブロック内のスレッド間の通信を調整するために使用されます。

そのため __syncthread() をブロックごとに呼び出す。