希望快速并行最优拉帕克例程 (gfortran) 问题



直到两天前,我都以为我已经非常清楚地了解了这一点,但现在我可能想多了,让自己感到困惑。我将解释我在做什么,然后问几个可能很简单的问题,但到目前为止,我已经搜索并找到了相互矛盾的答案。肯定有人可以纠正我。

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

现在代码运行良好。我正在使用带有 LAPACK 的优化图集安装。我专门运行例程 ZGGEV(链接(,因为目前我需要所有特征值解决方案和所有相关的特征向量解决方案。

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

  • 我安装了一个优化的 OpenBlas 库,它肯定更快,但我注意到它仍然只使用 1 个内核(有一个小峰值,它使用更多。我假设这个峰值是并行运行的 BLAS 包,而 LAPACK 仅限于一个内核?
  • 我已经研究了PLASMA,但它看起来不会以目前的形式解决我的方程。
  • 我已经研究了 ScaLAPACK,但目前这超出了我的头脑,我不确定是否值得学习在 8 核 CPU 上使用。此外,我在代码的后面部分使用 openmp 线程,并且我从未将 openmp 与 MPI 结合使用。

最后,我有几个具体的 Blas 问题:

    Atlas带有">
  1. libptcblas"和"libptf77blas"库。这些应该是线程库,但是当我使用它们时我没有注意到差异,实际上它运行得有点慢(我猜是由于开销(。我需要打电话才能使用这些吗?我有理由使用这些库而不是"libcblas"和"libf77blas"吗?
  2. 通过OpenBlas,它还构建了一个非常具体的"libopenblas_penrynp-r0.2.12"。这是线程版本吗?同样,我没有注意到运行这个blas和运行"libopenblas"有任何区别。

希望有人可以澄清我的一些 Blas 问题,并为我指出一种更快的解决方案。谢谢!

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

关于您的具体问题。

  1. 尽管我没有广泛使用ATLAS库,但众所周知"要使用的线程数在编译时确定"。请参阅 http://math-atlas.sourceforge.net/faq.html#tnum。
  2. 特定libopenblas_*.alibopenblas.a .线程编号在编译时再次定义。

请检查库构建中的日志文件和 std.out,并验证它们是否标识了正确的 CPU 数量。

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

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

$ make DYNAMIC_ARCH=1 NUM_THREADS=8

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

最新更新