日記

最適化って難しい

SSEを明示的に使うようにしたらどのくらい高速化するかを、何種類かテストコードを書いて計測するというのを最近やってたんだけど、
結果的には、Intrinsic関数(接頭辞_mmなアレ)を使い始めたばかりの素人である私が部分的にSSEを使うように書くより、何も考えずに書いてコンパイラの自動最適化に任せた方がたいていの場合微妙に速いという結論に達した。

もちろんCPUの構造や命令を知り尽くした人がプログラムの全体的な構造が変わるくらい気合を入れて書けば、コンパイラの自動最適化より速くなると思うけど、私自身がその領域に達せるかどうかが怪しい。興味の上で優先度が高いものが他にあるし。

あと、GPGPUに関しても同じで前回のソートの比較でもそうだだったけど、なかなか性能を引き出すのが難しい。

GPUとCPUではカタログスペック上ではFLOPS値に大きな差があっても、実際はそこまでの差は出ない。
というか最近のハイエンドCPU・GPU同士だとカタログスペック上で比較しても10倍前後ぐらいしか差がないんじゃなかろうか。(2GPUを1ボードに収めたものとか電力的に無茶してるものとかも含めると20倍ぐらいまで広がるかも)
で、GPUはCPUに比べて柔軟性が低いので実性能で2〜3倍程度に収まるという場合が多い気がする。
まぁそれでも2倍〜3倍速くなるならチャレンジする価値はあるけど、そこまで劇的ってわけじゃない。

ただしGPUにハードウェア実装されてるテクスチャフィルタリング機能を有効に活かせる用途ならもっと差が出るかもしれない。
しかしどちらにしろメモリ帯域という限界があるので、ちゃんと最適化したGPUコード vs ちゃんと最適化したCPUコードだと5倍前後ぐらいまでしか差が出ないんじゃなかろうか。

もちろんこれは最近のハイエンドCPU・GPUを想定(というかちゃんと調べずに書いてるので妄想?)しての事なので、CPUがしょぼいならGPUを使った方がいいだろうしその逆もしかり。

この問題に全ての場合に通用するような答えはないので、いろんな手法をそれなりに使えるようになっといた方がいいんだろうな。
CPUオンリーなら、とりあえずコンパイラの最適化能力を信じてみて、それでも満足行かないならまずアルゴリズムの改良で高速化出来ないか考えるべきで、SSEやマルチスレッドに手を出すのはその後がいいだろう。
ただ、SSEやマルチスレッドを前提としたアルゴリズムの改良ってのもあるので順番が難しいんだけど。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください