2016-07-25 6 views
2

Ich implementierte das Gaussian-Elimination-Verfahren über GF (2). Ich benutzte ein zweidimensionales 64-Bit-Integer-Array, um die Matrix in einer Reihe-Haupt-Darstellung zu speichern (Zeilen der Matrix werden in einem zusammenhängenden Array gespeichert). I implementiert, um die Gaußsche Eliminations auf den Zeilen der Matrix in der folgenden Weise:Loop Splitting Performance Problem

enter image description here

wobei (A)^i die i-te Zeile von A. bezeichnet I realisiert dann, dass, wenn i Splitt die Schleife an 5-6 Zeilen wie folgt erhalte ich eine etwas bessere Leistung:

enter image description here

ich würde erwarten, etwas schlechter Leistung zu bekommen, weil ich bin die ganze äußere Schleife wieder Iterieren ... hat jemand dafür eine Erklärung Verhalten? Trifft der Compiler einige knifflige Optimierungen, ist das bei der geteilten Variante einfacher? (Kompiliert mit g ++ O3)

(Wenn Pseudo-Code nicht auf die Antwort führt, i ein minimales Beispiel-Code zur Verfügung stellen kann)

+0

Was ist Ihre Testsuite (Matrizen, ihre Größen)? Was ist ihre interne Repräsentation, Zeile oder Spalte? – Dutow

+0

Matrizen für Testfälle sind zwischen 64 <= n <= 1000 und wie erwähnt, verwende ich Zeile Hauptrepräsentation – Memphisd

+2

Ein minimales Beispiel für Code wäre in der Tat hilfreich. –

Antwort

2

Es gibt keinen Grund schlechter Leistung aus Ihrem zweiten Lösung zu erwarten - beide Algorithmen sind in O(n^3) haben sie sogar die gleiche Konstante: in der ersten Lösung ist Ihre äußere Schleife in O(n^3), in der zweiten haben Sie zwei Schleifen in O(\frac{n^3}{2}).

In der Praxis hat Ihre zweite Lösung möglicherweise bessere CPU-Caching-Eigenschaften oder ist besser für die Compileroptimierung geeignet. Insbesondere, da Ihre Operationen über GF (2)/Z (2) sind, können sie als binäre Operationen über Wörter ausgedrückt werden - was zu einer großen Beschleunigung führen würde. Abhängig von Ihrer Implementierung (und den Einschränkungen für n) kann der Algorithmus am Ende auf O(n^2) optimiert werden. Wir können es nicht wirklich sagen, ohne einen Blick auf Ihren Code zu werfen, obwohl :).