2017-01-06 7 views
1

Unterschied Ich verwende Eigen C++ Bibliothek für lineare Algebra-Operationen.Eigen `sum()` Funktion gibt für denselben Vektor in zwei Versionen des Programms

Es gibt eine Variable v in meinem Code, der ein VectorXd Typ ist, und ich muss seine Summe berechnen, so rief ich v.sum().

Allerdings, wenn ich mein Programm auf eine neue Version aktualisiert, obwohl der Wert von v gleich bleiben (aus der gleichen Eingabedatei lesen), die sum() Funktion leicht anderen Wert geben.

hier ein Stück Code, das mein Problem erklärt:

double vsum1 = v.sum(); 
double vsum2 = 0; // compare with manually calculated sum 
for(size_t i = 0; i < v.size(); ++i) 
{ 
    vsum2 += v(i); 
} 
cout << "sum1: " << vsum1 << endl; 
cout << "sum2: " << vsum2 << endl; 

für die alte Version, ist das Ergebnis

sum1: 94.8117866666666487 
sum2: 94.8117866666666202 

für die neue Version, ist das Ergebnis

sum1: 94.8117866666666345 
sum2: 94.8117866666666202 

Die manuell berechnete Summe vsum2 bleibt unverändert, also denke ich den Ursprungsvektor v hat sich nicht geändert, warum würde dann sum() ein anderes Ergebnis ergeben? Ist es wegen einige SIMD-Optimierung von Eigen durchgeführt?

Der Unterschied ist tatsächlich neligible, aber das führt zu einem Versagen der Regression Test.

+0

Alte und neue Versionen laufen beide auf derselben Maschine? Ich nehme an, ja. – BitTickler

+0

Ja, und kompiliert mit demselben Eigen – Alaya

+3

Ja, wahrscheinlich ist das Vektorisierung oder andere Optimierungen dafür verantwortlich. Die Optimierung von Fließkomma-Operationen bedeutet normalerweise, dass die Bit-zu-Bit-Reproduzierbarkeit verbessert wird. Wenn möglich, ändern Sie Ihre Tests, um eine angemessene Toleranz zu ermöglichen. – 5gon12eder

Antwort

2

5gon12eders Kommentar ist richtig. Eigen3.3 führt AVX vctorization, falls verfügbar, durch (4 doppelt auf einmal), verglichen mit SSE nur in Eigen3.2 (2 doppelt auf einmal). In jedem Fall müssen Sie eine gewisse Toleranz beim Vergleich von Gleitkommazahlen verwenden, um Rundungsfehler zu berücksichtigen. Sie können sich von Eigens Komponententests inspirieren lassen.

Verwandte Themen