我正在使用英特尔MKL库来求解具有多个右侧向量的线性方程组(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
。
提前感谢您的帮助
发布于 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向量存储在连续的存储区中。
https://stackoverflow.com/questions/17934879
复制相似问题