首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在多个mkl_dss_solve实例中使用一个LU分解

在多个mkl_dss_solve实例中使用一个LU分解
EN

Stack Overflow用户
提问于 2013-07-30 05:50:59
回答 1查看 538关注 0票数 2

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

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

代码语言:javascript
代码运行次数:0
运行
复制
dss_factor_real(handle, opt, data);

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

代码语言:javascript
代码运行次数:0
运行
复制
dss_solve_real(handle, opt, rhs, nRhs, sol);

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

提前感谢您的帮助

EN

回答 1

Stack Overflow用户

发布于 2013-07-31 05:42:16

就我对决策支持系统接口的理解而言,handle不仅包含逻辑单元分解,还包含在dss_solve_real中使用和修改的其他数据结构;这是设计好的,因此您应该使用锁定机制,以避免多个线程在同一个handle上并发调用dss_solve_real

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

编辑

放弃DSS接口并直接调用pardiso,应该可以让多个线程分别串行地解决单个rhs。(不容易,但如果仔细编程,应该是可能的……)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17934879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档