2017-02-02 11 views
4
나는 양자 계산의 일부 수치 시뮬레이션을하고있는 중이 야

를 사용하여 HPC에 발견하고, 나는 큰 에르 미트 행렬의 고유 벡터 (~ 2^14 행/열)빠른 고유 벡터는 Qutip 및 slepc4py

나는를 찾고자 24 코어/48 스레드 Xeon 시스템에서 실행됩니다. 이 코드는 원래 Qutip 라이브러리를 사용하여 작성되었습니다. 나는 포함 된 eigenstates() 함수가 내 컴퓨터에서 단 하나의 쓰레드만을 사용하므로 더 빠른 방법을 찾으려고한다는 것을 알았다.

나는 scipy.linalg eig()eigh() 기능뿐만 아니라 scipy.sparse.linalg eig()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

Welcome to Stackoverflow! 귀하의 질문은 http://stackoverflow.com/questions/29525041/petsc4py-creating-aij-matrix-from-csc-matrix-results-in-typeerror와 유사합니다. PETSc 및 SLEPc를 다시 컴파일하고 빌드 - petsc4py와 slepc4py를 설치하십시오. 저비용의 순수 양자 상태에 관심이 있으시면, \t EPS_SMALLEST_MAGNITUDE of EPSSetWhichEigenpairs()와 EPSSetDimensions()를 EPSARNOLDI 또는 EPSLANCZOS와 같은 EPSType과 함께 사용하면됩니다. – 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의 eigensolver는 eigensolver SciPy를 이용한다. 얼마나 많은 스레드가 사용되는지는 SciPy가 링크 된 BLAS 라이브러리와 스파 스 또는 고밀도 솔버를 사용하는지 여부에 따라 다릅니다. 조밀 한 경우, 기저 BLAS가 이점을 취하는 경우 eigensolver는 다중 코어를 사용합니다 (예 : Intel MKL). 스파 스 솔버는 메모리 대역폭이 제한되어있는 대부분 스파 스 (sparse) matvec 연산을 사용하므로 단일 코어를 사용하면 가장 효율적입니다. 모든 고유치를 원하면 기본적으로 밀도가 높은 솔버를 사용합니다. 그러나, 당신이 단지 몇 개만 필요하다면, 가장 낮은 몇몇 고유 상태와 같이, 드문 드문 방법이 있습니다.

+0

안녕하세요 폴, 빠른 응답을 주셔서 감사합니다. num_show_config() 사용 blas_mkl_info : define_macros = [('HAVE_CBLAS', 없음)] library_dirs = [ '/ cs/labs/doria/oryonatan/anaconda3/envs/qutip/lib '] include_dirs = ['/ cs/labs/doria/oryonatan/아나콘다 3/envs/qutip/include '] 라이브러리 = ['mkl_intel_lp64 ','mkl_intel_thread ','mkl_core ','iomp5 ','pthread ' ] eig 함수를 사용할 때 MKL이 설치되어있는 것을 볼 수 있지만 정상적으로 하나의 스레드 만 사용되고 있다는 것을 여전히 볼 수 있습니다. 내가 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에 말하지 않은 것처럼 보입니다. 내 파이썬 코드에서 , 나는 추가 :

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은 모든 스레드를 자동으로 사용합니다. 또한 여러 대의 컴퓨터에서 작동합니다. 문제가 무엇인지 모릅니다. –