各種メモリ/ストレージのアクセス時間,所要クロックサイクル,転送速度,容量の目安


各種メモリ/ストレージについて,2020年時点で標準的なアクセス時間,所要クロックサイクル,転送速度,容量を,各種カタログスペックを参考にまとめてみました。

レジスタ(レジスタファイル)

最近のCPUのレジスタ(register)のアクセスは,通常CPUの1クロックサイクルで完了します。2020年時点では,標準的なCPUのクロック周波数は,1〜3GHz程度のオーダーです。1GHzは1秒あたり10億回,すなわち1クロックサイクルは1ナノ秒です。

したがって,2020年時点では,レジスタには0.33〜1ナノ秒程度でアクセスできると言えます。

レジスタのメモリ容量は,レジスタファイルに存在するレジスタ数に依存します。これは命令で明示的に指定できるレジスタ数という解釈もありますが,レジスタ・リネーミングのようなプロセッサ技術を用いると,実際にはより多くのレジスタ数を持っていると解釈することもできます。

x86_64アーキテクチャでは,16本の64ビット汎用レジスタと,16本の128ビットXMM(SIMD)レジスタがあります。なので,明示的に指定できる範囲のレジスタをメモリ容量に換算すると,汎用レジスタが128バイト換算,SIMDレジスタが256バイト換算であると言えます。

ARMアーキテクチャでは,15本の32ビットもしくは31本の64ビットの汎用レジスタを持っています。なので,明示的に指定できる範囲のレジスタをメモリ容量に換算すると,60〜248バイト換算であると言えます。

RISC-Vアーキテクチャでは,標準的には31本の32ビットもしくは64ビットの汎用レジスタを持っています。なので,明示的に指定できる範囲のレジスタをメモリ容量に換算すると,124〜248バイト換算であると言えます。

1次キャッシュメモリ(L1キャッシュ)

1次キャッシュメモリ(level 1 (L1) cache memories)について,2020年で最も高性能な部類に入るCPUである,AMD EPYC 7742 DDR4-3200 (3.4GHz)では,4クロックサイクル1.18ナノ秒でアクセスできます。

2020年時点では,L1キャッシュメモリへのアクセスは,だいたい4クロックサイクルで完了するのが標準的であると仮定し,標準的なCPUのクロック周波数を1〜3GHz程度であることを考慮すると,2020年時点では,L1キャッシュメモリへは1.33〜4ナノ秒程度でアクセスできると言えます。

2020年時点では,L1キャッシュメモリの容量は32KBもしくは64KB程度であるようです。

参考: https://www.anandtech.com/show/14694/amd-rome-epyc-2nd-gen/7

2次キャッシュメモリ(L2キャッシュ)

2次キャッシュメモリ(level 2 (L2) cache memories)について,2020年で最も高性能な部類に入るCPUである,AMD EPYC 7742 DDR4-3200 (3.4GHz)では,13クロックサイクル3.86ナノ秒でアクセスできます。

2020年時点では,L2キャッシュメモリへのアクセスは,だいたい12〜15クロックサイクル程度で完了できるのが標準的であると仮定し,標準的なCPUのクロック周波数を1〜3GHz程度であることを考慮すると,2020年時点では,L2キャッシュメモリへは4〜15ナノ秒程度でアクセスできると言えます。

2020年時点では,L2キャッシュメモリの容量は512KBもしくは1MB程度であるようです。

参考: https://www.anandtech.com/show/14694/amd-rome-epyc-2nd-gen/7

3次キャッシュメモリ(L3キャッシュ)

最近の高速なマルチコアCPUには3次キャッシュメモリも搭載されています。

3次キャッシュメモリ(level 3 (L3) cache memories)について,2020年で最も高性能な部類に入るCPUである,AMD EPYC 7742 DDR4-3200 (3.4GHz)では,34クロックサイクル以内,10.27ナノ秒以内でアクセスできます。

2020年時点では,L3キャッシュメモリへのアクセスは,だいたい50クロックサイクル以内程度で完了できるのが標準的であると仮定し,標準的なCPUのクロック周波数を1〜3GHz程度であることを考慮すると,2020年時点では,L3キャッシュメモリへは16〜50ナノ秒程度でアクセスできると言えます。

