Bezogen auf meine other question, habe ich jetzt die Sparse Matrix Löser geändert, um die SOR (Successive Over-Relaxation) -Methode zu verwenden. Der Code ist nun wie folgt:Warum hängt die Geschwindigkeit dieses SOR-Lösers von der Eingabe ab?
void SORSolver::step() {
float const omega = 1.0f;
float const
*b = &d_b(1, 1),
*w = &d_w(1, 1), *e = &d_e(1, 1), *s = &d_s(1, 1), *n = &d_n(1, 1),
*xw = &d_x(0, 1), *xe = &d_x(2, 1), *xs = &d_x(1, 0), *xn = &d_x(1, 2);
float *xc = &d_x(1, 1);
for (size_t y = 1; y < d_ny - 1; ++y) {
for (size_t x = 1; x < d_nx - 1; ++x) {
float diff = *b
- *xc
- *e * *xe
- *s * *xs - *n * *xn
- *w * *xw;
*xc += omega * diff;
++b;
++w; ++e; ++s; ++n;
++xw; ++xe; ++xs; ++xn;
++xc;
}
b += 2;
w += 2; e += 2; s += 2; n += 2;
xw += 2; xe += 2; xs += 2; xn += 2;
xc += 2;
}
}
Nun ist die seltsame Sache ist: Wenn ich omega
(der Erholungsfaktor) zu erhöhen, beginnt die Ausführungsgeschwindigkeit dramatisch auf den Werten in den verschiedenen Arrays abhängen!
Für omega = 1.0f
ist die Ausführungszeit mehr oder weniger konstant. Für omega = 1.8
, das erste Mal, dauert es typischerweise 5 Millisekunden, um dieses step()
10 Mal auszuführen, aber dies wird während der Simulation allmählich auf fast 100 ms zunehmen. Wenn ich omega = 1.0001f
einstelle, sehe ich einen entsprechend leichten Anstieg der Ausführungszeit; Je höher der Wert omega
ist, desto schneller wird die Ausführungszeit während der Simulation erhöht.
Da all dies in den Fluidlöser eingebettet ist, ist es schwierig, ein eigenständiges Beispiel zu finden. Aber ich habe den Anfangszustand gespeichert und den Löser bei jedem Schritt erneut ausgeführt, ebenso wie für den tatsächlichen Zeitschritt. Für den Anfangszustand war es schnell, für die nachfolgenden Zeitschritte inkrementell langsamer. Da alles andere gleich ist, beweist das, dass die Ausführungsgeschwindigkeit dieses Codes von den Werten in diesen sechs Arrays abhängt.
Dies ist auf Ubuntu mit g ++, sowie auf 64-Bit-Windows 7 beim Kompilieren für 32-Bit mit VS2008 reproduzierbar.
Ich habe gehört, dass NaN und Inf-Werte für Fließkommaberechnungen langsamer sein können, aber keine NaNs oder Infs vorhanden sind. Ist es möglich, dass die Geschwindigkeit von Float-Berechnungen sonst von den Werten der Eingangszahlen abhängt?
Sind Sie sicher, dass Sie nicht einige andere Codepathen messen, die von den Werten der Berechnungen abhängen? – ebo
Wenn Sie weiterhin Leistungsprobleme haben, sollten Sie eine GPU für diese Berechnungen verwenden. GPUs sind sehr gut in der Matrixarbeit. – Mark
@ebo: Ich habe die Echtzeituhr in Linux verwendet, um genau diesen Anruf zu messen. Also ja, ich bin mir ziemlich sicher. – Thomas