希望快速并行优化Lapack常规(gfortran)问题

时间:2014-12-04 18:33:07

标签: multithreading optimization lapack blas eigenvalue

我认为直到两天前我对此有一个非常清楚的认识,但现在我可能会过度思考它并使自己感到困惑。我将解释我正在做的事情,然后提出一些可能过于简单的问题,但到目前为止我已经搜索并找到了相互矛盾的答案。当然有人可以让我直截了当。

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

现在代码完美无缺。我使用LAPACK优化的地图集安装。我特意运行常规ZGGEV(link),因为目前我需要所有特征值解和所有相关的特征向量解。

现在我正在尝试优化代码以更快地运行。我们实验室中的所有计算机都包含4个或8个核心CPU,并在Ubuntu上运行。在解决这个问题时,我可以做些什么来利用我的完整cpu?我一直在研究以下事项:

  • 我安装了一个优化的OpenBlas库,它肯定更快,但我注意到它仍然只使用1个核心(那里有一个小尖峰,它使用更多。我认为这个尖峰是并行运行的BLAS包和LAPACK仅限一个核心?)
  • 我已经调查了PLASMA,但它看起来不会解决我目前的形式。
  • 我已经查看了ScaLAPACK,但目前这已经超出了我的想法,我不确定它是否值得学习在8核CPU上使用。此外,我在我的代码的后续部分使用openmp线程,并且我从未将openmp与MPI结合使用。

最后,我有一些具体的Blas问题:

  1. Atlas附带" libptcblas"和" libptf77blas"库。这些应该是线程库,但是当我使用它们时我并没有注意到差异,实际上它运行速度稍慢(我猜是由于开销)。我需要打电话来利用这些吗?我是否有理由将这些库用于" libcblas"和" libf77blas?"
  2. 使用OpenBlas,它还构建了一个非常具体的" libopenblas_penrynp-r0.2.12。"这是线程版吗?再一次,我没有注意到运行这个blas与运行" libopenblas"。
  3. 希望有人可以清理我的一些Blas问题并指出我采用更快的解决方法。谢谢!

1 个答案:

答案 0 :(得分:1)

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

关于您的具体问题。

  1. 虽然我没有广泛使用过ATLAS库,但众所周知 “在编译时确定要使用的线程数”。 请参阅http://math-atlas.sourceforge.net/faq.html#tnum
  2. 具体的libopenblas_*.a是其中的副本或软链接 libopenblas.a。线程号在编译时再次定义。
  3. 请检查库构建中的日志文件和std.out,并验证它们是否已识别出正确数量的CPU。

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

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

    构建Openblas
    $ make DYNAMIC_ARCH=1 NUM_THREADS=8
    

    然后在您的计划中CALL ZGEMM。这个例程绝对是优化的,应该显示多线程行为。