コンピュータアーキテクチャの話 (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
『日本画アヴァンギャルド』京都市京セラ美術館で 伝統的な日本画の革新を試みた戦後京都の「前衛」の足跡
-
new
東北から“光の行進”を始めよう! MISIAが紡ぐ希望の物語――『MISIA 星空のライヴXⅢ GRAND HORIZON』開幕【オフィシャルレポート】
-
new
urema、10年ぶりの新曲「暈けた脳」新鋭レーベルOaikoより1月28日に配信リリース
-
new
「もっといい嫁選べたのにねぇ」親戚の前で、嫁を貶す義母。しかし⇒知らぬ間に【嫁の反撃】が始まっていた!?
-
ヒカキン、挙式を報告 妻&娘とのウエディング3ショット公開し結婚式を回顧「写真だけで伝わる幸せ~!」「ツマキンさん絶対美人」「感動だな」 2024年に一般女性と結婚