2

我正在使用英特尔 MKL 库来求解(A*x = b)具有多个右侧 (rhs) 向量的线性方程组。rhs 向量是通过单独的程序异步生成的,因此不可能一次解决所有问题。

为了加快程序速度,使用了多线程程序,其中每个线程负责求解单个 rhs 向量。由于矩阵A总是恒定的,LU 分解应该执行一次,然后在所有线程中使用这些因子。所以,我考虑A使用以下命令

dss_factor_real(handle, opt, data);

并使用以下命令将句柄传递给线程以解决问题:

dss_solve_real(handle, opt, rhs, nRhs, sol);

但是,我发现handle在多个dss_solve_real. 显然,出于某种原因,MKL 库在每个创建竞争条件的实例中更改句柄。我阅读了 MKL 手册,但找不到任何相关内容。由于对每个线程进行因式分解是不合逻辑的A,我想知道是否有任何方法可以克服这个问题并在handle任何地方使用相同的方法。

在此先感谢您的帮助

4

1 回答 1

1

据我了解的DSS接口,handle不仅包含LU分解,还包含其他数据结构,在中使用和修改dss_solve_real;这是设计使然,因此您应该使用锁定机制来避免多个线程dss_solve_real同时调用同一个handle.

此外,您的串行假设dss_solve_real(否则我不明白您为什么要同时调用它的多个实例)可能是错误的。DSS 是 PARDISO 求解器的接口,它在所有阶段都应该是并行的,而不仅仅是因式分解。

编辑

放弃DSS接口,直接调用pardiso,应该可以有很多线程依次解决一个rhs。(不容易,但仔细编程应该是可能的......)

然而,从最大吞吐量(每单位时间解决的 rhs)而不是最小延迟(开始解决单个 rhs 之前的时间)的角度来看,我认为最好的方法是拥有一个解决所有 rhs 的工作线程通过一次调用并行求解器在队列中等待。当然,应该组织队列,以便将 rhs 向量存储在连续的内存区域中。

于 2013-07-30T21:42:15.667 回答