Ich verwende Eigen für ein Projekt, an dem ich arbeite, wo die Laufzeitleistung absolut entscheidend ist (muss Echtzeit-Einschränkungen erfüllen).Eigen: Effiziente Kronecker Produkt
Bisher gibt mir Eigen ziemlich gute Leistung. Ich muss jedoch ein Kronecker-Produkt bewerten. Ich verwende Eigens nicht unterstütztes KroneckerProduct-Modul, aber ich denke, dass es für meine Bedürfnisse suboptimal ist.
Die beiden Matrizen, mit denen ich das Kronecker-Produkt bearbeite, haben eine feste Größe (bekannt zur Kompilierzeit) und Struktur. Eine Matrix ist quadratisch und diagonal, nehmen wir an, dass es sich um eine Identitätsmatrix handelt. Die andere ist eine kleine, quadratische Matrix. Im Code wie folgt aus:
MatrixXf I = MatrixXf::Identity(4,4);
MatrixXf X = MatrixXf::Random(8,8);
MatrixXf P = kroneckerProduct(I,X);
Da ich diagonal, ich vermute, dass wir das schneller machen können, da wir nur durch Skalarmultiplikationen bewerten, um 4-Matrix müssen alle Elemente (da viele Willen zu berechnen sei null).
Was ist der schnellste und effizienteste Weg, dies mit Eigen zu tun?
Dies stellt tatsächlich einen angemessenen beschleunigen. Da wir auf die RowsAtCompileTime verweisen, gehe ich davon aus, dass der Compiler diese Schleife ausrollen kann? Welche Optionen sollte ich neben -march = nativ -mtune = nativ -O3 verwenden (ich benutze clang ++)? – NOP
Die Verwendung von 'RowsAtCompileTime' sollte dem Compiler helfen, die Schleife zu entrollen. Die Beschleunigung ist vermutlich darauf zurückzuführen, dass nur die Blockdiagonale und nicht das gesamte äußere Produkt berechnet wird. Die entrollte Schleife trägt wahrscheinlich nicht zur Beschleunigung bei. Ich bin mir ziemlich sicher, dass 'I4.rows()' in diesem Fall die gleiche Konstante sein würde. Versuchen Sie auch, 'X' zu einer Matrix fester Größe zu machen. –