2017-02-02 5 views
4

ich einige numerische Simulationen der Quantenberechnung mache, und ich wünsche die Eigenvektoren einer großen hermitesche Matrix (~ 2^14 Zeilen/Spalten)Schnelle Eigenvektoren auf einem HPC Suche mit Qutip und slepc4py

ich finden bin läuft auf einem 24-Core/48-Threads XEON-Rechner. Der Code wurde ursprünglich mit Hilfe der Qutip-Bibliothek geschrieben. Ich habe herausgefunden, dass die mitgelieferte eigenstates() Funktion nur einen einzigen Thread auf meiner Maschine verwendet, also versuche ich, einen schnelleren Weg zu finden, dies zu tun.

Ich versuchte scipy.linalgeig() und eigh() Funktionen sowie scipy.sparse.linalgeig() und eigh() aber beide mit scheinen langsamer als die in Qutip gebaut Funktion.

Ich habe einige Vorschläge gesehen, dass ich etwas Beschleunigung von der Verwendung von slepc4py bekommen könnte, aber die Dokumentation des Pakets scheint sehr mangelhaft. Ich kann nicht herausfinden, wie man das numpige komplexe Array in eine SLEPC-Matrix umwandelt.

A = PETSc.Mat().create() 
A[:,:] = B[:,:] 
# where B is a scipy array of complex type 
TypeError: Cannot cast array data from dtype('complex128') to dtype('float64') according to the rule 'safe' 
+0

Willkommen bei Stackoverflow! Es scheint, dass Ihre Frage ähnlich zu http://stackoverflow.com/questions/29525041/petsc4py-creating-aij-matrix-from-csc-matrix-results-in-typeerror Sie müssen PETSc und SLEPc neu kompilieren und bauen install petsc4py und slepc4py ... Wenn Sie nur von niedrigen Energien reinen Quantenzuständen interessiert sind, werden Sie von Optionen \t EPS_SMALLEST_MAGNITUDE von EPSSetWhichEigenpairs() und EPSSetDimensions() in Kombination mit EPSType wie EPSARNOLDI oder EPSLANCZOS interessiert sein. – francis

+0

Übrigens, [scipy.sparse.linalg.eigsh] (https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.linalg.eigsh.html) kann auch beweisen hilfreich ... – francis

Antwort

1

Die eigensolver in QuTiP verwendet die SciPy eigensolver. Wie viele Threads verwendet werden, hängt von der BLAS-Bibliothek ab, mit der SciPy verknüpft ist, sowie davon, ob Sie den Sparse- oder den dichten Solver verwenden. Im dichten Fall verwendet der Eigensolver mehrere Kerne, wenn das zugrundeliegende BLAS Vorteile hat (z. B. Intel MKL). Der Sparse-Löser verwendet hauptsächlich spärliche matvec-Operationen, die auf die Speicherbandbreite beschränkt sind und daher am effizientesten sind, wenn ein einziger Kern verwendet wird. Wenn Sie alle Eigenwerte wollen, dann stecken Sie im Grunde genommen mit dichteren Lösern fest. Wenn Sie jedoch nur wenige benötigen. Wie die niedrigsten Eigenzustände, dann ist spärlich der Weg zu gehen.

+0

Hallo Paul, danke für die schnelle Antwort. Mit num [y.show_config() blas_mkl_info: define_macros = [('SCIPY_MKL_H', Keine), ('HAVE_CBLAS', Keine)] library_dirs = ['/ cs/labs/doria/oryonatan/anaconda3/envs/qutip/lib '] include_dirs = ['/cs/labs/doria/oryonatan/anaconda3/envs/qutip/include '] libraries = [' mkl_intel_lp64 ',' mkl_intel_thread ',' mkl_core ',' iomp5 ',' pthread ' ] Ich sehe, dass MKL installiert ist, aber wenn ich die Eig-Funktionen verwende, sehe ich immer noch, dass nur ein Thread verwendet wird, ist das normal? Als ich versuchte, die Matlab-EIG-Funktion zu verwenden, waren alle Kerne beteiligt. – oyon

+0

Ich selbst antworten: Es scheint, als ob qutip nicht die maximale Anzahl an Kernen in mkl verwendet. manuelle Einstellung von mkl auf 24 löste das Problem. Import ctypes mkl_rt = ctypes.CDLL ('libmkl_rt.so') mkl_get_max_threads = mkl_rt.mkl_get_max_threads mkl_rt.mkl_set_num_threads (ctypes.byref (ctypes.c_int (48))) das gab mir einen großen Leistungsschub. – oyon

0

Ich fand schließlich eine einfachere Möglichkeit, alle Kerne zu verwenden, es scheint, als hätte qutip der mkl nicht gesagt, dass sie alle Kerne verwenden soll. in meinem Python-Code, fügte ich hinzu:

import ctypes 
mkl_rt = ctypes.CDLL('libmkl_rt.so') 
mkl_get_max_threads = mkl_rt.mkl_get_max_threads 
mkl_rt.mkl_set_num_threads(ctypes.byref(ctypes.c_int(48))) 

diese gezwungen Intel MKL alle Kerne zu verwenden, und gab mir einen schönen Speedup.

(Antwort von question)

+0

Wenn Sie die Anaconda Python-Distribution verwenden, gibt es im mkl-Modul Komfortfunktionen. –

+0

Ich benutze Anakonda. Beziehen Sie sich auf https://docs.continuum.io/mkl-service/? Ich habe 'import mkl' versucht, habe aber' ImportError' – oyon

+0

Huh. Es schien immer für mich zu arbeiten. Bei meiner Installation verwendet mkl auch alle Threads automatisch. Tut auch dasselbe auf mehreren Computern bei der Arbeit. Nicht sicher, was das Problem sein könnte. –

Verwandte Themen