GPUプログラミング
スレッド・ブロック・ワープの階層、共有メモリ、メモリ合体アクセス、ワープ内の分岐、占有率など、GPUプログラミングの原理を3択問題で学べます。
—あなたの正答率
0 / 50解いた問題
GPUプログラミングの要点
GPUは、数千から数万のスレッドを同時に動かして、同じ処理を大量のデータにまとめて行うのが得意なプロセッサです。プログラムはグリッド・ブロック・スレッドの階層で並列性を表し、ハードウェアは32本程度のスレッドをワープという単位で同じ命令で動かします。
性能を引き出すには、隣のスレッドが隣のアドレスを読むメモリ合体アクセス、ブロック内で共有するオンチップの共有メモリ、ワープ内の分岐を避ける工夫、メモリの待ち時間を隠すための占有率の確保などが重要です。製品の世代に左右されない原理を中心に学びます。
GPUプログラミングの問題一覧(50問)
- CPUとGPUの設計の考え方の違いとして正しいものはどれか。
- GPUで速く処理できる仕事の特徴として最も適切なものはどれか。
- GPUで実行すると効率が悪くなりやすい処理はどれか。
- CUDAなどのGPUプログラミングでいう「カーネル」の説明として正しいものはどれか。
- CUDAのスレッドの階層の組み合わせとして正しいものはどれか(大きい順)。
- CUDAのカーネルで上の式により各スレッドの番号iを求める。blockIdx.x=2、blockDim.x=256、threadIdx.x=5のスレッドのiはいくらか。
- 要素数1000の配列を、1ブロック256スレッドで1スレッド1要素ずつ処理したい。起動するブロックの数として正しいものはどれか。
- 上のCUDAのカーネルで「if (i < n)」を入れている理由として正しいものはどれか。
- NVIDIAのGPUで、32本のスレッドを1つの束にして、同じ命令を一斉に実行する単位を何と呼ぶか。
- GPUのSIMT(単一命令・複数スレッド)の方式と、CPUのSIMD命令の違いとして正しいものはどれか。
- 1つのワープの中で、条件分岐によってスレッドの半分がif側、残りの半分がelse側に分かれた(ワープダイバージェンス)。一般にどう実行されるか。
- 上の(1)と(2)は、どちらもスレッドの半分にA、残りにBを実行させる。ワープの効率の点で正しい説明はどれか(1ワープ32スレッドとする)。
- GPUのメモリ合体アクセス(コアレッシング)の説明として正しいものはどれか。
- 各スレッドの番号をiとして、上のように32要素おきに配列を読むと、a[i]を読む場合に比べて遅くなる。主な理由はどれか。
- 粒子の位置x、y、zを持つデータをGPUで処理するとき、メモリ合体アクセスの点で有利な並べ方はどれか。
- CUDAの共有メモリ(シェアードメモリ)の特徴として正しいものはどれか。
- CUDAの__syncthreads()の働きとして正しいものはどれか。
- CUDAで、__syncthreads()を「if (threadIdx.x < 16)」の中に書き、一部のスレッドだけが通るようにした。起こりうることとして正しいものはどれか。
- CUDAの共有メモリのバンク競合の説明として正しいものはどれか。
- 32×32のfloatの表を共有メモリに置き、ワープの32本で列の方向(縦)に読むとバンク競合が起きる。よく使われる対策はどれか。
- GPUで大きな行列の積を計算するとき、行列を小さなタイルに分けて共有メモリに読み込む理由として正しいものはどれか。
- GPUのカーネルで、1スレッドあたりのレジスタの使用量が多すぎると起こりうることとして正しいものはどれか。
- GPUの占有率(オキュパンシー)の説明として正しいものはどれか。
- GPUがメモリの長い遅延(数百クロック)を隠す主な方法として正しいものはどれか。
- GPUの占有率について正しいものはどれか。
- CUDAで、ブロックとSM(ストリーミングマルチプロセッサ)の関係として正しいものはどれか。
- CUDAで、カーネルの途中で、ほかのすべてのブロックの計算が終わるのを待ってから次の段階に進みたい。一般的な方法はどれか。
- GPUで画素の値のヒストグラムを作るとき、全スレッドがグローバルメモリの256個のビンにatomicAddで直接足すと遅いことがある。改善の方法として正しいものはどれか。
- GPUで多数の値の総和を求めるとき、木の形のリダクション(隣どうしを足して半分にすることを繰り返す)を使う理由として正しいものはどれか。
- 1024個の値を木の形のリダクションで合計するとき、必要な段の数はいくつか。
- 単体のGPUを使うプログラムで、CPU側のメモリとGPU側のメモリについて一般的に正しいものはどれか。
- 配列の要素を1回だけ足し算するような軽い処理のためにデータをGPUへ送ると、CPUで計算するより遅くなることがある。主な理由はどれか。
- CPUのメモリをピン留め(ページロック)してからGPUへ転送すると速くなる理由として正しいものはどれか。
- CUDAのストリームを複数使う主な目的はどれか。
- 非常に小さなカーネルを何千回も続けて起動するプログラムが遅いとき、改善の方法として最も適切なものはどれか。
- CUDAのユニファイドメモリ(統合メモリ)の説明として正しいものはどれか。
- GPUで2つの大きな配列の要素ごとの足し算(c[i] = a[i] + b[i])を行うとき、性能を主に決めるものはどれか。
- 家庭用のゲーム向けGPUの多くで、倍精度(FP64)の計算性能が単精度(FP32)よりずっと低い(数十分の一など)理由として最も適切なものはどれか。
- 最近のGPUに搭載されているテンソルコア(行列演算ユニット)の特徴として正しいものはどれか。
- GPUの混合精度の計算で、掛け算をFP16などの低い精度で行い、足し合わせ(累積)をFP32で行うことが多い理由として正しいものはどれか。
- GPUで同じデータの浮動小数点数の総和を求めたところ、実行するたびに結果の最後の桁がわずかに違った。最も考えられる原因はどれか。
- CUDAで1ブロックあたりのスレッドの数を決めるときの一般的な目安として正しいものはどれか。
- 上のようなループ(グリッドストライドループ)でカーネルを書く利点として正しいものはどれか。
- CUDAの定数メモリ(コンスタントメモリ)が特に速く働くのはどのようなアクセスのときか。
- GPUのキャッシュについて、CPUと比べた一般的な特徴として正しいものはどれか。
- NVIDIA以外のGPUでも使える、GPUなどの並列計算のためのプログラミングの仕組みの例として正しいものはどれか。
- GPUで、条件に合う要素だけを配列から取り出して別の配列に詰めて書き出したい(各スレッドが出力する数は0か1)。各スレッドの書き込み先の番地を決めるのによく使われる並列の計算はどれか。
- GPUのカーネルを書くときに守るべき前提として正しいものはどれか。
- GPUで大きな行列を転置する(b[j][i] = a[i][j])とき、共有メモリを経由させる主な目的はどれか。
- CUDAで、CPU側のプログラムがカーネルを起動した直後の動作として一般に正しいものはどれか。