私は、ランタイムパフォーマンスが絶対的に重要な(リアルタイム制約を満たす必要がある)私が取り組んでいるプロジェクトにEigenを使用しています。Eigen:効率的なKroneckerプロダクト
これまでのところ、Eigenはかなり良いパフォーマンスを示しています。しかし、私はクロネッカー製品を評価する必要があります。私はEigenのサポートされていないKroneckerProductモジュールを使用していますが、私のニーズには最適ではないと考えています。
2つの行列私は、固定サイズ(コンパイル時に知られています)と構造を持つクロネッカー製品を計算しています。 1つの行列は正方行列で、対角行列です。それがIdentity行列であるとします。もう1つは小さな正方形の行列です。コードでは、このような:
MatrixXf I = MatrixXf::Identity(4,4);
MatrixXf X = MatrixXf::Random(8,8);
MatrixXf P = kroneckerProduct(I,X);
私は我々だけ多くなるので、すべての要素を(計算するためにスカラー乗算で4行列を評価する必要があるため、我々はこれより早く作ることができることを、私は推測してい対角線であるので、ゼロである)。
Eigenでこれを行う最も迅速かつ効率的な方法は何ですか?
スピードアップ。私たちはRowsAtCompileTimeを参照しているので、コンパイラがそのループをアンロールできると仮定していますか? -march = native -mtune = native -O3(私はclang ++を使用しています)以外にどのオプションを使用する必要がありますか? – NOP
'RowsAtCompileTime'を使用すると、コンパイラがループをアンロールするのに役立ちます。スピードアップは、対角線全体を計算するのではなく、ブロック全体を計算するだけであることから推測されます。アンロールされたループはおそらく実際にはスピードアップに寄与しません。この場合、I4.rows()が同じ定数になることは確かです。また、 'X'を固定サイズの行列にしてみてください。 –