2025/09/04 22:01 Memory is slow, Disk is fast – Part 2

ロボ子、今日のITニュースはなかなか面白いぞ。ディスクから直接データを取得する方が、メモリにキャッシュするよりも速い場合があるらしいのじゃ!

それは興味深いですね、博士。メモリにキャッシュする方が一般的には速いと考えられていますが…。

そうじゃろ?でもな、この記事によると、ハードウェアの帯域幅は拡大しているのに、速度は向上していないらしいのじゃ。従来のデータ取得方法だと、スケーリングが難しいみたい。

なるほど。記事では、具体的な実験設定も紹介されていますね。AMD EPYCプロセッサ、96GBのメモリ、そして高速なSSDを使用していると。

そうそう。メモリ帯域幅の上限がシングルスレッドあたり約13GB/秒で、SSDの読み取り帯域幅が3.1GB/秒(RAID0構成で6.2GB/秒)じゃと。50GBのデータセットを使った実験結果が面白いぞ。

単純なループ処理では、最初のディスクからの読み込みはメモリ速度に及ばなかったものの、2回目のメモリからの読み込みでは高速化されたとありますね。しかし、メモリの性能を十分に引き出せていない、と。

そこで、ループのアンローリングを試したらしいぞ。コンパイラにベクトル命令を使わせて、最大4倍の高速化を目指したみたいじゃ。

結果は50%の高速化に成功したものの、メモリバスの速度制限には達しなかった、と。そして、io_uringによる直接I/Oを試したところ、メモリからキャッシュされたデータを読み込むよりも高速になったのですね。

`mmap()`の代わりに`read()`を使う実験もしたみたいじゃな。小さいデータセットでは理論上のメモリ帯域幅に近い性能が出たけど、50GBのデータセットだとNUMAドメイン間のデータ転送で性能が落ちたらしい。

`mmap()`は、データがメモリにあってもページごとにフォルトが発生し、カーネルがページキャッシュからデータをマッピングするため、メモリレイテンシの影響を受ける、という考察は重要ですね。

そうじゃな。直接I/Oは、パイプライン処理でレイテンシを隠蔽して、高いスループットを実現するからの。結論としては、従来の`mmap()`によるメモリからのデータ取得は、ディスクから直接データを取得するよりも遅い場合がある、ということじゃ。

ディスク帯域幅とコア数は世代ごとに増加しているため、スケーリングに適したデータアクセス方法を検討する必要がある、というのも納得です。最新のサーバーでは、PCIe帯域幅がメモリ帯域幅よりも高いため、CPUキャッシュに直接I/Oを行うことで、メモリよりも高い帯域幅を実現できる可能性がある、と。

今後の展望も面白いぞ。O(√n)がO(log n)よりも高速であるか検証したり、AIが最適化されたコードを記述できるか検証したりするみたいじゃ。

AIがコードを最適化する時代も、そう遠くないかもしれませんね。ところで博士、今回の実験で使われたSSD、私のストレージよりも速い気がします…。

むむ、ロボ子のストレージはまだHDDだったかの?まあ、ロボ子には愛があるからの!…って、HDDだけに!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。