如何沿着一个轴将对角矩阵分成相等数量的项目?

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

我有一个非常大的对角矩阵,我需要拆分并行计算。由于数据局部性问题,迭代矩阵并在n个线程之间分割每个第n个计算是没有意义的。目前,我按照以下方式划分k x k对角矩阵,但就计算次数而言,它产生不相等的分区(最小块计算比最大值多几倍)。

def split_matrix(k, n):
    split_points = [round(i * k / n) for i in range(n + 1)] 
    split_ranges = [(split_points[i], split_points[i + 1],) for i in range(len(split_points) - 1)]
    return split_ranges

import numpy as np
k = 100
arr = np.zeros((k,k,))
idx = 0
for i in range(k):
    for j in range(i + 1, k):
        arr[i, j] = idx
        idx += 1


def parallel_calc(array, k, si, endi):
     for i in range(si, endi):
         for j in range(k):
             # do some expensive calculations

for start_i, stop_i in split_matrix(k, cpu_cnt):
     parallel_calc(arr, k, start_i, stop_i)

您对实现或库函数有什么建议吗?

arrays numpy parallel-processing diagonal numerical-computing
2个回答
1
投票

在一侧进行了多次几何计算后,我得到了下面的分区,在每个垂直(或水平,如果有的话)分区中给出大致相同数量的矩阵点。

def offsets_for_equal_no_elems_diag_matrix(matrix_dims, num_of_partitions):
    if 2 == len(matrix_dims) and matrix_dims[0] == matrix_dims[1]:  # square
        k = matrix_dims[0]
        # equilateral right angle triangles have area of side**2/2 and from this area == 1/num_of_partitions * 1/2 * matrix_dim[0]**2 comes the below
        # the k - ... comes from the change in the axis (for the calc it is easier to start from the smallest triangle piece)
        div_points = [0, ] + [round(k * math.sqrt((i + 1)/num_of_partitions)) for i in range(num_of_partitions)]
        pairs = [(k - div_points[i + 1], k - div_points[i], ) for i in range(num_of_partitions - 1, -1, -1)]
        return pairs

0
投票

我很瘦,你应该更新你的split_matrix方法,因为它返回的分割范围少于你想要的(设置cpu_cnt=4将只返回3元组,而不是4):

def split_matrix(k, n):
    split_points = [round(i * k / n) for i in range(n+1)] 
    return [(split_points[i], split_points[i + 1],) for i in range(len(split_points) - 1)]

编辑:如果您的数据位置不是字符串,您可以尝试这样:创建一个queue任务,在其中添加要执行此计算的所有索引/条目。然后你初始化你的并行工作者(例如使用multiprocessing)让他们开始。这个工人现在从queue中挑选一个元素,计算结果,存储它(例如在另一个queue中)并继续下一个项目,依此类推。

如果这对你的数据不起作用,我认为你不能再改进了。

© www.soinside.com 2019 - 2024. All rights reserved.