Upgrade to Pro — share decks privately, control downloads, hide ads and more …

メモリのおはなし

ottan
January 17, 2020

 メモリのおはなし

プログラミングでメモリアクセスするときのハードウェア的な基礎知識について

ottan

January 17, 2020
Tweet

More Decks by ottan

Other Decks in Programming

Transcript

  1. 記憶デバイスの階層構造 • 記憶デバイスは階層構造 • 1階層さがるたびに1桁遅くなる • できるだけ上で済ませたほうがは やい • クラウドだとディスクに見えてもネッ

    トワークの先だったり… 1ns〜 5ns〜 100ns〜 1ms〜 10ms〜 10ns〜 イラスト ©ちぇす https://commons.wikimedia.org/wiki/File:Memory_hierarchy.svg
  2. 行列ベクトル積のメモリアクセス パターン i-j ループ a b j-i ループ a b

    • iとjを交換するとループが行方向から列方向に変化 • 列方向だとメモリ上のアクセスパターンが飛び飛びになる!
  3. メモリの帯域をつかいこなす • 必要になる前からメモリを先読みして余った帯域を有効活用! • ソフトウェア プリフェッチ メモリから持ってくるデータを専用の命令で指定して取得 • ハードウェア プリフェッチ

    CPU がメモリへのアクセス傾向を判断して自動で取得 ただし、メモリ上で連続したアクセスをする必要がある 複数のストリームもサポート x86 も arm も最近のアーキテクチャだとだいたいある
  4. padding 時のプリフェッチの動作 • 無駄に要素にパッド入れた構造体に変えたデモ https://gist.github.com/ottan/9b3ce7593c8dad18b44a11ea182f091c • float64 の 8 byte

    からパッド入れた構造体 16 byte に • ストライドがキャッシュのラインサイズ以下なら先読みしてくれるっぽい?
  5. CPU 追補 • 最近の CPU はそれぞれのコア群の下にメモリを配置したりする 1 CPU なのに 分散メモリ!

    (NUMA) • mysql あたりだと、ちゃんと NUMA に対応できてないので、 処理を行うコアの近くのメモリを使うような仕組みにはなってない… • NUMA にちゃんと対応するにはミドルウェアから頑張らないと… • Go は? NUMA-aware scheduler for Go https://docs.google.com/document/u/0/d/1d3iI2QWURgDIsSR6G2275vMeQ_X7w-qxM2Vp7iGwwuM/pub https://news.ycombinator.com/item?id=12459508 MEM NODE
  6. 参考文献 • Intel® 64 and IA-32 Architectures Optimization Reference Manual

    https://software.intel.com/sites/default/files/managed/9e/bc/64-ia-32-architectures-optimization-manual.pdf • インテル® 64 および IA-32 アーキテクチャー 最適化リファレンス・マニュアル参考訳 https://www.isus.jp/wp-content/uploads/pdf/64-ia-32-architectures-optimization-manual-April2018-040JA.pdf