如何在matlab中快速将矩阵传递给并行工作者?

计算科学 线性代数 matlab 并行计算 格瑞斯
2021-11-30 02:54:10

我正在尝试在 matlab 中并行解决许多不同的线性系统。问题是,每个线性系统都有完全不同的部分并且相当大,因此将信息传递给每个工作人员所花费的时间比正常解决每个工作人员所花费的时间要长得多。

我当前的设置非常粗糙,我预先计算每个矩阵、右侧和预条件器的单元格,然后使用 GMRES 求解。我还使用函数句柄来评估预处理器反解。

本质上

parfor i=1:N
X{i} = gmres(A{i}, b{i}, maxit, tol, @(x) mfun(x,M{i}))
end

矩阵都是稀疏的,内存不是问题。我应该如何加快速度?

1个回答

似乎您有个需要求解的线性方程组。假设您有个内核和无限的内存。现在,您有两个选择:NP

  1. 您可以尝试并行求解个系统,而每个系统使用 1 个内核求解。P
  2. 您可以使用个核心解决一个系统,一个接一个地解决所有个系统。PN

选择将取决于许多因素:使用的计算机体系结构、内存的数量和带宽、内存位置、系统的大小、选择的求解程序。

我假设,您的一些性能问题来自:

  • 内存局部性问题。一次解决多个系统的必要性使得很难将所需的数据放入缓存中;因此,增加缓存未命中惩罚。
  • 虽然parfor应该动态分配任务,但您仍然受到最慢的工作人员的限制。例如,假设您需要求解个系统,并且您有可用内核(假设每个系统需要完全相同的时间来求解)。N_2花费完全相同的时间。N1=5N2=8P=4N1N2
  • Matlab 决定使用这种“有点出乎意料”的并行化模式的工作人员太多。

建议:

  • 尝试方法 2,使用所有内核一次仅解决一个系统。确保它是并行解决的。maxNumCompThreads应该为您提供 Matlab 可用的 # 个线程。
  • 尝试方法 1 并确保您没有使用超线程,以便工作人员的数量等于或少于您机器上的物理内核数量。

如果每个系统的规模足够大,则首选使用线程一次解决一个系统的第二种方法。但是,我可以看到,对于大量相对较小的系统,方法 1(您正在使用的系统)可能会提供更多好处。P