とりあえず内側から…?いや、私は外側からです
http://d.hatena.ne.jp/shi3z/20070926/1190759819
去年の記事ですが「駄文にゅうす」で挙げられていたので、私の場合はどうかというのを書いておきます。
「なんか遅い」という、自分が書いたのではないコードの塊をぽいと渡され、アルゴリズムは触る余地がないと仮定。環境はIntelやAMDが前提。
- ベンチマークを書く(テストも。)ベンチマークの中身が超重要。何に対して速くするかがここで決まってしまうので。
- プロファイルを取る
- ホットスポットを確定
- 並列化可能なところを探す
- ホットスポットを含む、なるべく大きなコードの塊をまず並列化。後で切るかもしれなくてもまず並列化。戻せるようにはしておく。
- スレッドプロファイラでちゃんと並列化できているか確認
- もっかいプロファイルを取る
- 大体どっかでメモリが律速になってるんでそこを含む部分でアクセスパタンがリニアにできないか考え、できればする。
- 最内周ループから順番に手をつける。ベクトル化できればベクトル化する。あらゆる最適化を試してコードにやたら手を入れる。Intelさんパイプラインシミュレータ出してください。AMDさんは出してますよ。しかも無料で。VTune有料なんだから機能で負けないでくださーい。
- 並列化の粒度はこれで良いんじゃろかということで変えられるなら変えてみる。
- 並列化を効かせるデータサイズを探ってデータ少ないときには1スレッドで走るように調整。