Parallel processing 多核系统的并行线性代数

Parallel processing 多核系统的并行线性代数,parallel-processing,linear-algebra,lapack,Parallel Processing,Linear Algebra,Lapack,我正在开发一个需要做大量线性代数计算的程序 现在我正在使用LAPACK/BLAS例程,但我需要利用我的机器(24核Xeon X5690) 我发现了像pblas和scalapack这样的项目,但它们似乎都专注于分布式计算和使用MPI 我没有可用的集群,所有的计算都将在一台服务器上完成,使用MPI看起来有点过头了 有人对此有什么建议吗?考虑使用。也可以非常快,尽管我还没有在>quadcore机器上运行它。正如@larsmans(比如说,MKL)提到的,您仍然使用LAPACK+BLAS接口,但您只找到

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

现在我正在使用LAPACK/BLAS例程,但我需要利用我的机器(24核Xeon X5690)

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

我没有可用的集群,所有的计算都将在一台服务器上完成,使用MPI看起来有点过头了

有人对此有什么建议吗?

考虑使用。也可以非常快,尽管我还没有在>quadcore机器上运行它。

正如@larsmans(比如说,MKL)提到的,您仍然使用LAPACK+BLAS接口,但您只找到了一个适合您平台的优化多线程版本。MKL很棒,但是很贵。其他开源选项包括:

  • /,Nehalem支持应该可以正常工作,但Westmile还没有经过调优的支持。多线程处理做得很好
  • :安装时自动调谐到您的体系结构。对于“典型”矩阵(例如,square SGEMM)可能较慢,但对于奇数情况可能更快,对于Westmile,甚至可能击败OpenBLAS/GotoBLAS,我自己还没有测试过这一点。主要针对串行情况进行优化,但包括并行多线程例程
  • -专门为多核设计的LAPACK实现

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

不要使用MPI注销,尤其是如果您可以找到支持MPI的库来完成繁重的工作的话。这可能比查找共享内存线性代数库或编写自己的共享内存代码更容易。一个好的MPI实现将在共享内存计算机上高效运行。我知道。我不是说我会自己写MPI代码。我只是想避免所有使用MPI的东西,因为这不是一个集群程序,我想避免任何不必要的额外警告,因为工具rec/太宽。很好的调用,但是如何使用它呢?文档显示函数的名称与LAPACK中的相同。我只需要和mkl而不是lapack blas和gfortran链接吗?(我当前的ldflag是-llapack-lblas-lgfortran)。基本上,我需要一个并行的DSTEBZ和替换DSTEIN@Patrik:MKL设计为BLAS兼容,因此只需重新编译和链接即可。我必须承认,我从来没有直接从C中使用过它,但总是通过Numpy来使用。正如@larsmans猜测的那样,从Fortran中,它是一种针对(右)库的直接链接操作。如果您遇到问题,请查看Intel link line advisor:如果您使用的是C,lapacke接口(最初在MKL中,现在在lapack中是标准的)是使用lapack的一种非常好的方式。我正在使用dlamch、dstebz、dstein、dlamch和dstebzMaybe pdstebz和pdstein是我正在寻找的函数,但它们有一个不同的接口。哪些是lwork、liwork和正交化参数?在调用dstebz和dstein时,利用多核的最佳方法是什么?我认为第一件事就是尝试使用多线程blas/lapack安装,比如openblas或gotoblas。开始使用scalapack需要做一些工作,因为核心之间的矩阵分布并不明显。好消息是,一旦您遇到使用scalapack的麻烦,它甚至可以跨节点工作。我在这里给出了一个使用scalapack的例子:所以我只需要构建openblas,链接它,我就可以得到并行特征值/特征向量计算?如果你使用多核BLAS或LAPACK包之一,你将在它们支持多线程的任何例程中得到多线程。如果您只是盘点lapack并使用线程blas,lapack例程将调用线程blas例程,这将给您一些速度,具体取决于lapack中完成的工作量以及blas调用中完成的工作量。如果这对你来说是足够的进步,你就完成了;否则,您可能必须移动到显式并行lapack,如scalapack。