2017-02-02 9 views
4

Я делаю некоторые числовые моделирования квантовых вычислений, и я хотел бы найти собственные векторы большой эрмитовой матрицы (~ 2^14 строк/столбцов)Быстрые собственные векторы нахождения на КВД с использованием Qutip и slepc4py

Я нахожусь работающих на 24-ядерном/48-канальном потоке XEON. Код был первоначально написан с помощью библиотеки Qutip. Я узнал, что включенная функция eigenstates() использует только один поток на моей машине, поэтому я пытаюсь найти более быстрый способ сделать это.

Я попытался с помощью 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 ... Если вас интересуют только квантовые состояния с низкой энергией, вас будут интересовать варианты \t EPS_SMALLEST_MAGNITUDE из EPSSetWhichEigenpairs() и EPSSetDimensions() в сочетании с EPSType, например EPSARNOLDI или EPSLANCZOS. – francis

+0

Кстати, [scipy.sparse.linalg.eigsh] (https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.linalg.eigsh.html) также может доказать полезно ... – francis

ответ

1

eigensolver в QuTiP использует SciPy eigensolver. Сколько потоков используется, зависит от библиотеки BLAS, к которой привязан SciPy, а также от того, используете ли вы разреженный или плотный решатель. В плотном случае eigensolver будет использовать несколько ядер, если базовый BLAS будет использовать преимущества (например, Intel MKL). Редкий разрешитель использует в основном разреженные операции matvec, которые ограничены пропускной способностью памяти и, таким образом, наиболее эффективны с использованием одного ядра. Если вы хотите все собственные значения, то вы в основном застреваете с использованием плотных решателей. Однако, если вам нужно только несколько. Такие, как самые низкие несколько собственных состояний, а затем разреженные - это путь.

+0

Привет, Павел, спасибо за быстрый ответ. Используя Num [y.show_config() blas_mkl_info: define_macros = [('SCIPY_MKL_H', отсутствует), ('' HAVE_CBLAS, отсутствует)] library_dirs = [ '/ CS/лаборатории/Дориа/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 ' ] Я вижу, что MKL установлен, однако при использовании функций eig я все еще вижу сверху, что используется только один поток, это нормально? когда я пытался использовать функцию Matlab eig, все ядра были задействованы. – oyon

+0

Отвечая на вопрос: похоже, что qutip не настроен на использование максимального количества ядер в mkl. вручную установив mkl на 24, проблема решена. импорт 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))) это дало мне большой прирост производительности. – 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))) 

это заставил Intel MKL использовать все ядра, и дал мне хорошее ускорение.

(ответ от question)

+0

Если вы используете дистрибутив Anaconda Python, то в модуле mkl есть удобные функции. –

+0

Я использую anaconda. вы имеете в виду https://docs.continuum.io/mkl-service/? Я попробовал 'import mkl', но получил' ImportError' – oyon

+0

Huh. Мне всегда казалось, что это работает. При моей установке mkl также автоматически использует все потоки. Также делает то же самое на нескольких компьютерах на работе. Не знаю, в чем проблема. –

 Смежные вопросы

  • Нет связанных вопросов^_^