c#コードをチューニングしました

#1 Declined
Repository
akki
Branch
tune_csharp
Repository
aokomoriuta
Branch
fixed_force
Author
  1. Akio Takahashi
Reviewers
Description

下記のチューニングでC#の通常版、SIMD版ともに2倍くらい速くなります。 結果として、C# SIMD版とC++ SIMD版は同等くらいの速度になります。

  • Simd メソッドを最適化 (1SIMD = 4要素)
  • Simd メソッドを最適化 (1SIMD = 1要素)
  • Simd メソッドを最適化 (1SIMD = 2要素)

この3つのコミットで、SIMD版が高速化されます。

  • Normal メソッドを最適化(ループ最適化)

このコミットで通常版が多少速くなります。

  • Normal メソッドで unsafe コードを使う(あまり速くはならない)
  • Normal メソッドを最適化(Vector4 の固定長配列をフィールドとして確保)

これらのコミットで通常版が多少速くなります。

  • Normal メソッドを最適化(中間変数削除)

これらのコミットで通常版がわずかに速くなります。

Comments (3)

  1. aokomoriuta repo owner
    • 「ループ最適化」のコミットは、それを突き詰めるとtループを中で回したりしだすので、柔軟性を捨てすぎです(例えば力が固定でなくなった途端に破綻する)。
    • unsafeを使えば速くなるのは既に他の方もいっぱい試してますが、ブログにも書いた通り、私は速度のためにunsafeを使うのは好ましくないという派なので取り入れるつもりはありません。

    考慮に値するのは、定数を先にSIMDにboradcastしておく高速化(Simdメソッドを高速化の中)ぐらいですね。それだけのpull requestにしてもらえればマージします。 ちなみにaをバラしているのはどれぐらい速くなるんでしょうか?

  2. Akio Takahashi author

    すみません、メールチェックができずに返信がおくれてしまいました。失礼しました。 修正は一部取り込んでいただけたようで、ありがとうございます。 プルリクは却下していただいてかまいませんです。

    以下、返信です。マージをお願いしているつもりではありませんので念のため。

    「ループ最適化」のコミットは、それを突き詰めるとtループを中で回したりしだすので、柔軟性を捨てすぎです。

    私としては、SIMD版の実装に合わせてNormal版のロジックを最適化したつもりです。 SIMD版はC++, C#ともに単一のループで要素全体が処理されているようです。

    ちなみにaをバラしているのはどれぐらい速くなるんでしょうか?

    それなりに高速化されます。 が、速度以前に、そもそもVevtor4が配列のmallocをしていると公平な比較にならないと思って導入しました。 別解としては、予めdouble[4]を大量に確保しておいて、それをVector4初期化の時にとってくるようにする方法もあり得ると思います。

    以上です。ありがとうございました。