gpt4 book ai didi

Python 3 : Parallel diagonalization of multiple matrices

转载 作者:行者123 更新时间:2023-11-30 23:19:02 27 4
gpt4 key购买 nike

我正在尝试提高我的一些代码的性能,它首先根据两个索引构造一个 4x4 矩阵,对该矩阵进行对角化,然后将每个矩阵的每个对角化的特征向量存储在 4 维数组中。目前,我只是依次遍历所有索引,然后将特征向量存储在 4 维数组中的适当位置。现在,我想知道是否可以通过使用线程或类似的东西来稍微并行化,以便每个线程对一个矩阵进行对角化,然后将其存储在其位置。我遇到的问题是,我这样做有什么限制?当不同的线程想要写入生成的 4-dim 时,我会遇到问题吗?同时数组,我是否必须使用锁来防止这种情况?如果这个问题很微不足道,我很抱歉,但通过搜索我找不到任何相关的内容,而且我对线程的了解非常有限。一个最小的例子是

from numpy.linalg import eigh as eigh2
from scipy import *

spectrum = zeros([L//2,L//2,4,4],complex)
for i in range(0,L//2):
for j in range(0,L//2):
k = [-(2 * i*2*pi/L),-(2 * j*2*pi/L)]
H = ones([4,4],complex)
energies, states = eigh2(H)
spectrum[i,j,:,:] = states

请注意,为了简洁起见,我已将根据 k 构造矩阵的函数替换为某个常量矩阵。

我真的很感激任何帮助或指向我如何实现一些并行化的资源的指示。线程是提高性能的现实方法吗?

最佳答案

简短的回答是,是的,您可能需要锁 - 但如果您可以重新组织您的问题,那可能比锁定好得多。

长答案有点复杂,特别是因为我不知道你已经知道多少。

一般来说,线程在 CPython 中对于 CPU 密集型代码没有多大作用,因为 Global Interpreter Lock ,如果另一个线程正在解释 Python 的一行(实际上是字节码),它会阻止任何线程执行此操作。但是,NumPy 具有专门在某些位置释放 GIL 的代码,以允许线程更好地工作,因此,如果您在低级 NumPy 算法中受 CPU 限制,线程实际上可以 em> 工作。文档并不总是清楚哪些函数执行此操作,哪些函数不执行此操作,因此您可能必须自己进行测试,以了解并行化是否会有所帮助。 (一种快速而肮脏的方法是破解代码的一个版本,该版本只进行计算而不将它们存储在任何地方,跨 N 个线程运行它,并查看执行此操作时有多少核心忙碌。)

现在,一般来说,在 CPython 中,某些类型的操作不需要锁,包括 __setitem__在简单类型上——但那是因为相同的 GIL,所以它不会对你有帮助。如果您有多个操作都尝试写入同一个数组,则它们将需要对该数组进行锁定。

但是可能有更好的方法来解决这个问题。如果您能找到一种方法将数组分成更小的数组,并且在任何给定时间只有其中一个数组被修改,则不需要任何锁。或者,如果您可以让线程返回较小的数组,这些数组可以由单个主线程组装成最终答案,而不是首先就地工作,那么这也是可行的。

但在你这样做之前……在某些情况下,NumPy(或者更确切地说,它正在使用的库之一)已经为你自动并行化了东西,或者如果你以不同的方式构建它,也可能会这样做。或者它可能是 SIMD 向量化,实际上比线程提供了更多的加速,但最终可能会被破坏。等等。

因此,在尝试任何操作之前,请确保您拥有正确优化的 NumPy,并安装了所有可选的先决条件。然后确保它只按原样使用一个核心。然后构建一个测试脚手架,以便您可以比较不同的实现。然后,您可以尝试您能想到的每种基于锁、非共享和非变异的算法,看看并行性是否有帮助,而不是额外的东西带来的伤害。

关于Python 3 : Parallel diagonalization of multiple matrices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26308953/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com