Ich habe CG in FORTRAN implementiert, indem ich es mit Intel MKL verknüpft habe.
Wenn es Aussagen gibt wie: ( Siehe Wikipedia )
p=r;
x=x+alpha*p
r=r-alpha*Ap;
oder ähnliche in QMR (in viel größerer Menge)
v_tld = r;
y = v_tld;
rho = norm( y );
w_tld = r;
z = w_tld;
xi = norm( z ); (and more)
Ist es sinnvoll, BLAS Level 1-Implementierungen wie DAXPY, DCOPY, DSCAL zu verwenden? Die Motivation für meine Frage ist:
Ich habe 2 Implementierungen der Algorithmen. Eine, bei der ich nur Normen und MatVecs mit MKL verknüpft habe; Das Kopieren, Skalieren und Hinzufügen erfolgt über Fortrans intrinsische Funktionen und eine andere, bei der jede mögliche Unterroutine von BLAS ausgeführt wird.
Ich war der Meinung, dass nichts schneller werden kann als BLAS. Es stellte sich jedoch heraus, dass mein Code mit Fortrans intrinsischen Funktionen 100% schneller lief als einer mit BLAS Level 1-Subroutinen (FWIW, dies war kein kleines Problem, sondern löste ein dichtes System der Größe 13k x 13k, das meine 4 füllte GB RAM). Ich habe beide auf 2 Threads (auf einem 2-Core-Rechner)
ifort QMR.f90 -mkl
mit ausgeführtMKL_DYNAMIC=TRUE
Ich hatte eine SO-Frage zur Erweiterung von BLAS gestellt, aber als ich versuchte, BLAS Level 1 in meinen Code aufzunehmen, wurde mein Code immer langsamer.
Mache ich etwas falsch oder wird das erwartet?
Ist es auch sinnvoll, BLAS zu erweitern, um nicht offensichtliche Operationen wie y = 2.89*x
by DCOPY(n,2.89*x,1,y,1) or even DSCAL then DCOPY
auszuführen?
Was auch interessant ist, DDOT
und die DNRM2
Leistung zu verbessern. Ich schrieb es der Tatsache zu, dass es hilfreich sein könnte, sie parallel zu schalten, da sie Multiplikationen mit doppelter Genauigkeit ausführen.
Zusatzfrage: Wann entscheiden Sie, ob eine BLAS Level 1-Operation tatsächlich die Leistung verbessern wird?
Hinzufügen: Derzeit läuft auf einem i3 2,13-GHz-Laptop mit 4 GB RAM und Debian 64-Bit- Proc-Informationen hier . Aber ich bekomme ähnliche Antworten auf einer Intel Xeon 12 Core Workstation mit 24 GB RAM.