GPUプログラミング

CUDAで、GPUカーネル(__global__を付けた関数)が計算した結果を、CPU側のプログラムで受け取る方法として正しいものはどれか。

  1. Aカーネルの戻り値(return)で、全スレッドの結果がまとめてCPUへ返る
  2. Bカーネルが結果をGPUのメモリ上の配列に書き込み、CPU側はカーネルの終了後にその配列をCPUのメモリへコピーして(またはユニファイドメモリを読んで)受け取る
  3. C各スレッドがprintfで出力した値を、CPU側のプログラムが変数として読み取る
答えと解説を見る

正解:B. カーネルが結果をGPUのメモリ上の配列に書き込み、CPU側はカーネルの終了後にその配列をCPUのメモリへコピーして(またはユニファイドメモリを読んで)受け取る

GPUカーネルは多数のスレッドが同時に実行するので、1つの戻り値で結果を返すことはできず、CUDAでは__global__の関数の戻り値の型はvoidと決められています。CPU側はGPUのメモリに配列を確保してそのポインタを引数で渡し、各スレッドは担当する要素に結果を書き込みます。カーネルの起動は非同期なので、カーネルが終わってからcudaMemcpyなどで配列をCPU側へコピーします(同じストリームなら、コピーは前のカーネルの終了を待ちます)。カーネルの中のprintfは表示のためのデバッグの手段で、その値をプログラムで受け取ることはできません。

  • A. __global__の関数の戻り値はvoidと決められています。
  • B. 正しい。結果はメモリを通して受け取ります。
  • C. printfは表示するだけで、出力をプログラムの値としては使えません。
この分野を解く 分野ページへ

関連する計算ツール

GPUプログラミングの参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

GPUプログラミングのほかの問題

  1. 1つのスレッドブロックあたりのスレッドの数の上限が1024本のGPUで、blockDim.xを2048にしてCUDAのカーネルを起動した。一般にどうなるか。
  2. GPUのSMに命令を出す仕組みが1つあり、1サイクルに1つのワープから命令を出せるとする。各ワープは「20サイクル分の命令を出したあと、メモリの読み込みの結果が届くまで400サイクル待つ」ことを繰り返す。ワープの切り替えに時間がかからないとき、メモリの待ちによる空き時間をなくす(レイテンシ隠蔽)のに必要なワープの数は最低いくつか。
  3. CPUとGPUの設計の考え方の違いとして正しいものはどれか。
  4. GPUで速く処理できる仕事の特徴として最も適切なものはどれか。
  5. GPUで実行すると効率が悪くなりやすい処理はどれか。

この分野の比較