Peter Norvig のアドバイスを受けて、私は次の質問について熟考しています。
キャッシュ ミスがある場合とない場合で、メモリから 1 ワードをフェッチするのにどれくらいの時間がかかりますか?
(標準のハードウェアとアーキテクチャを想定。計算を簡単にするために、1 GHz クロックを想定)
Peter Norvig のアドバイスを受けて、私は次の質問について熟考しています。
キャッシュ ミスがある場合とない場合で、メモリから 1 ワードをフェッチするのにどれくらいの時間がかかりますか?
(標準のハードウェアとアーキテクチャを想定。計算を簡単にするために、1 GHz クロックを想定)
Norvigがこれに自分で答えているようです:
execute typical instruction 1/1,000,000,000 sec = 1 nanosec
fetch from L1 cache memory 0.5 nanosec
branch misprediction 5 nanosec
fetch from L2 cache memory 7 nanosec
Mutex lock/unlock 25 nanosec
fetch from main memory 100 nanosec
send 2K bytes over 1Gbps network 20,000 nanosec
read 1MB sequentially from memory 250,000 nanosec
fetch from new disk location (seek) 8,000,000 nanosec
read 1MB sequentially from disk 20,000,000 nanosec
send packet US to Europe and back 150 milliseconds = 150,000,000 nanosec
「典型的な命令を実行する」=1nsと書かれている部分は、1 GHz CPUを意味します(もちろん、効率的なパイプライン処理を想定しています)。
彼がこの情報をどこで入手したかはわかりませんが、PeterNorvigが信頼できると信じています:-)
ここに公正な要約がありますが、多少の不正確さがあります。書かれたとき (2 年以上前) で、当時のミッドレンジ PC の場合、次のように見積もられました。メモリアクセス、60ns。L1 キャッシュ、10ns。L2 キャッシュ、20 ~ 30 ns (L3 キャッシュ アクセス時間の見積もりなし)。もちろん、競合とアクセスパターンに応じて、すべてが大きく異なります(キャッシュレイヤーは通常、低速メモリから「行ごとに」満たされるため、アドレスXにアクセスしてからX + 1にアクセスすると、2番目のアクセスはキャッシュとして少し速くなる可能性があります行の充填は最初のアクセスによって開始されました)。
そしてもちろん、ハイエンドでよく調整されたサーバーは、はるかに高速になります (通常、メモリ アクセス レイテンシのそのようなマシン間の相対的な差は、「生の」CPU 速度の差よりもはるかに大きくなります)。
github.org で公開されているそのテーブルには、データの優れた視覚化があります。また、時間値の「ヒューマン スケール」再解釈もあります。
