Я ищу помощи, потому что, кажется, я не могу найти какие-либо решения.
Задача, которая меня интересует, состоит в диагонализации (больших) матриц, которые зависят от параметра (назовем его m
).Сначала я выполнил вычисления на своем ноутбуке Mac, используя простой цикл for
, и он по умолчанию использует все доступные ядра (4).Но сейчас я хочу сделать то же самое на моей машине с Linux (Ubuntu 18.04) с 16 ядрами, но благодаря GIL программа использует только одно ядро.
Первый вопрос: чем отличается интерпретатор Mac Python от библиотек линейной алгебры, используемых numpy / scipy, которые автоматически распараллеливаются на Mac, а не на Linux?На данный момент я не смотрел на проблему с библиотекой (LAPACK, BLAS).
Затем, используя Python multiprocessing
, у меня нет проблем с этим, но я застрял в структуре данных.Действительно, для всех этих матриц мне нужны как собственные значения, так и собственные векторы (и метка m
, но порядок входов сохраняется автоматически), но из-за структуры pool.map
(или pool.starmap
в случае нескольких аргументовКажется, я не могу найти наиболее эффективный способ сбора всего набора собственных значений и собственных векторов.
У вас есть идеи, как это сделать, или какой-нибудь хороший справочник?Я также был бы признателен за помощь по этому вопросу BLAS / LAPACK.
Заранее спасибо,
PS: см. Ниже пример наивного кода.
def Diagonalize(m):
Mat = np.array([[0, m+1],[m+1, 0]])
eigenvalues, eigenvectors = np.linalg.eigh(Mat)
return list([eigenvalues, eigenvectors]) # using list() was one of my attempts
Nprocesses = 4 # or whatever number
if __name__ == '__main__':
with Pool(processes = Nprocesses) as pool:
pool.map(Diagonalize, m_values) # EDIT m_values being whatever list