こんにちは、hr-kです。 今回は計算プログラムの高速化、特にプログラムの並列化可能性に着目した話をしたいと思います。 計算を高速化する方法は大まかに3通りあります。
各CPUを上手に使う(CPU内部でのスレッド構造や型などをうまく利用)
単純にCPUの性能をよくする
coreに仕事を振り分けて並列化する
1,2は深い知識、もしくはお金が必要ですが、3はOpenMPやopenMPIといったソフトを利用することで お手軽に実行できます。
並列化可能性
ただし並列化には向き不向きがあり、因果関係がない事象は並列化可能ですが、因果関係のある事象は並列化できません。身近な例えで見てみましょう。
ケーキを作る時に、生地を作ること、フルーツを切ること、ホイップクリームを作ることは別々の人 が同時に実行可能(並列化可能)ですが、生地を焼くことと焼きあがった生地にホイップクリームを塗ることは同時にはできません(並列化不可能)。
並列化の向き不向き
このように、並列化による高速化には向き不向きがあります。 因果関係がある処理(例えばAが終わってからその結果を用いてBなど)の場合には効力を発揮できませんが、 因果関係がない処理(複数のリードをリファレンスにマッピングする時など)を大量にする場合にはすごく強力なツールとなってくれます。
ソースの中で並列化可能な部分の見極めには多少の慣れは必要ですが、計算は飛躍的に早くなるので、ぜひ試してみてください。