私は私だけのみかた

しかし真に利己的に行動することは尋常の知性では難しい。

とりあえず内側から…?いや、私は外側からです

http://d.hatena.ne.jp/shi3z/20070926/1190759819
去年の記事ですが「駄文にゅうす」で挙げられていたので、私の場合はどうかというのを書いておきます。
「なんか遅い」という、自分が書いたのではないコードの塊をぽいと渡され、アルゴリズムは触る余地がないと仮定。環境はIntelAMDが前提。

  1. ベンチマークを書く(テストも。)ベンチマークの中身が超重要。何に対して速くするかがここで決まってしまうので。
  2. プロファイルを取る
  3. ホットスポットを確定
  4. 並列化可能なところを探す
  5. ホットスポットを含む、なるべく大きなコードの塊をまず並列化。後で切るかもしれなくてもまず並列化。戻せるようにはしておく。
  6. スレッドプロファイラでちゃんと並列化できているか確認
  7. もっかいプロファイルを取る
  8. 大体どっかでメモリが律速になってるんでそこを含む部分でアクセスパタンがリニアにできないか考え、できればする。
  9. 最内周ループから順番に手をつける。ベクトル化できればベクトル化する。あらゆる最適化を試してコードにやたら手を入れる。Intelさんパイプラインシミュレータ出してください。AMDさんは出してますよ。しかも無料で。VTune有料なんだから機能で負けないでくださーい。
  10. 並列化の粒度はこれで良いんじゃろかということで変えられるなら変えてみる。
  11. 並列化を効かせるデータサイズを探ってデータ少ないときには1スレッドで走るように調整。
  • なんというか、とにかく並列化。ちょっとお金出すだけで今のPCは演算能力10倍近くにできるんだからとにかく並列化。
  • 次はメモリ。とにかくメモリの読み書きを減らす。32bitOSだとレジスタが少ないです(泣)1次キャッシュ広くしてください(哀)DDR3早く普及してください!
  • 分岐は今となってはPentium4の時ほど神経質にならなくても良いので、メモリアラインメントに気をつける次ぐらいで。
  • 実は0.として「IPPで代用できないか調べる」というのがあったり。