为什么我不能通过更多流程获得并行化收益?

问题描述 投票:1回答:1

我有这个简单的代码,只需在一些矩阵乘法后计算矩阵之和

def serial_decohere(K, rho, n):
"""
:param K: List of bumpy matrices of size 2^n by 2^n
:param rho: A matrix of size 2^n by 2^n
:param n: Integer
:return: A matrix of size 2^n by 2^n
"""
    out = np.zeros((pow(2, n), pow(2, n)), dtype=complex)
    for i in range(len(K)):
        out += np.dot(K[i], np.dot(rho, op.ctranspose(K[i])))
    return out

总和中的项数随着变量n呈指数增长。更具体地,列表K的长度增长为3 ^ n。所以我决定将它并行化。使用joblib我带来了这个

def decohere(K, rho, n):
"""
:param K: List of matrices of size 2^n by 2^n
:param rho: A matrix of size 2^n by 2^n
:param n: A positive integer
:return: A matrix of size 2^n by 2^n
"""
    out = np.zeros((pow(2, n), pow(2, n)), dtype=complex)
    def apply_kraus_op(kraus, rho_s):
        """
        :param rho_s : Density matrix of system rho_s
        :return: returns the density matrix 
        """
        nonlocal out
        out += np.dot(kraus, np.dot(rho_s, op.ctranspose(kraus)))

   Parallel(n_jobs=2)((delayed(apply_kraus_op))(K[i], rho) for i in range(len(K)))

return out

然后决定测试它。对于n_jobs = 1,对于大小小于32乘32的矩阵,我对第一个版本更好。但很快,第二个版本的计算时间增长得更慢,所以我最好用第二个版本。现在,当我增加到n_jobs = 2时,我总是比第一个版本慢。所以我更糟糕的是并行化for循环。为什么?我可以尝试编写代码并使用多处理模块,但我假设joblib需要更多的思考和时间,并且基本上是这样做以并行化for循环。

python parallel-processing joblib
1个回答
0
投票

在评论中,你注意到“我测试过的最大的n是7”。

您在这里使用的数据很小。即使使用n=7,您的矩阵也只有128x128 = 65536个元素。启动新的Python进程以并行运行工作的成本非常高;如此小的尺寸,在一个过程中完成所有工作的速度更快。

再试一次更大的矩阵...比如,n=12

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.