Ich hab die Programme jetzt mal auf meinem 1.33Ghz iBook laufen lassen und kann die Probleme soweit nicht nachvollziehen ...
g++: 6m48.826s
g++ -O2: 4m13.192s
g++ -O2 -mcpu=7450 -maltivec: 4m12.432s
g95: 21m56.837s
(alle Zeiten "user" vom time-Befehl)
Damit weiß ich wirklich nicht weiter ... Sieht ja fast so aus als liefe das ganze Programm unter Rosetta...
Unter Linux mit x86 ergibt sich ein etwas ausgewogeneres Bild (4s vs. 5s).
Optimieren kann man dennoch noch ganz ordentlich. Allerdings eher im Quelltext als in der Kommandozeile. Es wird nämlich einiges doppelt berechnet.
Code:
for (n=0; n<nmax; n++) {
// Equation for the ground state
F[n] = -uc*Omega*bef[n]*v[n+nmax];
// C6 shift
tmp1 = 0.0;
for (m=0; m<nmax; m++) {
tmp1 += VV( n, m, C6, R, dx )*pow( abs( v[m+nmax] ), 2 );
}
// Equation for the Rydberg state
F[n+nmax] = -uc*(tmp1-delta)*v[n+nmax]-uc*Omega*bef[n]*v[n];
}
Mal ganz abgesehen davon, dass ich nicht wirklich Ahnung habe was da so alles passiert
, sehe ich zumindest, dass da ziemlich oft das (sehr teure) abs der selben komplexen Zahlen gebildet wird. Berechnet man sie nur einmal ...
Code:
double abs2_v[nmax];
for (int i = 0; i < nmax; i++) {
double a = abs(v[i+nmax]);
abs2_v[i] = a*a;
}
for (n=0; n<nmax; n++) {
// Equation for the ground state
F[n] = -uc*Omega*bef[n]*v[n+nmax];
// C6 shift
tmp1 = 0.0;
for (m=0; m<nmax; m++) {
tmp1 += VV( n, m, C6, R, dx )*abs2_v[m];
}
// Equation for the Rydberg state
F[n+nmax] = -uc*(tmp1-delta)*v[n+nmax]-uc*Omega*bef[n]*v[n];
}
wird's deutlich schneller.
Und pow(x, 6) schreibt man besser als (lohn allerdings auch nur, weil es sehr häufig aufgerufen wird)
Code:
double inline pow6(double base) {
double res = base * base;
return res * res * res;
}
Sowie pow(x, 2) als x * x.
Mit diesen kleinen Änderungen komme ich schon auf 0m34.244s Laufzeit.