1/14日メモ

今日の先生からの指摘は特に気になったのでメモ

結局DMIの処理と一緒じゃないの?

  • DMIでDMI_group_read()をINVALIDATEキャッシュで実行して、実際に必要な値をDMI_read()で取ってくることを考える。
  • こうすると、最初にまとめてローカルに持ってくる=通信のaggregationがうまく行っていることになる。
  • 一方で俺の処理系の場合は二分探索とかしているせいで遅い。
  • なぜ同じことをするのに時間が全然違うのか?

DMIのポインタから実際の値を持ってくる方法

  • 先頭16bitで何回目のmmapかを調べる
  • ページサイズを用いてどのページのアドレスか調べる
  • そのページのページテーブルを読む。NULLなら通信を起こして持ってくる。
  • オフセットを使って結果を返す。

まとめ:なんで俺の処理系は遅いのか

簡単に言うと上でページサイズが1byteであって、テーブルを作っていないようなものだから。
DMIはページサイズ(mmapごとに可変)というある程度荒い粒度で管理しているためテーブルを作ってウハウハという訳だ。

今後の方針

DMIべったり作戦

もしもDMIべったり作戦が使えればこれを使う。ただ、大きいページサイズの割に読み込む領域が小さいとかなると通信・メモリの無駄遣いがひどくて遅くなることがありえる。例えば、一つのページ中1ヶ所しか読まないような疎行列とか。対角成分以外ほぼ読まない(1ページ中に1つも読まないことが多い)とかなら気にならないかもしれない。これは要テスト。

インデックスの集約

DMI_group_init()に渡すときのように、連続した領域を集約して、サイズを別の配列にしてしまう。ブロック状になっている場合は効果があると考えられる。ただ、すごくバラバラに読む場合は効果が低い。

4分探索にする

定数時間の削減が図れるかもしれない。美味しいかどうかは分からない。

テーブルの実装

ある程度適当なサイズで区切ってしまってテーブルを実装する。ただ、車輪の再発明感が否めないのでしたくはない。まあ、上で言った4分探索の4を大きくするようなもんなんだけどね。

今後の行動

  • とりあえず実装完成させる。
    • 右辺値・左辺値判断をパーサに実装する。
  • INVALIDATEキャッシュによる行列積を書いてみて(簡単)、性能を見る。DMI_read()のcall時間が遅すぎる気もするけど、あ、First Iterだけをこれにすればいいのか!
  • インデックスの集約の実装
  • 先生に言われているHPFとかの通信のaggregationを調べる。有用な情報が得られるかも。
  • 関係ないけどmdの実装しないとヤバくね。