2014-12-04 32 views
0

我以为我对此有一个非常清楚的了解,直到两天前,但现在我可能会过度思考和迷惑自己。我会解释我在做什么,然后问一些可能简单的问题,但我迄今为止搜索并发现了相互矛盾的答案。当然有人可以让我直接。希望快速平行最佳Lapack例程(gfortran)问题

我写了一个Fortran代码,利用LAPACK例程来解决特征值问题。我的问题是(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仅限于一个内核?)
  • 我调查了等离子体,但它看起来并不像它会解决我目前形式的等式。
  • 我已经研究过ScaLAPACK,但此刻此刻已经过去了,我不确定值得学习如何利用8核CPU。此外,我在代码的后面部分使用openmp线程,并且从未将openmp与MPI结合在一起。

最后,我有几个具体的问题布拉斯:

  1. 阿特拉斯自带的 “libptcblas” 和 “libptf77blas” 库。这些应该是线程库,但我使用它们时并没有注意到差别,事实上它运行速度稍慢(我猜是由于开销)。我需要打电话来利用这些电话吗?我有理由在“libcblas”和“libf77blas?”上使用这些库吗?
  2. 在OpenBlas中,它还构建了一个非常具体的“libopenblas_penrynp-r0.2.12”。这是线程版本吗?再次,我没有注意到运行这个blas与运行“libopenblas”有什么区别。

希望有人可以清除我的一些布拉斯问题,并指出我朝着更快的解决方法。谢谢!

回答

1

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

关于您的具体问题。

  1. 虽然我没有用ATLAS库广泛,它被称为 说:“要使用的线程数是在编译时确定”。 请参考http://math-atlas.sourceforge.net/faq.html#tnum
  2. 具体的libopenblas_*.alibopenblas.a的复制或软链接。线程号在编译时再次定义。

请检查库构建中的日志文件和std.out,并确认它们已识别出正确数量的CPU。

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

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

$ make DYNAMIC_ARCH=1 NUM_THREADS=8 

然后CALL ZGEMM打造Openblas。这是绝对的优化,应该显示多线程行为。

+0

非常感谢!我很确定我现在完全明白了。我为每台电脑建立了一个单独的ATLAS。根据你的建议,我在ZGEMM上用Openblas做了一些测试,我确实看到了并行加速。经过进一步检查,我确实得到了ZGGEV的一些加速,但很少。然而,Openblas的运行速度仍然比ATLAS快得多,所以这是一个优点。 – 2014-12-05 07:35:51