【问题标题】:Use one LU factorization in several instances of mkl_dss_solve在 mkl_dss_solve 的多个实例中使用一个 LU 分解
【发布时间】:2013-07-29 21:50:58
【问题描述】:

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

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

dss_factor_real(handle, opt, data);

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

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

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

提前感谢您的帮助

【问题讨论】:

    标签: c linear-algebra intel-mkl


    【解决方案1】:

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

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

    编辑

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

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

    【讨论】:

    • 感谢您的意见。我不做任何假设(串行或并行)。事实上,RHS 向量是异步进入队列的。每当 RHS 向量准备好时,就会使用一个空闲的工作人员(线程)来解决该特定 RHS 向量的问题。现在我确信 dss_solve_real 确实改变了句柄。如果我想锁定手柄,使用线程将没有任何理由。
    • 查看我的编辑:我仍然认为让许多线程解决 rhs 效率不高,即使您可以强制执行串行解决阶段。
    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多