CUDA プログラミング実践講座 6.8演習
説明が下手ですみません。
6.1
テキストに載ってるコードには無駄があるので改良しなさい、という問題。
まず図6.2のコードを改良したコードを次に示す。
配列のサイズのスレッドでは半分のスレッドが動作をしないので、実行コンフィギュレーションで配列のサイズの半分のスレッドを起動させる。
そうすると元のカーネルでは上手く動かないのでいくつか訂正した。
元のカーネルでは最初に偶数番目のスレッドが加算を行っていたが、半数のスレッドしかない改良版の場合、全てのスレッド番号を2倍して元のカーネルと同様の状況を作る。
またループの条件も変更した。元のカーネルのままだと最後の答えを求める前に終わってしまうので < から <= に変更した。
加えて、元のカーネルは1つのスレッドが自分の担当する配列の要素をshared memoryに格納していたがスレッド数を元の半分にしたことにより1つのスレッドが2つの要素をshared memoryに格納する必要が出て来ることに注意しなければならない。
元のコードに比べて乗算のコードを増やし、for文の条件に使われる演算子も変更した。加えてロード演算も増えたため、演算コストは増えたと思われる(不等号の演算子の変更によってコストが増えるのかはわからない)。
リソース制限については、元々のコードは配列のサイズと同数のスレッドを起動していたのでSMの最大スレッド数のサイズの配列までしか還元出来なかったが、改良したことによりその倍のサイズの配列まで還元出来るようになった。
次に図6.4のコードの改良版を示す。
先ほどのコードと同様に起動させるスレッド数は配列のサイズの半分にしている。
カーネル自体の変更はfor文の初期化の所のみ。
blockIdx.x>>1 を blockIdx.x と変更した。
先ほどの改良版と同様にロード演算が増えていることに注意。
先ほどの改良版とは異なり、演算は減ったが、ロード演算が増えた。
またリソース制限については先ほどの改良版と同様の対処が可能になった。
6.2
先ほどの2つのコードを比べて追加の演算が少ないのはどちらかという問題。
図6.2の改良版は乗算が1つ増え、ロード演算が1つ増えた。
図6.4の改良版は右シフト演算が減り、ロード演算が1つ増えた。
以上により図6.4の改良版の方が追加の演算が少ないと言える。
6.3
後日。
CUDAプログラミング実践講座 ? 超並列プロセッサにおけるプログラミング手法
- 作者: David B. Kirk,Wen-men W. Hwu,加藤諒,(株)Bスプラウト
- 出版社/メーカー: ボーンデジタル
- 発売日: 2010/11/22
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 21回
- この商品を含むブログ (1件) を見る