Multithreading 希望快速并行优化拉帕克程序(gfortran)问题

Multithreading 希望快速并行优化拉帕克程序(gfortran)问题,multithreading,optimization,lapack,blas,eigenvalue,Multithreading,Optimization,Lapack,Blas,Eigenvalue,直到两天前,我还以为我对这一点有了非常清晰的理解,但现在我可能想得太多了,弄糊涂了。我会解释我在做什么,然后问几个可能过于简单的问题,但到目前为止,我已经找到了相互矛盾的答案。肯定有人能纠正我的错误 我已经编写了一个fortran代码,它利用LAPACK例程来解决特征值问题。我的问题是(A-LB)x=0,其中L是我的特征值,x是我的特征向量,A和B是平方、复、非对称、非厄米、非三角矩阵。A和B都是NxN,在我的代码中,N通常在1000到3000之间 现在代码工作得很好。我正在使用LAPACK的优

直到两天前,我还以为我对这一点有了非常清晰的理解,但现在我可能想得太多了,弄糊涂了。我会解释我在做什么,然后问几个可能过于简单的问题,但到目前为止,我已经找到了相互矛盾的答案。肯定有人能纠正我的错误

我已经编写了一个fortran代码,它利用LAPACK例程来解决特征值问题。我的问题是(A-LB)x=0,其中L是我的特征值,x是我的特征向量,A和B是平方、复、非对称、非厄米、非三角矩阵。A和B都是NxN,在我的代码中,N通常在1000到3000之间

现在代码工作得很好。我正在使用LAPACK的优化atlas安装。我专门运行例程ZGGEV(),因为现在我需要所有的特征值解和所有相关的特征向量解

现在,我正试图优化我的代码,使其运行得更快。我们实验室的所有计算机都包含4或8个核心CPU,并在Ubuntu上运行。在解决这个问题时,我能做些什么来利用我的全部cpu吗?我一直在研究以下方面:

  • 我安装了一个优化的OpenBlas库,速度肯定更快,但我注意到它仍然只使用1个内核(有一个小的峰值,它使用的更多。我假设这个峰值是并行运行的BLAS包,LAPACK仅限于一个内核?)
  • 我已经研究过等离子体,但它看起来并不能以现在的形式解出我的方程
  • 我研究过ScaLAPACK,但目前我还不清楚这是否值得学习在8核CPU上使用。此外,我在代码的后面部分使用openmp线程,我从未将openmp与MPI结合使用
最后,我有几个具体的Blas问题:

  • Atlas附带“libptcblas”和“libptf77blas”库。这些应该是线程库,但我在使用它们时没有注意到区别,事实上它运行得有点慢(我猜是由于开销)。我需要打电话利用这些吗?我有理由在“libcblas”和“libf77blas”上使用这些库吗
  • 使用OpenBlas,它还构建了一个非常特定的“libopenblas_penrynp-r0.2.12”。这是线程版本吗?同样,我没有注意到运行这个blas和运行“libopenblas”有什么区别

  • 希望有人能澄清我的一些Blas问题,并为我指出一个更快的解决方法。谢谢

    您认为多线程行为主要来自BLAS而不是LAPACK例程是正确的。矩阵的大小足以利用多线程环境。我不确定BLAS在ZGGEV例程中的使用范围,但它应该不仅仅是一个峰值

    关于你的具体问题

  • 尽管我没有广泛使用ATLAS图书馆,但它是众所周知的 “要使用的线程数在编译时确定”。 请参阅
  • 特定的
    libopenblas_*.a
    libopenblas.a
    。线程编号在编译时再次定义
  • 请从库构建中检查日志文件和std.out,并验证它们是否识别了正确数量的CPU

    我注意到你提到的不止一台机器。请注意,ATLAS是一个自动调整的库。因此,您必须在每台机器中重新编译库。另一方面,Openblas接受
    make
    中的
    DYNAMIC_ARCH=1
    选项。此库动态指定每台机器中的优化例程

    我对多线程测试的建议是使用

    $ make DYNAMIC_ARCH=1 NUM_THREADS=8
    

    然后在程序中调用ZGEMM。这是一个绝对优化的例程,应该显示多线程行为。

    非常感谢!我很确定我现在完全明白了。我为每台计算机分别制作了一个地图册。按照你的建议,我在ZGEMM上用Openblas做了许多测试,我肯定看到了并行加速。经过进一步检查,我确实得到了一些与ZGGEV加速,但很少。然而,Openblas的运行速度仍然比ATLAS快得多,因此这是一个优势。