多核系统的并行线性代数

12

我正在开发一个需要进行大量线性代数计算的程序。

目前我正在使用 LAPACK/BLAS 程序,但我需要充分利用我的机器(24核 Xeon X5690)。

我已经找到了像pblasscalapack这样的项目,但它们似乎都专注于分布式计算和使用MPI。

我没有可用的集群,所有计算将在单个服务器上完成,并且使用MPI看起来有些过度。

有人有什么建议吗?


3
不要放弃使用 MPI,特别是如果你能找到支持 MPI 的库来完成你的重负载任务。这可能比寻找共享内存线性代数库或编写自己的共享内存代码更容易。一个好的 MPI 实现会在共享内存计算机上高效运行。 - High Performance Mark
我知道。我的意思不是说我会自己编写 MPI 代码。我只是想要避免使用 MPI 的一切,因为这不是一个集群程序,我想避免任何不必要的开销。 - Patrik
投票关闭,原因是工具推荐或者过于宽泛。 - Ciro Santilli OurBigBook.com
2个回答

10

如@larsmans所述(例如,使用MKL),您仍然使用LAPACK + BLAS接口,但是您只需要为平台找到一个经过调整和多线程处理的版本即可。MKL非常好,但昂贵。其他开源选择包括:

  • OpenBLAS/ GotoBLAS,Nehalem支持应该可以正常工作,但尚未针对westmere进行调整。其多线程能力非常强。
  • Atlas:安装时可自动为您的架构进行优化。对于“典型”矩阵(例如方形SGEMM),速度可能较慢,但对于奇怪的情况,甚至对于westmere可能会超越OpenBLAS/GotoBLAS,我没有测试过。主要针对串行情况进行了优化,但也包括并行多线程例程。
  • Plasma-专为多核心设计的LAPACK实现。

我还同意Mark的评论;根据您使用的LAPACK例程,MPI的分布式内存处理实际上可能比多线程更快。对于BLAS例程这不太可能是个问题,但对于更复杂的东西(例如LAPACK中的特征值/向量例程),测试一下是值得的。虽然MPI函数调用是开销,但以分布式内存模式进行操作意味着您不必过多担心假共享、同步访问共享变量等问题。


我正在使用 dlamch、dstebz、dstein、dlamch 和 dstebz。 - Patrik
也许pdstebz和pdstein是我正在寻找的函数,但它们有不同的接口。那些lwork、liwork和正交化参数是什么?在调用dstebz和dstein时利用多个核心的最佳方法是什么? - Patrik
我认为首先要做的是尝试使用多线程blas/lapack安装,比如openblas或gotoblas。开始使用scalapack需要一些努力,因为矩阵在核之间的分布并不明显。好消息是,一旦你费心使用了scalapack,它甚至可以跨节点工作。我在这里给出了一个使用scalapack的例子:http://scicomp.stackexchange.com/questions/1688/how-do-i-use-scalapack-pblas-for-matrix-vector-multiplication/1713#1713 - Jonathan Dursi
那么我只需要构建OpenBLAS,链接它,就可以得到并行特征值/特征向量计算了吗? - Patrik
如果您使用多核BLAS或LAPACK软件包之一,则会在它们支持多线程的任何例程中获得多线程。 如果您只是采用标准lapack并使用线程化blas,则lapack例程将调用线程化blas例程,这将根据lapack中完成的工作量和blas调用中完成的工作量而给您带来一些加速。 如果这对您来说已经足够了,那么您就完成了; 否则,您可能需要转向显式并行lapack,例如scalapack。 - Jonathan Dursi
我尝试了三次运行,并对其进行了分析,一次使用lapack-atlas,一次使用mkl,还有一次使用openblas。结果表明,所有测试的执行时间都大致相同。 所以,要么它们都已经使用更多的核心,要么由dstebz解决的特征值问题不太并行。 Mah - Patrik

2
考虑使用Intel MKLOpenBLAS也可以非常快,尽管我还没有在大于四核的机器上运行过它。

不错的想法,但是该如何使用呢?文档显示函数名称与LAPACK中相同。我只需要链接到mkl而不是lapack blas和gfortran吗?(我的当前ldflags为-llapack -lblas -lgfortran)。基本上,我需要一个并行替代DSTEBZ和DSTEIN。 - Patrik
@Patrik:MKL 的设计目标是兼容 BLAS,因此仅重新编译和链接 应该 可行。我必须承认我从未直接使用它,在 Numpy 中使用它。 - Fred Foo
2
从Fortran来看,正如@larsmans所猜测的那样,这是一个直截了当的操作,只需链接正确的库即可。如果您遇到问题,请查看英特尔链接行顾问:http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/。 - High Performance Mark
1
如果您正在使用C语言,lapacke接口(最初在MKL中,现在已成为lapack的标准)是使用lapack的非常好的方式。 - Jonathan Dursi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接