メモリアクセスには一定のレイテンシが発生します。レイテンシを計測する際にはclock cycle単位を使います。clock cycleの具体像をつかむために例として、1GHzのプロセッサを考えてください。プロセッサは1,000,000,000 clock cycle/秒の処理ができます。
多くの場合、プロセッサは一つ以上の命令を1clock cycleで処理することができます。しかしメモリへのアクセスは、この数百倍以上の遅延が発生します。
以下は筆者が想定するクロックサイクルです。遅延がどの程度かはデバイスや使用状況によって異なり集計が面倒なため、おおよそな値でも知りたい方向けのために掲載します。あくまでも経験上のものなので、正確な数値が欲しい方は無視してください。
ローカルメモリはグローバルメモリの10倍程度の速度があると考えると良いかと思います。
参考までにIntelのi7-Xeonプロセッサの場合は以下のような数値となっています。
表2.16 「Performance Analysis Guide for Intel」の遅延統計(遅延は1 clock cycleを0.5nsとして換算)
キャッシュ | Clock | 遅延 |
L1 Cache | 4 cycles | 2ns |
L2 Cache | 10 cycles | 5ns |
L3 Cache | 40 cycles | 20ns |
L3 Cache 共有ライン | 65 cycles | 32.5ns |
L3 Cache 外部コア | 75 cycles | 37.5ns |
リモートL3 Cache | 100-300 cycles | 50-150ns |
ローカルDRAM | 60ns | |
リモートDRAM | 100ns |
つまり単純なレイテンシとする場合、ローカルDRAM(内臓GPUがCPUと共有するメインメモリ)の遅延はローカルメモリ(L3 Cache)と差が2倍程度であり、あまり変わりません。
ローカルメモリの帯域ですが、L3キャッシュの「cache bandwidth」は一般的に目安となるのが1000GB/秒程度ですので、だいたい同等と想定できます。
ではグローバルメモリ(DDR3/DDR4/GDDR5/HBM)の帯域はどれくらいになるのでしょうか?以下の表は各メーカーのGPU帯域の比較です。
機種 | バス型 | 帯域(GB/秒) |
Radeon R9 Fury X | HBM | 512 |
Radeon R9 390X | GDDR5 | 384 |
GeForce GTX Titan X | GDDR5 | 336 |
GeForce GTX 980 | GDDR5 | 224 |
GeForce GT 705 | DDR3 | 14.4 |
HD Graphics 4000 | DDR3 | 25.6 |
2014年モデルのGeForce GT 705が、14.4GB/sで、2015年モデルの最上位モデルである、GeForce GTX Titan Xが336GB/sとなり、メモリ帯域は大幅にアップしています。
さらにHBMバスを採用するRadeon R9 Fury Xでは、512GB/sとキャッシュ帯域に肉薄するほどのパフォーマンスの向上が見られます。HBM 2については、さらにローカルメモリ(L3 Cache)なみの帯域が可能となるとされています。
Intelの内蔵GPUボードはメインメモリをグローバルメモリとして使いますが、2016年時点で最新のSkylakeモデルも31GB/s(DDR4)程度であり旧式のHD Graphics 4000からそれほどの向上はありません。しかしメモリのチャンネルを増加させることで、100-200GBに帯域を増やすことが可能となります。
内臓GPUボードについては、CPUとメインメモリを共有するので、使用できるメモリ帯域は減りますが、メモリのコストは外部GPUのメモリよりも割安なので、GPUが使用できるメモリのサイズがスケールしやすいというメリットがあります。
最新の機種では、昔ほどにはグローバルメモリとローカルメモリのパフォーマンス差は存在せず、メモリレイテンシという現象を考慮する必要性は少なくなる傾向といって差し支えないかと思います。
Copyright 2018-2019, by Masaki Komatsu