コンピュータアーキテクチャの話 (348) 複数のデータの処理を一度に行うGPUのメモリアクセス
GPUは、Single InstructionでMultiple Thread方式であるので、複数のデータの処理を行う。入力オペランドをレジスタファイルから読み、演算を行って結果をレジスタファイルに書き込む命令の場合は、スレッドごとにレジスタがあるので、並列に実行することに問題はない。
しかし、レジスタに格納されているデータをアドレスとして使ってメモリをアクセスする場合は、一般的には、スレッドごとに異なるアドレスにアクセスする必要がでてくる。このとき、32スレッドがアクセスするアドレスがどのようになっているかでメモリアクセスの効率が変わってくる。
図3-43は、32スレッドのアクセスを1回で処理できるケースを図示したもので、一番上の図は128バイト境界から32スレッドが連続のアドレスをアクセスするというケースである。この場合は、各スレッドのデータサイズは4バイトであるので、32スレッドすべてのアクセスが128バイトの範囲に収まる。
連続アドレスでなくとも、32スレッドのアクセスが1つの128バイトのラインに収まっている場合も、1回で処理ができる。また、Loadの場合は、すべてのアクセスが同一アドレスのデータを読む場合も、全スレッドに同じデータを送ればよいので問題はない。
複数のスレッドが同じアドレスに書き込みを行う場合も1回で処理できるが、どのスレッドの書き込みデータが書かれるかは不定というのが一般的である。
図3-44は1回のメモリアクセスだけでは処理できず、複数回のメモリアクセスが必要となるケースである。
128バイトの連続アドレスのアクセスでも、スタートするアドレスが128バイト境界にアラインされていない場合は、上側の図のように、連続した2つのラインのアクセスが必要になる。また、下側の図のようにアクセス先がばらばらで3つ、あるいはそれ以上のラインへのアクセスが必要になるケースも発生する。このように複数回のメモリアクセスが必要になるケースでは、NVIDIAは2回目以降のアクセスを「リプレイ(Replay)」と呼んでいる。リプレイが必要になると、メモリアクセスの回数が増えるため、その分、命令の実行時間が長くなる。なお、レジスタに格納されたデータが違えば、アドレスのばらばら具合は異なるので、同じプログラムでもリプレイの回数も異なってくる。最悪、全部が別々の128バイトブロックに分かれてしまうと、最初のアクセス+31回のリプレイが必要になり、メモリアクセスに非常に長い時間が掛かるということも起こる。
これらの複数回のアクセスの順序や、2つのアクセスの間に他のメモリアクセスが入らないことなどは保証されないのが一般的である。
関連リンク
-
new
朝日奈央、新川優愛にコーヒーをぶっかけられる 演技に反響「かけ方えぐすぎ」「とんでもねぇ量」『妻を引退します』第1話【ネタバレあり】
-
new
浜口京子、私服コーデに“500万超え”表示 デザイナー友人のパーティ訪問ショットに「超センスいい〜!」「自分に似合う服をよく分かっている」
-
new
藤本美貴、長男長女は近視 教師からの連絡で眼科へ「早めに行ってよかった」
-
「次元が違う深刻さ」タイムズ160万件の免許証画像流出に専門家が警鐘「勝手に借金で『ブラックリスト』に」
-
「幸せなはずの結婚式準備が地獄に…」何もかも妻に押し付けて手伝う気がない夫。ある日、さすがに限界を迎えて相談するが⇒「最小限の結婚式にしろ!お前は芸能人気取りか!」と怒鳴られて・・・