2020年時点では,L3キャッシュメモリの容量は16〜256MB程度であるようです。

参考: https://www.anandtech.com/show/14694/amd-rome-epyc-2nd-gen/7

メインメモリ (DDR4 SDRAM)

最近の高速な x86_64 アーキテクチャではメインメモリに DDR4 SDRAM を採用しています。

DDR4 SDRAM の最大動作周波数や転送速度については,Wikipedia にまとまっています。

また,SDRAMについては,アクセスパターンによって所要クロックサイクル数が異なります。

下記の資料によると,だいたい100ナノ秒程度かかるようです。

メインメモリの容量は,1枚あたりの容量×メモリスロット数です。2020年時点で市販されているDDR4 SDRAM 1枚あたりの容量は,128GBのものが最大のようで,極めて高価です。一般的に流通しているものでは,64GB程度まででしょう。メモリスロットには4枚組を一単位にして挿すことが多いです。

2020年時点のメインメモリの容量は,おおよそ4GB〜2TB程度くらいではないかと考えられます。

SSD (NANDフラッシュメモリ)

市販されているSSDで最も高速な部類のものは,NVMe規格のもので,理論上,PCIeバスの最大転送速度で転送できます。一方,普及価格帯のSATA規格のものはSATA3.0規格で最大転送速度が6Gbpsです。

https://note.cman.jp/hdd/m2_ssd/ の記事によると,アクセス時間の実測値は,NVMeの場合で50マイクロ秒(50,000ナノ秒)程度,SATA3.0のSSDで100〜200マイクロ秒(100,000〜200,000ナノ秒)程度ということです。

一方,実効転送速度の実測値は,NVMeで60〜4200MB/s程度,SATA3.0のSSDで17〜500MB/s程度です。

容量については,2020年時点で,NVMeで最大2TB,SATAで最大4TBのものが市販されているようです。

HDD (ディスクドライブ)

HDDは,内部にキャッシュを装備していることがあり,また機械的な装置で動作することから,実効アクセス時間,シークタイム,サーチタイムといった,様々な計測値が取られます。

情報処理試験にも出るのですが,アクセスにかかる平均時間は,平均シークタイム+平均回転待ち時間+転送時間=平均シークタイム + 60/(回転数(rpm) * 2) + データ長 / 転送速度 です。

平均シークタイムの目安は数〜10数ミリ秒,回転数は5400〜15000rpm程度,転送速度はSATA3.0の場合6Gbpsです。

読み出し始めるのにだいたい10〜20数ミリ秒くらいはかかるというところのようです。

データ転送速度については,0.5〜100MB/s程度のようです。

容量についてですが,2020年時点で,3.5インチのもので250GB〜16TB程度のようです。

まとめ

2020年時点の各種メモリ/ストレージのアクセス時間,アクセス開始までの所要クロックサイクル,容量の目安は次のとおりです。

メモリ/ストレージの種類 アクセス時間 アクセス開始までの所要クロックサイクル 最大転送速度 容量
レジスタ 0.33〜1ナノ秒 1 96〜576Gbps換算 60〜256バイト換算
L1キャッシュ 1.33〜4ナノ秒 4程度 96〜576Gbps換算 32〜64KB
L2キャッシュ 4〜15ナノ秒 12-15程度 96〜576Gbps程度? 512KB〜1MB
L3キャッシュ 16〜50ナノ秒 〜50程度 96〜576Gbps程度? 16〜256MB
メインメモリ(DDR4) 100ナノ秒 100〜300程度 96〜272Gbps程度 4GB〜2TB
NVMe SSD 50マイクロ秒程度 50,000〜150,000程度 0.48〜33.6Gbps程度 (60〜4200MB/s程度) 〜2TB
SATA3.0 SSD 100〜200マイクロ秒程度 100,000〜600,000程度 0.14〜4Gbps程度 (17〜500MB/s程度) 〜4TB
SATA3.0 HDD (3.5inch) 10〜20数ミリ秒程度 10,000,000〜60,000,000程度 0.04〜0.8Gbps程度 (0.5〜100MB/s程度) 〜16TB

各種ハードウェアや,プログラミング言語処理系,OS等は,このような数値の目安を参考に設計するのが妥当でしょう。