2017-02-02 5 views
4

私は量子計算のいくつかの数値シミュレーションをやっている、と私は大きなエルミート行列(〜2^14行/列)の固有ベクトルを見つけたいQutipを使用してHPCに見つけ高速固有ベクトルとslepc4py

私は24コア/ 48スレッドXeonマシンで稼働します。コードはもともとQutipライブラリの助けを借りて書かれています。私は、付属のeigenstates()関数が自分のマシン上で1つのスレッドしか利用していないことを知ったので、より高速な方法を見つけようとしています。

私はscipy.linalgeig()eigh()機能だけでなく、scipy.sparse.linalgeig()eigh()を使用してみましたが、両方はQutipに建てられた機能よりも遅いようです。

私はslepc4pyを使用することでスピードアップが得られるかもしれないという提案を見たことがありますが、パッケージのドキュメントは非常に不足しているようです。私はnumpyの複雑な配列をSLEPC行列に変換する方法を見つけることができません。

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

ようこそStackoverflow!あなたの質問はhttp://stackoverflow.com/questions/29525041/petsc4py-creating-aij-matrix-from-csc-matrix-results-in-typeerrorに似ているようです。PETScとSLEPcを再コンパイルし、 petsc4pyとslepc4pyをインストールしてください。低エネルギーの純粋な量子状態のみに興味があるなら、EPSARMOLESTやEPSLANCZOSのようなEPSTypeと組み合わされたEPSSetWhichEigenpairs()とEPSSetDimensions()のEPS_SMALLEST_MAGNITUDEオプション\tに興味があります。 – francis

+0

ところで、[scipy.sparse.linalg.eigsh](https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.linalg.eigsh.html)も証明されるかもしれません役に立った... – francis

答えて

1

QuTiPにおける固有値はscipyのダウンロードの固有値を使用します。いくつのスレッドが使用されるかは、SciPyがリンクされているBLASライブラリと、疎なソリバを使用しているのか密なソルバを使用しているのかによって異なります。密集したケースでは、基盤となるBLASが有効な場合(例えば、インテルMKL)、固有ランバーは複数のコアを使用します。スパースソルバは、メモリ帯域幅が制限されているため、ほとんどの場合、単一のコアを使用すると効率的です。すべての固有値が必要な場合は、基本的に密なソルバを使用して固執します。しかし、ほんの少数のものしか必要ないなら、最低の固有状態のように、希薄な方法があります。

+0

こんにちは、ポール、速い応答に感謝します。 num_show_config()を使用する blas_mkl_info: define_macros = [( 'SCIPY_MKL_H'、なし)、( 'HAVE_CBLAS'、なし)] library_dirs = ['/ cs/labs/doria/oryonatan/anaconda3/envs/qutip/lib '] include_dirs = ['/cs/labs/doria/oryonatan/anaconda3/envs/qutip/include '] ライブラリ= [' mkl_intel_lp64 '、' mkl_intel_thread '、' mkl_core '、' iomp5 '、' pthread ' ] 私は、MKLがインストールされていることを確認していますが、eig関数を使用しているときに、まだ1つのスレッドしか使用されていないことがわかります。私がmatlab eig関数を使ってみると、すべてのコアが関わっていました。 – oyon

+0

自分自身に答える:qutipはmklに最大量のコアを使用するように設定されていないようです。手動でmklを24に設定すると問題が解決しました。 輸入ctypesの mkl_rt = ctypes.CDLL( 'libmkl_rt.so') mkl_rt.mkl_set_num_threads(ctypes.byref(ctypes.c_int(48))) mkl_get_max_threadsの=のmkl_rt.mkl_get_max_threadsこれは私に大きなパフォーマンスの向上を与えました。 – oyon

0

すべてのコアを使用する簡単な方法を見つけたので、qutipはmklにすべてのコアを使用するようには言わなかったようです。私のPythonコードで 、私が追加:

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))) 

これは、すべてのコアを使用するインテルMKLを強制的に、そして私の素敵なスピードアップを行いました。

(回答:question

+0

Anaconda Pythonディストリビューションを使用している場合、mklモジュールに便利な機能があります。 –

+0

私はアナコンダを使用しています。 https://docs.continuum.io/mkl-service/を参照していますか?私は 'import mkl'を試みましたが、' ImportError'を得ました – oyon

+0

ああ。いつも私のために働くように思えた。私のインストールでは、mklもすべてのスレッドを自動的に使用します。また、仕事場の複数のコンピュータでも同じことが行われます。問題の内容がわからない –

関連する問題