4

C# で 3x3 回転と 4x4 変換行列を行う最も効率的な方法matrix * matrixと操作を探しています。matrix * vector

現在、行列を多次元配列 ( new double[3,3]new double[4,4]) に格納しています。それを変更することに完全に反対しているわけではありませんが、可能であれば構文を維持したいと考えています。ネストされた 3 つの標準 for ループを使用した現在の乗算は正常に機能しますが、ボトルネックになる可能性があります。

これまでの私の考え:

  • Strassen のような最適化されたアルゴリズムは、これらのサイズでは実用的ではありません
  • 単一の 4x4 乗算のレベルでも、並列化はあまり意味がありません。より高いレベルで行われたほうがよい。
  • 境界チェックの効率が悪いため、c# では多次元配列が遅くなりました (だったでしょうか?) が、これは安全でないポインター演算で克服できます。(この情報がどの程度最新のものかはわかりません)
  • 回転行列は対称的ですが、それを悪用する方法はありますか?
  • おそらく最大の利点は、キャッシュの局所性を使用して、メモリ内で互いに近い値が一緒にアクセスされるようにすることで達成できます。しかし、これを行う方法がわかりません。

安全でない、固定された、3 つの for ループを使用して独自のソリューションをハックする前に、この標準的な問題に対してテスト済みで最適化されたソリューションが既に存在しますか?

または、私が見落としている他の最適化はありますか?

4

2 に答える 2

1

パフォーマンスのためにMicrosoft C#にしたい場合は、そうします。

  • ループを広げます。ループを使用せず、すべて書き出してください。これは、これらの小さな固定サイズの乗算で実現可能です。
  • 最初の提案を適用した後、Unsafe Fixed バージョンを試してください (これは多くの高速配列アクセスにとって依然として重要です)。

Mono の場合、Mono.SIMD ライブラリは一見の価値があるかもしれません。

GPU を使用した並列処理は、これらの多くを同時にオフロードできる場合に適しています。C# については、http: //www.hybriddsp.com/Products/CUDAfyNET.aspx を調べますが、他にもあるかもしれません。私はまだ C# から GPU を使ったことはありませんが、これが私の出発点になります。

于 2013-04-08T11:00:56.653 に答える