コンピュータアーキテクチャの話 (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つのアクセスの間に他のメモリアクセスが入らないことなどは保証されないのが一般的である。
関連リンク
-
《瑶子さまもご信頼》元政治難民の少年が皇族、首相夫妻、Snow Manの衣装を担当するデザイナーに…仏・オルセー美術館で作品発表も
-
ワールドカップ優勝に沸くスペイン、王妃が選んだのは「2着の赤」
-
【爆風スランプ インタビュー】今の時代だからこそ“のろし”を上げる理由とは――新作ミニアルバムを携えて35年ぶりの武道館公演へ「僕らにとって、武道館は再スタート」
-
シン・ミナ、芯の強さを感じさせる真っ赤なドレス姿で圧巻 韓国ドラマ『再婚承認を要求します』プレティザービジュアル解禁
-
new
中尾明慶、妻・仲里依紗にもらった誕生日プレゼントを披露 「俺は里依紗が好きだから…」“大喜びの理由”にネットときめく「センス素敵~!」「ほんと推せる夫婦」