我有一个非常大的对角矩阵,我需要对其进行拆分以进行并行计算。由于数据局部性问题,遍历矩阵并在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)
您对实现或库功能有什么建议吗?